The spec described 573 operations with a schema each and almost nothing a
reader could copy: 12 operations carried an example, and no operation described
a query parameter at all, because a Flask handler's query string is invisible to
url_map. A route whose real interface is ?code= documented nothing.
Both are now derived from evidence rather than written by hand.
QUERY PARAMETERS come from each view's AST - request.args.get, the subscript
form, getlist, and this repo's own helpers - and a read that does not resolve to
a literal name is not emitted. 0 to 87 operations, 350 parameter objects. The
enumerations some handlers validate (sort=assetnumber|hostname) are deliberately
NOT published: deriving the accepted set reliably needs more than a literal
read, and a wrong enum is exactly the invented contract this work avoids.
EXAMPLES are harvested from the test suite, which already sends real bodies and
asserts real responses, so they are transcripts rather than inventions. 12 to
about 324. The harvest is re-runnable and optional; generation works without it.
THE HARVEST PUBLISHED TWO REAL CREDENTIALS, and that is the important part of
this commit. A bootstrap token and a kiosk setup code reached docs/openapi.json
inside URL values - a file served at /api/docs on production and copied to a
wiki. Neither scrubber layer could see them: the keys are 'scripturl' and 'url',
which name no secret, and the opaque-value rule excludes ':' and '/' on purpose
so that example URLs survive. Nothing was committed.
Four changes came out of it:
- a URL-credential rule that scrubs the parameter VALUE and keeps the URL, so
?t= is redacted and ?page=2&perpage=50 still reads as an example
- redaction runs on the way OUT as well as on the way in. Harvested examples
live in the inventory and a refresh preserves them, so a scrubber fixed after
a harvest protects only future harvests while the stored copy keeps
publishing. The published file can no longer carry a secret the current rules
would catch, whatever the inventory holds
- the leak gate now holds its own patterns instead of importing the generator's.
Checked with the scrubber's own rules it could only ever assert that redact()
ran, and it was green while both tokens sat in the file. It now knows the
product's token prefixes, a URL-credential shape, and a crude entropy
backstop. Replanting the exact credential that shipped fails it
- a DELETE only declares a body when the HANDLER reads one, derived from its
AST. A transcript proves the client sent something: the suite posts {} to
routes that ignore it, and that published "this route reads a JSON body" on
DELETE /api/endpoints/agentkey, whose handler never calls get_json.
249 operations still carry no example, because no test exercises them with a
JSON body. The honest fix is a test, not a hand-written example, and the next
harvest picks each one up for free.
15838 lines
466 KiB
JSON
15838 lines
466 KiB
JSON
[
|
|
{
|
|
"surface": "core-apitokens",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/apitokens",
|
|
"auth": "jwt",
|
|
"params": "not documented",
|
|
"purpose": "List the caller's own tokens. Admins may pass ?all=true for everyone's.",
|
|
"example": "curl http://localhost:5001/api/apitokens -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "all",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "false"
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"displayprefix": "<redacted:secret>",
|
|
"expiresat": null,
|
|
"isactive": true,
|
|
"isexpired": false,
|
|
"lastusedat": null,
|
|
"name": "member token",
|
|
"resourcescopes": null,
|
|
"scopes": null,
|
|
"tokenid": 2,
|
|
"tokenprefix": "<redacted:secret>",
|
|
"userid": 2,
|
|
"username": "<redacted:person>"
|
|
},
|
|
{
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"displayprefix": "<redacted:secret>",
|
|
"expiresat": null,
|
|
"isactive": true,
|
|
"isexpired": false,
|
|
"lastusedat": null,
|
|
"name": "admin token",
|
|
"resourcescopes": null,
|
|
"scopes": null,
|
|
"tokenid": 1,
|
|
"tokenprefix": "<redacted:secret>",
|
|
"userid": 1,
|
|
"username": "<redacted:person>"
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/apitokens",
|
|
"auth": "permission:apitokens.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a token for the caller. Returns the full secret ONCE.",
|
|
"example": "curl -X POST http://localhost:5001/api/apitokens -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"name": "display svc",
|
|
"resourcescopes": [
|
|
"gea-shopfloor-display"
|
|
],
|
|
"scopes": [
|
|
"geenforce.fetch"
|
|
]
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"displayprefix": "<redacted:secret>",
|
|
"expiresat": null,
|
|
"isactive": true,
|
|
"isexpired": false,
|
|
"lastusedat": null,
|
|
"name": "display svc",
|
|
"resourcescopes": [
|
|
"gea-shopfloor-display"
|
|
],
|
|
"scopes": [
|
|
"geenforce.fetch"
|
|
],
|
|
"secret": "<redacted:secret>",
|
|
"tokenid": 1,
|
|
"tokenprefix": "<redacted:secret>",
|
|
"userid": 1,
|
|
"warning": "Save this token now. It will not be shown again. Store it somewhere safe."
|
|
},
|
|
"message": "Token created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/apitokens/<int:tokenid>",
|
|
"auth": "permission:apitokens.create",
|
|
"params": "path: tokenid (int)",
|
|
"purpose": "Revoke (deactivate) a token. Own token, or any if admin.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/apitokens/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"message": "Token revoked",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/apitokens/<int:tokenid>",
|
|
"auth": "permission:apitokens.create",
|
|
"params": "path: tokenid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Rename, rescope, or deactivate a token. Own token, or any if admin.",
|
|
"example": "curl -X PUT http://localhost:5001/api/apitokens/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"scopes": [
|
|
"applications.edit"
|
|
]
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"displayprefix": "<redacted:secret>",
|
|
"expiresat": null,
|
|
"isactive": true,
|
|
"isexpired": false,
|
|
"lastusedat": null,
|
|
"name": "test token",
|
|
"resourcescopes": null,
|
|
"scopes": [
|
|
"applications.edit"
|
|
],
|
|
"tokenid": 1,
|
|
"tokenprefix": "<redacted:secret>",
|
|
"userid": 1
|
|
},
|
|
"message": "Token updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-applications",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/applications",
|
|
"auth": "permission:applications.view",
|
|
"params": "not documented",
|
|
"purpose": "List all applications.",
|
|
"example": "curl http://localhost:5001/api/applications -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "appname",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "installable",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "showhidden",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "false"
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/applications",
|
|
"auth": "permission:applications.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new application.",
|
|
"example": "curl -X POST http://localhost:5001/api/applications -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"appname": "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/<int:app_id>",
|
|
"auth": "permission:applications.delete",
|
|
"params": "path: app_id (int)",
|
|
"purpose": "Permanently delete an application, its versions, and its uploads.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/applications/1 -H \"Authorization: Bearer $TOK\"",
|
|
"requestexample": {
|
|
"confirm": "OK"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"deactivatedpolicies": [
|
|
"Required app: Doomed",
|
|
"Hand made push"
|
|
],
|
|
"policyresult": "kept"
|
|
},
|
|
"message": "Application deleted; deactivated 2 policy(ies) that referenced it: Required app: Doomed, Hand made push",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/applications/<int:app_id>",
|
|
"auth": "permission:applications.view",
|
|
"params": "path: app_id (int)",
|
|
"purpose": "Get a single application with details.",
|
|
"example": "curl http://localhost:5001/api/applications/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"appdescription": null,
|
|
"appid": 1,
|
|
"applicationlink": null,
|
|
"applicationnotes": null,
|
|
"appname": "TeamApp",
|
|
"contacts": [
|
|
{
|
|
"name": "Alice",
|
|
"sso": "a01"
|
|
}
|
|
],
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"documentationpath": null,
|
|
"image": null,
|
|
"installedcount": 0,
|
|
"installersha256": null,
|
|
"installpath": null,
|
|
"isactive": true,
|
|
"ishidden": false,
|
|
"isinstallable": false,
|
|
"islicenced": false,
|
|
"ismonitorable": false,
|
|
"isprinter": false,
|
|
"isrequired": false,
|
|
"knowledgebase": [],
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"monitorlaunchpath": null,
|
|
"monitorprocessname": null,
|
|
"supportteamid": 1,
|
|
"supportteamname": "Controls",
|
|
"teamurl": "https://sn.example/controls",
|
|
"versions": []
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/applications/<int:app_id>",
|
|
"auth": "permission:applications.edit",
|
|
"params": "path: app_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update an application.",
|
|
"example": "curl -X PUT http://localhost:5001/api/applications/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"ismonitorable": false,
|
|
"monitorlaunchpath": "",
|
|
"monitorprocessname": ""
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"appdescription": null,
|
|
"appid": 1,
|
|
"applicationlink": null,
|
|
"applicationnotes": null,
|
|
"appname": "Test App",
|
|
"contacts": [],
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"documentationpath": null,
|
|
"image": null,
|
|
"installersha256": null,
|
|
"installpath": null,
|
|
"isactive": true,
|
|
"ishidden": false,
|
|
"isinstallable": false,
|
|
"islicenced": false,
|
|
"ismonitorable": false,
|
|
"isprinter": false,
|
|
"isrequired": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"monitorlaunchpath": null,
|
|
"monitorprocessname": null,
|
|
"policynote": "A configuration policy was created for this application, but it is not attached to any business policy and installs nothing until an admin adds it to one.",
|
|
"policyresult": "created",
|
|
"supportteamid": null,
|
|
"supportteamname": null,
|
|
"teamurl": null
|
|
},
|
|
"message": "Application updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/applications/<int:app_id>/image",
|
|
"auth": "permission:applications.edit",
|
|
"params": "path: app_id (int)",
|
|
"purpose": "Remove an application's image and clear the field.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/applications/1/image -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/applications/<int:app_id>/image",
|
|
"auth": "permission:applications.edit",
|
|
"params": "path: app_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Upload (or replace) an application's image.",
|
|
"example": "curl -X POST http://localhost:5001/api/applications/1/image -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"appdescription": null,
|
|
"appid": 1,
|
|
"applicationlink": null,
|
|
"applicationnotes": null,
|
|
"appname": "Test App",
|
|
"contacts": [],
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"documentationpath": null,
|
|
"image": "/api/applications/image/application-1.png",
|
|
"installersha256": null,
|
|
"installpath": null,
|
|
"isactive": true,
|
|
"ishidden": false,
|
|
"isinstallable": false,
|
|
"islicenced": false,
|
|
"ismonitorable": false,
|
|
"isprinter": false,
|
|
"isrequired": false,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"monitorlaunchpath": null,
|
|
"monitorprocessname": null,
|
|
"supportteamid": null,
|
|
"supportteamname": null,
|
|
"teamurl": null
|
|
},
|
|
"message": "Application image uploaded",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/applications/<int:app_id>/installed",
|
|
"auth": "permission:applications.view",
|
|
"params": "path: app_id (int)",
|
|
"purpose": "List all computers that have this application installed.",
|
|
"example": "curl http://localhost:5001/api/applications/1/installed -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/applications/<int:app_id>/package",
|
|
"auth": "permission:applications.edit",
|
|
"params": "path: app_id (int)",
|
|
"purpose": "Remove an uploaded installer and clear the path it set.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/applications/1/package -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"appdescription": null,
|
|
"appid": 1,
|
|
"applicationlink": null,
|
|
"applicationnotes": null,
|
|
"appname": "Test App",
|
|
"contacts": [],
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"documentationpath": null,
|
|
"image": null,
|
|
"installersha256": null,
|
|
"installpath": "<redacted:sharepath>",
|
|
"isactive": true,
|
|
"ishidden": false,
|
|
"isinstallable": false,
|
|
"islicenced": false,
|
|
"ismonitorable": false,
|
|
"isprinter": false,
|
|
"isrequired": false,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"monitorlaunchpath": null,
|
|
"monitorprocessname": null,
|
|
"supportteamid": null,
|
|
"supportteamname": null,
|
|
"teamurl": null
|
|
},
|
|
"message": "Installer removed",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/applications/<int:app_id>/package",
|
|
"auth": "permission:applications.edit",
|
|
"params": "path: app_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Upload (or replace) the installer for an application.",
|
|
"example": "curl -X POST http://localhost:5001/api/applications/1/package -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"appdescription": null,
|
|
"appid": 1,
|
|
"applicationlink": null,
|
|
"applicationnotes": null,
|
|
"appname": "Test App",
|
|
"appversionid": null,
|
|
"bytes": 130,
|
|
"contacts": [],
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"detectedversion": "<redacted:address>",
|
|
"documentationpath": null,
|
|
"image": null,
|
|
"installersha256": "<redacted:digest>",
|
|
"installpath": "/api/applications/package/1/setup.exe",
|
|
"isactive": true,
|
|
"ishidden": false,
|
|
"isinstallable": false,
|
|
"islicenced": false,
|
|
"ismonitorable": false,
|
|
"isprinter": false,
|
|
"isrequired": false,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"monitorlaunchpath": null,
|
|
"monitorprocessname": null,
|
|
"sha256": "<redacted:digest>",
|
|
"supportteamid": null,
|
|
"supportteamname": null,
|
|
"teamurl": null,
|
|
"uploadedfilename": "setup.exe"
|
|
},
|
|
"message": "Installer uploaded",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/applications/<int:app_id>/revert",
|
|
"auth": "permission:applications.edit",
|
|
"params": "path: app_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Strip an application back to a catalogue record.",
|
|
"example": "curl -X POST http://localhost:5001/api/applications/1/revert -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"confirm": "OK"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"appdescription": null,
|
|
"appid": 1,
|
|
"applicationlink": null,
|
|
"applicationnotes": null,
|
|
"appname": "Test App",
|
|
"contacts": [],
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"documentationpath": null,
|
|
"image": "/api/applications/image/application-1.png",
|
|
"installersha256": null,
|
|
"installpath": null,
|
|
"isactive": true,
|
|
"ishidden": false,
|
|
"isinstallable": false,
|
|
"islicenced": false,
|
|
"ismonitorable": false,
|
|
"isprinter": false,
|
|
"isrequired": false,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"monitorlaunchpath": null,
|
|
"monitorprocessname": null,
|
|
"supportteamid": null,
|
|
"supportteamname": null,
|
|
"teamurl": null
|
|
},
|
|
"message": "Application reverted to record",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/applications/<int:app_id>/versions",
|
|
"auth": "permission:applications.view",
|
|
"params": "path: app_id (int)",
|
|
"purpose": "List all versions for an application.",
|
|
"example": "curl http://localhost:5001/api/applications/1/versions -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/applications/<int:app_id>/versions",
|
|
"auth": "permission:applications.create",
|
|
"params": "path: app_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new version for an application.",
|
|
"example": "curl -X POST http://localhost:5001/api/applications/1/versions -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"sha256": "<redacted:digest>",
|
|
"silentargs": "/S /v/qn",
|
|
"version": "1.2.3"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"appid": 1,
|
|
"appversionid": 1,
|
|
"dateadded": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"notes": null,
|
|
"releasedate": null,
|
|
"sha256": "<redacted:digest>",
|
|
"silentargs": "/S /v/qn",
|
|
"version": "1.2.3"
|
|
},
|
|
"message": "Version created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/applications/image/<path:filename>",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "path: filename (path)",
|
|
"purpose": "Serve an uploaded application image.",
|
|
"example": "curl http://localhost:5001/api/applications/image/example.png"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/applications/machines/<int:machine_id>",
|
|
"auth": "permission:applications.view",
|
|
"params": "path: machine_id (int)",
|
|
"purpose": "List all applications installed on a computer.",
|
|
"example": "curl http://localhost:5001/api/applications/machines/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"appdescription": null,
|
|
"appid": 1,
|
|
"appname": "Test App",
|
|
"appversionid": null,
|
|
"computerid": 1,
|
|
"id": 1,
|
|
"installeddate": "2026-01-01T00:00:00.000000Z",
|
|
"installedversion": "1.2.3",
|
|
"isactive": true
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/applications/machines/<int:machine_id>",
|
|
"auth": "permission:applications.create",
|
|
"params": "path: machine_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Install an application on a computer.",
|
|
"example": "curl -X POST http://localhost:5001/api/applications/machines/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/applications/machines/<int:machine_id>/<int:app_id>",
|
|
"auth": "permission:applications.delete",
|
|
"params": "path: machine_id (int), app_id (int)",
|
|
"purpose": "Uninstall an application from a computer.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/applications/machines/1/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/applications/machines/<int:machine_id>/<int:app_id>",
|
|
"auth": "permission:applications.edit",
|
|
"params": "path: machine_id (int), app_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update installed application (e.g., change version).",
|
|
"example": "curl -X PUT http://localhost:5001/api/applications/machines/1/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/applications/package/<path:filename>",
|
|
"auth": "permission:applications.download",
|
|
"params": "path: filename (path)",
|
|
"purpose": "Download an uploaded installer.",
|
|
"example": "curl http://localhost:5001/api/applications/package/example.png -H \"Authorization: Bearer $TOK\""
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-assets",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/assets",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "List all assets with filtering and pagination.",
|
|
"example": "curl http://localhost:5001/api/assets -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "businessunit_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "businessunitid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "dir",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "asc"
|
|
},
|
|
{
|
|
"name": "include_type_data",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "false"
|
|
},
|
|
{
|
|
"name": "location_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "locationid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "sort",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "assetnumber"
|
|
},
|
|
{
|
|
"name": "status_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "statusid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "type",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "type_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "typeid",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"assetid": 1,
|
|
"assetnumber": "A-1",
|
|
"assettypecolor": null,
|
|
"assettypeid": 1,
|
|
"assettypename": "machine",
|
|
"businessunitid": null,
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "mill",
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
}
|
|
],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 1,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/assets",
|
|
"auth": "permission:assets.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new asset.",
|
|
"example": "curl -X POST http://localhost:5001/api/assets -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/assets/<int:asset_id>",
|
|
"auth": "permission:assets.delete",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Delete (soft delete) an asset.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/assets/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/assets/<int:asset_id>",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Get a single asset with full details.",
|
|
"example": "curl http://localhost:5001/api/assets/1 -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "include_type_data",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/assets/<int:asset_id>",
|
|
"auth": "permission:assets.edit",
|
|
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update an asset.",
|
|
"example": "curl -X PUT http://localhost:5001/api/assets/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/assets/<int:asset_id>/communications",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Get all communications for an asset.",
|
|
"example": "curl http://localhost:5001/api/assets/1/communications -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/assets/<int:asset_id>/relationships",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Get all relationships for an asset.",
|
|
"example": "curl http://localhost:5001/api/assets/1/relationships -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"incoming": [
|
|
{
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"inheritsposition": true,
|
|
"isactive": true,
|
|
"isdirectional": true,
|
|
"label": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"notes": null,
|
|
"relationshipid": 1,
|
|
"relationshiptypeid": 1,
|
|
"relationshiptypename": "controls",
|
|
"sourceasset": {
|
|
"assetid": 1,
|
|
"assetnumber": "PC-1",
|
|
"assettypecolor": null,
|
|
"assettypeid": 2,
|
|
"assettypename": "computer",
|
|
"businessunitid": null,
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
},
|
|
"sourceassetid": 1,
|
|
"targetassetid": 2
|
|
}
|
|
],
|
|
"outgoing": []
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/assets/lookup/<assetnumber>",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: assetnumber (string)",
|
|
"purpose": "Look up an asset by its asset number.",
|
|
"example": "curl http://localhost:5001/api/assets/lookup/x -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/assets/map",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "Get all assets with map positions for unified floor map display.",
|
|
"example": "curl http://localhost:5001/api/assets/map -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "assettype",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "businessunitid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "locationid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "statusid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "subtype",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"assets": [
|
|
{
|
|
"assetid": 1,
|
|
"assetnumber": "2007",
|
|
"assettype": "machine",
|
|
"assettypeid": 1,
|
|
"businessunit": null,
|
|
"businessunitid": null,
|
|
"displayname": "<redacted:person>",
|
|
"levelid": null,
|
|
"location": null,
|
|
"locationid": null,
|
|
"mapx": 100,
|
|
"mapy": 100,
|
|
"name": null,
|
|
"primaryip": null,
|
|
"serialnumber": "<redacted:host>",
|
|
"status": null,
|
|
"statuscolor": null,
|
|
"statusid": 1,
|
|
"typedata": {
|
|
"assetid": 1,
|
|
"controllermodelid": null,
|
|
"controllervendorid": null,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"islocationonly": false,
|
|
"lastmaintenancedate": null,
|
|
"machineid": 1,
|
|
"machinetypeid": null,
|
|
"maintenanceintervaldays": null,
|
|
"modelnumberid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"nextmaintenancedate": null,
|
|
"requiresmanualconfig": false,
|
|
"vendorid": null
|
|
}
|
|
},
|
|
{
|
|
"assetid": 2,
|
|
"assetnumber": "2008",
|
|
"assettype": "machine",
|
|
"assettypeid": 1,
|
|
"businessunit": null,
|
|
"businessunitid": null,
|
|
"displayname": "<redacted:person>",
|
|
"levelid": null,
|
|
"location": null,
|
|
"locationid": null,
|
|
"mapx": 110,
|
|
"mapy": 110,
|
|
"name": null,
|
|
"primaryip": null,
|
|
"serialnumber": "<redacted:host>",
|
|
"status": null,
|
|
"statuscolor": null,
|
|
"statusid": 1,
|
|
"typedata": {
|
|
"assetid": 2,
|
|
"controllermodelid": null,
|
|
"controllervendorid": null,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"islocationonly": false,
|
|
"lastmaintenancedate": null,
|
|
"machineid": 2,
|
|
"machinetypeid": null,
|
|
"maintenanceintervaldays": null,
|
|
"modelnumberid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"nextmaintenancedate": null,
|
|
"requiresmanualconfig": false,
|
|
"vendorid": null
|
|
}
|
|
}
|
|
],
|
|
"filters": {
|
|
"assettypes": [
|
|
{
|
|
"assettype": "machine",
|
|
"assettypeid": 1,
|
|
"color": null,
|
|
"icon": null
|
|
}
|
|
],
|
|
"businessunits": [],
|
|
"locations": [],
|
|
"statuses": [],
|
|
"subtypes": {
|
|
"Computer": [],
|
|
"Machine": [],
|
|
"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/<int:rel_id>",
|
|
"auth": "permission:assets.delete",
|
|
"params": "path: rel_id (int)",
|
|
"purpose": "Delete an asset relationship.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/assets/relationships/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"message": "Relationship deleted",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/assets/relationshiptypes",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "List all asset relationship types.",
|
|
"example": "curl http://localhost:5001/api/assets/relationshiptypes -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"color": null,
|
|
"description": null,
|
|
"isdirectional": false,
|
|
"propagatesthrough": [],
|
|
"relationshiptype": "WiFi",
|
|
"relationshiptypeid": 1
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/assets/relationshiptypes",
|
|
"auth": "permission:assets.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new asset relationship type.",
|
|
"example": "curl -X POST http://localhost:5001/api/assets/relationshiptypes -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"isdirectional": false,
|
|
"relationshiptype": "Dualpath"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"color": null,
|
|
"description": null,
|
|
"isdirectional": true,
|
|
"propagatesthrough": [],
|
|
"relationshiptype": "Backup For",
|
|
"relationshiptypeid": 1
|
|
},
|
|
"message": "Relationship type created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/assets/relationshiptypes/<int:type_id>",
|
|
"auth": "permission:assets.delete",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "Delete a relationship type. Refused if any relationship still uses it.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/assets/relationshiptypes/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/assets/relationshiptypes/<int:type_id>",
|
|
"auth": "permission:assets.edit",
|
|
"params": "path: type_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a relationship type.",
|
|
"example": "curl -X PUT http://localhost:5001/api/assets/relationshiptypes/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"isdirectional": false
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"color": null,
|
|
"description": null,
|
|
"isdirectional": false,
|
|
"propagatesthrough": [],
|
|
"relationshiptype": "USB",
|
|
"relationshiptypeid": 1
|
|
},
|
|
"message": "Relationship type updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/assets/statuses",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "List all asset statuses.",
|
|
"example": "curl http://localhost:5001/api/assets/statuses -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/assets/statuses",
|
|
"auth": "permission:assets.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new asset status.",
|
|
"example": "curl -X POST http://localhost:5001/api/assets/statuses -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/assets/statuses/<int:status_id>",
|
|
"auth": "permission:assets.delete",
|
|
"params": "path: status_id (int)",
|
|
"purpose": "Delete an asset status. Refused if any asset still uses it.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/assets/statuses/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/assets/statuses/<int:status_id>",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: status_id (int)",
|
|
"purpose": "Get a single asset status.",
|
|
"example": "curl http://localhost:5001/api/assets/statuses/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/assets/statuses/<int:status_id>",
|
|
"auth": "permission:assets.edit",
|
|
"params": "path: status_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update an asset status.",
|
|
"example": "curl -X PUT http://localhost:5001/api/assets/statuses/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/assets/types",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "List all asset types.",
|
|
"example": "curl http://localhost:5001/api/assets/types -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/assets/types",
|
|
"auth": "permission:assets.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new asset type.",
|
|
"example": "curl -X POST http://localhost:5001/api/assets/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/assets/types/<int:type_id>",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "Get a single asset type.",
|
|
"example": "curl http://localhost:5001/api/assets/types/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/assets/types/<int:type_id>",
|
|
"auth": "permission:assets.edit",
|
|
"params": "path: type_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update an asset type's display fields (color/icon/description). The name, plugin, and table are structural and not editable here.",
|
|
"example": "curl -X PUT http://localhost:5001/api/assets/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-auditlogs",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/auditlogs",
|
|
"auth": "permission:audit.view",
|
|
"params": "not documented",
|
|
"purpose": "List audit logs with filtering and pagination.",
|
|
"example": "curl http://localhost:5001/api/auditlogs -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "action",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "entitytype",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "from_date",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 50
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "to_date",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "userid",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 50,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/auditlogs/entity/<entitytype>/<int:entityid>",
|
|
"auth": "permission:audit.view",
|
|
"params": "path: entitytype (string), entityid (int)",
|
|
"purpose": "Get audit history for a specific entity.",
|
|
"example": "curl http://localhost:5001/api/auditlogs/entity/x/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/auditlogs/purge",
|
|
"auth": "permission:audit.purge",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Delete entries older than the retention window.",
|
|
"example": "curl -X POST http://localhost:5001/api/auditlogs/purge -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/auditlogs/retention",
|
|
"auth": "permission:audit.view",
|
|
"params": "not documented",
|
|
"purpose": "Size of the log and what the configured retention would remove.",
|
|
"example": "curl http://localhost:5001/api/auditlogs/retention -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"expired": 0,
|
|
"newest": "2026-01-01T00:00:00.000000",
|
|
"oldest": "2026-01-01T00:00:00.000000",
|
|
"retentiondays": 30,
|
|
"total": 1
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/auditlogs/stats",
|
|
"auth": "permission:audit.view",
|
|
"params": "not documented",
|
|
"purpose": "Get audit log statistics.",
|
|
"example": "curl http://localhost:5001/api/auditlogs/stats -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"actions": {},
|
|
"activeUsers": [],
|
|
"entities": {},
|
|
"recentCount": 0
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-auth",
|
|
"endpoints": [
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/auth/change-password",
|
|
"auth": "jwt",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Change the authenticated user's own password.",
|
|
"example": "curl -X POST http://localhost:5001/api/auth/change-password -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"current_password": "<redacted:secret>",
|
|
"new_password": "<redacted:secret>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"mustchangepassword": "<redacted:secret>"
|
|
},
|
|
"message": "Password changed",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/auth/login",
|
|
"auth": "none (the login surface itself; rate limited, 5-strike lockout)",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Authenticate user and return JWT tokens.",
|
|
"example": "curl -X POST http://localhost:5001/api/auth/login -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"password": "<redacted:secret>",
|
|
"username": "<redacted:person>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"access_token": "<redacted:secret>",
|
|
"expires_in": 3600,
|
|
"refresh_token": "<redacted:secret>",
|
|
"token_type": "<redacted:secret>",
|
|
"user": {
|
|
"email": "<redacted:person>",
|
|
"firstname": "<redacted:person>",
|
|
"lastname": "<redacted:person>",
|
|
"mustchangepassword": "<redacted:secret>",
|
|
"permissions": [
|
|
"endpoints.runscript",
|
|
"endpoints.agentupdate",
|
|
"endpoints.view",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"roles": [
|
|
"upgradeoperatorrole"
|
|
],
|
|
"userid": 2,
|
|
"username": "<redacted:person>"
|
|
}
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/auth/logout",
|
|
"auth": "jwt",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Logout user (for frontend token cleanup).",
|
|
"example": "curl -X POST http://localhost:5001/api/auth/logout -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/auth/me",
|
|
"auth": "jwt",
|
|
"params": "not documented",
|
|
"purpose": "Get current authenticated user info.",
|
|
"example": "curl http://localhost:5001/api/auth/me -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"email": "<redacted:person>",
|
|
"firstname": "<redacted:person>",
|
|
"lastname": "<redacted:person>",
|
|
"mustchangepassword": "<redacted:secret>",
|
|
"permissions": [
|
|
"assets.view",
|
|
"assets.create",
|
|
"assets.edit",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"roles": [
|
|
"admin"
|
|
],
|
|
"userid": 1,
|
|
"username": "<redacted:person>"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/auth/refresh",
|
|
"auth": "jwt (refresh token)",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Refresh access token using refresh token.",
|
|
"example": "curl -X POST http://localhost:5001/api/auth/refresh -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-businessunits",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/businessunits",
|
|
"auth": "jwt-optional (works signed out; the handler decides what shows)",
|
|
"params": "not documented",
|
|
"purpose": "List all business units.",
|
|
"example": "curl http://localhost:5001/api/businessunits -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "businessunit",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/businessunits",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new business unit.",
|
|
"example": "curl -X POST http://localhost:5001/api/businessunits -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/businessunits/<int:bu_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: bu_id (int)",
|
|
"purpose": "Delete (deactivate) a business unit.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/businessunits/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/businessunits/<int:bu_id>",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: bu_id (int)",
|
|
"purpose": "Get a single business unit.",
|
|
"example": "curl http://localhost:5001/api/businessunits/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/businessunits/<int:bu_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: bu_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a business unit.",
|
|
"example": "curl -X PUT http://localhost:5001/api/businessunits/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-collector",
|
|
"endpoints": [
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/collector/<pluginname>",
|
|
"auth": "api-key (per-plugin collector token)",
|
|
"params": "path: pluginname (string); body: JSON (fields not yet documented)",
|
|
"purpose": "Generic collector ingest for any plugin (ADR-006).",
|
|
"example": "curl -X POST http://localhost:5001/api/collector/x -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"hostname": "<redacted:host>",
|
|
"queues": [
|
|
{
|
|
"drivername": "HP Universal Printing PS",
|
|
"isdefault": true,
|
|
"portaddress": "<redacted:address>",
|
|
"portname": "IP_10.20.0.11",
|
|
"queuename": "PRINTER-A"
|
|
},
|
|
{
|
|
"drivername": "HP Universal Printing PS",
|
|
"isdefault": false,
|
|
"portaddress": "<redacted:address>",
|
|
"portname": "IP_10.20.0.12",
|
|
"queuename": "PRINTER-B"
|
|
},
|
|
{
|
|
"drivername": "HP Universal Printing PS",
|
|
"isdefault": false,
|
|
"portaddress": "<redacted:address>",
|
|
"portname": "IP_10.20.0.99",
|
|
"queuename": "Reception Copier"
|
|
}
|
|
]
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"accessprotocols": [],
|
|
"action": "updated",
|
|
"assetid": 2,
|
|
"identityvalue": "LEGACYPC",
|
|
"machinelinks": [],
|
|
"measuringtoollinkcount": 0,
|
|
"measuringtoollinks": [],
|
|
"partmarkers": [
|
|
{
|
|
"assetid": 3,
|
|
"assetnumber": "LEGACYPC-PARTMARKER",
|
|
"operationassetid": null
|
|
}
|
|
],
|
|
"printerlinkcount": 0,
|
|
"printerlinks": [],
|
|
"status": "ok",
|
|
"warnings": [
|
|
"mapped ComputerType not found: Shopfloor PC",
|
|
"machine number '0615' is this PC's own asset number; marker not filed under an operation. Rename the PC asset to its hostname, or create the operation asset."
|
|
]
|
|
},
|
|
"message": "computers collector updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/collector/_schemas",
|
|
"auth": "jwt",
|
|
"params": "not documented",
|
|
"purpose": "List collector schemas for all enabled plugins (JWT-protected).",
|
|
"example": "curl http://localhost:5001/api/collector/_schemas -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/collector/apps",
|
|
"auth": "api-key (collector token, legacy shared key)",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Update installed applications for a PC (matched by hostname).",
|
|
"example": "curl -X POST http://localhost:5001/api/collector/apps -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/collector/bulk",
|
|
"auth": "api-key (collector token, legacy shared key)",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Bulk update multiple PCs at once.",
|
|
"example": "curl -X POST http://localhost:5001/api/collector/bulk -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"pcs": [
|
|
{
|
|
"hostname": "<redacted:host>"
|
|
}
|
|
]
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"errors": [],
|
|
"notfound": [
|
|
"WJLEG01"
|
|
],
|
|
"timestamp": "2026-01-01T00:00:00.000000",
|
|
"updated": 0
|
|
},
|
|
"message": "0 PC(s) updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/collector/heartbeat",
|
|
"auth": "api-key (collector token, legacy shared key)",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Record PC online status / heartbeat (single or batch).",
|
|
"example": "curl -X POST http://localhost:5001/api/collector/heartbeat -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"hostname": "<redacted:host>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"notfound": [
|
|
"WJLEG01"
|
|
],
|
|
"timestamp": "2026-01-01T00:00:00.000000",
|
|
"updated": 0
|
|
},
|
|
"message": "0 PC(s) heartbeat recorded",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/collector/pc",
|
|
"auth": "api-key (collector token, legacy shared key)",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Update one PC from the collection script (matched by hostname).",
|
|
"example": "curl -X POST http://localhost:5001/api/collector/pc -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/collector/status",
|
|
"auth": "api-key (per-plugin collector token)",
|
|
"params": "not documented",
|
|
"purpose": "Check collector API status.",
|
|
"example": "curl http://localhost:5001/api/collector/status -H \"X-API-Key: $KEY\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"endpoints": [
|
|
"POST /api/collector/<plugin>",
|
|
"GET /api/collector/_schemas",
|
|
"POST /api/collector/pc",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"status": "ok",
|
|
"timestamp": "2026-01-01T00:00:00.000000"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-customfields",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/customfields",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "List custom-field definitions. Filter by ?assettypeid=. ?active=false includes inactive ones.",
|
|
"example": "curl http://localhost:5001/api/customfields -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "assettypeid",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/customfields",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: customfields.create_field has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/customfields -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/customfields/<int:fieldid>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: fieldid (int)",
|
|
"purpose": "UNDOCUMENTED: customfields.delete_field has no docstring.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/customfields/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/customfields/<int:fieldid>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: fieldid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: customfields.update_field has no docstring.",
|
|
"example": "curl -X PUT http://localhost:5001/api/customfields/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/customfields/asset/<int:assetid>",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: assetid (int)",
|
|
"purpose": "Active custom fields for an asset's type, merged with its values.",
|
|
"example": "curl http://localhost:5001/api/customfields/asset/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/customfields/asset/<int:assetid>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: assetid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Upsert values for an asset. Body: {values: {fieldid: value, ...}}.",
|
|
"example": "curl -X PUT http://localhost:5001/api/customfields/asset/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-dashboard",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/dashboard",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "Get dashboard summary data (asset-based).",
|
|
"example": "curl http://localhost:5001/api/dashboard -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"activeassets": 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"
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"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"
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/dashboard/stats",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "Get detailed statistics by asset type.",
|
|
"example": "curl http://localhost:5001/api/dashboard/stats -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"bytype": []
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/dashboard/summary",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "Get dashboard summary data (asset-based).",
|
|
"example": "curl http://localhost:5001/api/dashboard/summary -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"activeassets": 0,
|
|
"bystatus": {},
|
|
"counts": {
|
|
"machines": 0,
|
|
"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"
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"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": "<redacted:host>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"businessunit": "Materials",
|
|
"businessunitid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"dashboarddefaultid": 1,
|
|
"description": "Materials lobby kiosk",
|
|
"displaypath": "/shopfloor",
|
|
"displayrole": "Dashboard",
|
|
"fqdn": "<redacted:host>",
|
|
"ipaddress": "<redacted:host>",
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"message": "Mapping created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/dashboarddefaults/<int:default_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: default_id (int)",
|
|
"purpose": "Delete (deactivate) a mapping.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/dashboarddefaults/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"message": "Mapping deleted",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/dashboarddefaults/<int:default_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: default_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a mapping.",
|
|
"example": "curl -X PUT http://localhost:5001/api/dashboarddefaults/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"description": "moved"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"businessunit": "Materials",
|
|
"businessunitid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"dashboarddefaultid": 1,
|
|
"description": "moved",
|
|
"displaypath": "/shopfloor",
|
|
"displayrole": "Dashboard",
|
|
"fqdn": "<redacted:host>",
|
|
"ipaddress": "<redacted:host>",
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"message": "Mapping updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/dashboarddefaults/display-role",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "not documented",
|
|
"purpose": "Resolve what a single 'display' PC should show, from its own IP.",
|
|
"example": "curl http://localhost:5001/api/dashboarddefaults/display-role",
|
|
"queryparams": [
|
|
{
|
|
"name": "fqdn",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "ipaddress",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"businessunit": null,
|
|
"businessunitid": null,
|
|
"fqdn": "<redacted:host>",
|
|
"ipaddress": "<redacted:host>",
|
|
"path": "/parts-kiosk",
|
|
"role": "3DPrintRoom"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/dashboarddefaults/visitor-location",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "not documented",
|
|
"purpose": "Resolve the business unit for the calling display by its IP.",
|
|
"example": "curl http://localhost:5001/api/dashboarddefaults/visitor-location",
|
|
"queryparams": [
|
|
{
|
|
"name": "fqdn",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "ipaddress",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"businessunit": "Materials",
|
|
"businessunitid": 1,
|
|
"fqdn": "<redacted:host>",
|
|
"ipaddress": "<redacted:host>"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-docs",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/docs/",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "not documented",
|
|
"purpose": "Redoc page. url_for keeps the asset URLs correct under any mount.",
|
|
"example": "curl http://localhost:5001/api/docs/"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/docs/llms.txt",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "not documented",
|
|
"purpose": "Concise LLM-oriented API guide.",
|
|
"example": "curl http://localhost:5001/api/docs/llms.txt"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/docs/openapi.json",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "not documented",
|
|
"purpose": "The generated OpenAPI 3.1 spec (machine + LLM readable).",
|
|
"example": "curl http://localhost:5001/api/docs/openapi.json"
|
|
},
|
|
{
|
|
"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/<int:location_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: location_id (int)",
|
|
"purpose": "Delete (deactivate) a location.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/locations/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/locations/<int:location_id>",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: location_id (int)",
|
|
"purpose": "Get a single location.",
|
|
"example": "curl http://localhost:5001/api/locations/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/locations/<int:location_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: location_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a location.",
|
|
"example": "curl -X PUT http://localhost:5001/api/locations/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/locations/types",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "List location types. ?active=false includes inactive ones.",
|
|
"example": "curl http://localhost:5001/api/locations/types -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/locations/types",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: locations.create_location_type has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/locations/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/locations/types/<int:type_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "UNDOCUMENTED: locations.delete_location_type has no docstring.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/locations/types/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/locations/types/<int:type_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: type_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: locations.update_location_type has no docstring.",
|
|
"example": "curl -X PUT http://localhost:5001/api/locations/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-maplevels",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/maplevels",
|
|
"auth": "jwt-optional (works signed out; the handler decides what shows)",
|
|
"params": "not documented",
|
|
"purpose": "Every active level, grouped by building, in display order.",
|
|
"example": "curl http://localhost:5001/api/maplevels -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"buildings": [
|
|
{
|
|
"buildingid": 1,
|
|
"buildingname": "Public Works",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"levels": [
|
|
{
|
|
"assetcount": 0,
|
|
"blueprintdark": null,
|
|
"blueprintlight": "floorplan.svg",
|
|
"buildingid": 1,
|
|
"buildingname": "Public Works",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"isdefault": false,
|
|
"levelid": 1,
|
|
"levelname": "Ground",
|
|
"mapheight": 2550,
|
|
"mapwidth": 3300,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"sortorder": 1
|
|
}
|
|
],
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"sortorder": 1
|
|
}
|
|
],
|
|
"defaultlevelid": 1,
|
|
"totalplaced": 0
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/maplevels",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: maplevels.create_level has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/maplevels -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/maplevels/<int:levelid>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: levelid (int)",
|
|
"purpose": "Deactivate a level, refusing while assets are still placed on it.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/maplevels/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/maplevels/<int:levelid>",
|
|
"auth": "jwt-optional (works signed out; the handler decides what shows)",
|
|
"params": "path: levelid (int)",
|
|
"purpose": "UNDOCUMENTED: maplevels.get_level has no docstring.",
|
|
"example": "curl http://localhost:5001/api/maplevels/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"blueprintdark": null,
|
|
"blueprintlight": "floorplan.svg",
|
|
"buildingid": 1,
|
|
"buildingname": "Public Works",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"isdefault": false,
|
|
"levelid": 1,
|
|
"levelname": "Ground",
|
|
"mapheight": 2550,
|
|
"mapwidth": 3300,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"sortorder": 1
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PATCH|PUT",
|
|
"path": "/api/maplevels/<int:levelid>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: levelid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: maplevels.update_level has no docstring.",
|
|
"example": "curl -X PATCH http://localhost:5001/api/maplevels/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/maplevels/<int:levelid>/blueprint",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: levelid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Upload this level's blueprint for one theme.",
|
|
"example": "curl -X POST http://localhost:5001/api/maplevels/1/blueprint -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/maplevels/<int:levelid>/blueprint/<path:filename>",
|
|
"auth": "jwt-optional (works signed out; the handler decides what shows)",
|
|
"params": "path: levelid (int), filename (path)",
|
|
"purpose": "Serve a level's blueprint image. Public, for the same reason as above.",
|
|
"example": "curl http://localhost:5001/api/maplevels/1/blueprint/example.png -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/maplevels/buildings",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: maplevels.create_building has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/maplevels/buildings -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "PATCH|PUT",
|
|
"path": "/api/maplevels/buildings/<int:buildingid>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: buildingid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Rename or reorder a building. Levels move with it; nothing repositions.",
|
|
"example": "curl -X PATCH http://localhost:5001/api/maplevels/buildings/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-mappositions",
|
|
"endpoints": [
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/mappositions/positions",
|
|
"auth": "permission:assets.edit",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Set positions for many assets at once.",
|
|
"example": "curl -X POST http://localhost:5001/api/mappositions/positions -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"positions": [
|
|
{
|
|
"assetid": 1,
|
|
"levelid": 2,
|
|
"mapx": 42,
|
|
"mapy": 43
|
|
}
|
|
]
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"snapshotid": 1,
|
|
"updated": 1
|
|
},
|
|
"message": "1 position(s) saved",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/mappositions/snapshots",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "Snapshots, newest first. Metadata only - the positions are large.",
|
|
"example": "curl http://localhost:5001/api/mappositions/snapshots -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/mappositions/snapshots/<int:snapshotid>/restore",
|
|
"auth": "permission:assets.edit",
|
|
"params": "path: snapshotid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Put the positions in this snapshot back.",
|
|
"example": "curl -X POST http://localhost:5001/api/mappositions/snapshots/1/restore -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"restored": 3,
|
|
"skippedassetids": []
|
|
},
|
|
"message": "3 marker(s) restored",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/mappositions/transform",
|
|
"auth": "permission:assets.edit",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Move every placed marker on a level by a transform read off landmarks.",
|
|
"example": "curl -X POST http://localhost:5001/api/mappositions/transform -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"dryrun": false,
|
|
"landmarks": [
|
|
{
|
|
"fromx": 0,
|
|
"fromy": 0,
|
|
"tox": 0,
|
|
"toy": 1450
|
|
},
|
|
{
|
|
"fromx": 1000,
|
|
"fromy": 1000,
|
|
"tox": 1000,
|
|
"toy": 2450
|
|
}
|
|
],
|
|
"levelid": 1
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assetcount": 3,
|
|
"dryrun": false,
|
|
"levelid": 1,
|
|
"moves": [
|
|
{
|
|
"assetid": 1,
|
|
"assetnumber": "M000",
|
|
"fromx": 100,
|
|
"fromy": 100,
|
|
"name": null,
|
|
"outofbounds": false,
|
|
"tox": 100,
|
|
"toy": 1550
|
|
},
|
|
{
|
|
"assetid": 2,
|
|
"assetnumber": "M001",
|
|
"fromx": 1500,
|
|
"fromy": 1200,
|
|
"name": null,
|
|
"outofbounds": true,
|
|
"tox": 1500,
|
|
"toy": 2650
|
|
},
|
|
{
|
|
"assetid": 3,
|
|
"assetnumber": "M002",
|
|
"fromx": 3200,
|
|
"fromy": 2500,
|
|
"name": null,
|
|
"outofbounds": true,
|
|
"tox": 3200,
|
|
"toy": 3950
|
|
}
|
|
],
|
|
"outofboundscount": 2,
|
|
"snapshotid": 1,
|
|
"tolevelid": 1,
|
|
"transform": {
|
|
"offsetx": 0.0,
|
|
"offsety": 1450.0,
|
|
"scalex": 1.0,
|
|
"scaley": 1.0
|
|
}
|
|
},
|
|
"message": "3 marker(s) moved; snapshot 1 can restore them",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/mappositions/verify",
|
|
"auth": "permission:assets.edit",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Mark markers as reviewed against the current drawing without moving them.",
|
|
"example": "curl -X POST http://localhost:5001/api/mappositions/verify -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"assetids": [
|
|
1
|
|
],
|
|
"unverify": true
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"updated": 1
|
|
},
|
|
"message": "1 marker(s) unverified",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-models",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/models",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "List all vendor catalog models.",
|
|
"example": "curl http://localhost:5001/api/models -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "category",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "modelnumber",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "modeltype",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "vendor",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/models",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new model.",
|
|
"example": "curl -X POST http://localhost:5001/api/models -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/models/<int:model_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: model_id (int)",
|
|
"purpose": "Delete (deactivate) a model.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/models/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/models/<int:model_id>",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: model_id (int)",
|
|
"purpose": "Get a single model.",
|
|
"example": "curl http://localhost:5001/api/models/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/models/<int:model_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: model_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a model.",
|
|
"example": "curl -X PUT http://localhost:5001/api/models/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/models/<int:model_id>/image",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: model_id (int)",
|
|
"purpose": "Clear a model image and delete the uploaded file if we own it.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/models/1/image -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": null,
|
|
"documentationurl": null,
|
|
"imageurl": null,
|
|
"isactive": true,
|
|
"modelnumber": "TESTMODEL-1",
|
|
"modelnumberid": 1,
|
|
"modeltypeid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"notes": null,
|
|
"vendorid": null
|
|
},
|
|
"message": "Model image removed",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/models/<int:model_id>/image",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: model_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Upload (or replace) the photo for a model.",
|
|
"example": "curl -X POST http://localhost:5001/api/models/1/image -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": null,
|
|
"documentationurl": null,
|
|
"imageurl": "/api/models/image/model-1.jpg",
|
|
"isactive": true,
|
|
"modelnumber": "TESTMODEL-1",
|
|
"modelnumberid": 1,
|
|
"modeltypeid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"notes": null,
|
|
"vendorid": null
|
|
},
|
|
"message": "Model image uploaded",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/models/image/<path:filename>",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "path: filename (path)",
|
|
"purpose": "Serve an uploaded model image (public - asset detail pages read it).",
|
|
"example": "curl http://localhost:5001/api/models/image/example.png"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-modeltypes",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/modeltypes",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "List all model types with optional filtering.",
|
|
"example": "curl http://localhost:5001/api/modeltypes -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "category",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "modeltype",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/modeltypes",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new model type.",
|
|
"example": "curl -X POST http://localhost:5001/api/modeltypes -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/modeltypes/<int:type_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "Delete (deactivate) a model type.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/modeltypes/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/modeltypes/<int:type_id>",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "Get a single model type.",
|
|
"example": "curl http://localhost:5001/api/modeltypes/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/modeltypes/<int:type_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: type_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a model type.",
|
|
"example": "curl -X PUT http://localhost:5001/api/modeltypes/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-operatingsystems",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/operatingsystems",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "List all operating systems.",
|
|
"example": "curl http://localhost:5001/api/operatingsystems -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "osname",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "osversion",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/operatingsystems",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new operating system.",
|
|
"example": "curl -X POST http://localhost:5001/api/operatingsystems -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/operatingsystems/<int:os_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: os_id (int)",
|
|
"purpose": "Delete (deactivate) an operating system.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/operatingsystems/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/operatingsystems/<int:os_id>",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: os_id (int)",
|
|
"purpose": "Get a single operating system.",
|
|
"example": "curl http://localhost:5001/api/operatingsystems/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/operatingsystems/<int:os_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: os_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update an operating system.",
|
|
"example": "curl -X PUT http://localhost:5001/api/operatingsystems/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-plugins",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/plugins",
|
|
"auth": "permission:settings.view",
|
|
"params": "not documented",
|
|
"purpose": "List all discovered plugins (enabled or not) with their metadata and the framework contract version.",
|
|
"example": "curl http://localhost:5001/api/plugins -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/plugins/<name>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: name (string); body: JSON (fields not yet documented)",
|
|
"purpose": "Enable or disable a plugin. Takes effect on the next app restart for route/navigation changes.",
|
|
"example": "curl -X PUT http://localhost:5001/api/plugins/x -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/plugins/enabled",
|
|
"auth": "jwt-optional (works signed out; the handler decides what shows)",
|
|
"params": "not documented",
|
|
"purpose": "Return just the names of enabled plugins as a flat array.",
|
|
"example": "curl http://localhost:5001/api/plugins/enabled -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
"backups",
|
|
"computers",
|
|
"employees",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/plugins/settings-routes",
|
|
"auth": "permission:settings.view",
|
|
"params": "not documented",
|
|
"purpose": "Return settings routes contributed by all enabled plugins.",
|
|
"example": "curl http://localhost:5001/api/plugins/settings-routes -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"routes": [
|
|
{
|
|
"component": "drawn.vue",
|
|
"hub": "model-catalog",
|
|
"name": "drawn-route",
|
|
"path": "drawn",
|
|
"tab": "Drawn"
|
|
},
|
|
{
|
|
"component": ".plugins-staged/computers/views/OperatingSystemsList.vue",
|
|
"hub": "model-catalog",
|
|
"name": "model-catalog-os",
|
|
"path": "operatingsystems",
|
|
"tab": "Operating Systems"
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-pluginui",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/pluginui/asset-panels",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "Return the asset-detail panels matching one asset's type (get_asset_panels).",
|
|
"example": "curl http://localhost:5001/api/pluginui/asset-panels -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "assetid",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"assettypes": [
|
|
"computer"
|
|
],
|
|
"empty": "No agent report yet.",
|
|
"endpoint": "/api/endpoints/asset/{assetid}/status",
|
|
"group": "details",
|
|
"id": "endpoints-status",
|
|
"plugin": "endpoints",
|
|
"position": 10,
|
|
"render": "keyvalue",
|
|
"title": "Endpoint status"
|
|
},
|
|
{
|
|
"assettypes": [
|
|
"computer"
|
|
],
|
|
"collapsible": true,
|
|
"commandendpoint": "/api/endpoints/{assetid}/commands",
|
|
"empty": "No monitored services reported.",
|
|
"endpoint": "/api/endpoints/asset/{assetid}/services",
|
|
"facets": {
|
|
"key": "statelabel",
|
|
"order": [
|
|
"Running",
|
|
"Stopped",
|
|
"Paused",
|
|
"<trimmed for the example: 1 more>"
|
|
]
|
|
},
|
|
"filter": {
|
|
"equals": "service",
|
|
"key": "kind"
|
|
},
|
|
"group": "serviceprocess",
|
|
"id": "endpoints-tracked-services",
|
|
"map": {
|
|
"action": "action",
|
|
"badge": {
|
|
"color": "statecolor",
|
|
"label": "statelabel"
|
|
},
|
|
"title": "name"
|
|
},
|
|
"permission": "endpoints.command",
|
|
"plugin": "endpoints",
|
|
"position": 12,
|
|
"render": "list",
|
|
"status": {
|
|
"key": "statecolor",
|
|
"levels": {
|
|
"green": "ok",
|
|
"red": "critical",
|
|
"yellow": "warning"
|
|
}
|
|
},
|
|
"title": "Tracked Services"
|
|
},
|
|
{
|
|
"assettypes": [
|
|
"computer"
|
|
],
|
|
"collapsible": true,
|
|
"commandendpoint": "/api/endpoints/{assetid}/commands",
|
|
"empty": "No monitored processes reported.",
|
|
"endpoint": "/api/endpoints/asset/{assetid}/services",
|
|
"facets": {
|
|
"key": "statelabel",
|
|
"order": [
|
|
"Running",
|
|
"Stopped",
|
|
"Paused",
|
|
"<trimmed for the example: 1 more>"
|
|
]
|
|
},
|
|
"filter": {
|
|
"equals": "process",
|
|
"key": "kind"
|
|
},
|
|
"group": "serviceprocess",
|
|
"id": "endpoints-tracked-processes",
|
|
"map": {
|
|
"action": "action",
|
|
"badge": {
|
|
"color": "statecolor",
|
|
"label": "statelabel"
|
|
},
|
|
"title": "name"
|
|
},
|
|
"permission": "endpoints.command",
|
|
"plugin": "endpoints",
|
|
"position": 13,
|
|
"render": "list",
|
|
"status": {
|
|
"key": "statecolor",
|
|
"levels": {
|
|
"green": "ok",
|
|
"red": "critical",
|
|
"yellow": "warning"
|
|
}
|
|
},
|
|
"title": "Tracked Processes"
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/pluginui/asset-presentation",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "Merge enabled plugins' asset-type presentation entries (hook).",
|
|
"example": "curl http://localhost:5001/api/pluginui/asset-presentation -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"assettype": "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"
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/pluginui/core-type-descriptors",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "Return type descriptors for core-owned non-asset types.",
|
|
"example": "curl http://localhost:5001/api/pluginui/core-type-descriptors -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"category": "location",
|
|
"edit_permission": "admin",
|
|
"group": "other",
|
|
"optional_tabs": [],
|
|
"subtype_color_field": "color",
|
|
"subtype_description_field": "description",
|
|
"subtype_endpoint": "/locations/types",
|
|
"subtype_id_field": "locationtypeid",
|
|
"subtype_label_field": "locationtype",
|
|
"type_name": "Location Type",
|
|
"type_name_plural": "Location Types"
|
|
},
|
|
{
|
|
"category": "notification",
|
|
"custom_component": "NotificationTypesTab",
|
|
"edit_permission": "admin",
|
|
"group": "other",
|
|
"optional_tabs": [],
|
|
"subtype_color_field": "typecolor",
|
|
"subtype_description_field": "typedescription",
|
|
"subtype_endpoint": "/notifications/types",
|
|
"subtype_id_field": "notificationtypeid",
|
|
"subtype_label_field": "typename",
|
|
"type_name": "Notification Type",
|
|
"type_name_plural": "Notification Types"
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/pluginui/map-overlays",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "Merge enabled plugins' map overlay declarations (get_map_overlays hook).",
|
|
"example": "curl http://localhost:5001/api/pluginui/map-overlays -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"endpoint": "/api/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"
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-reports",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/reports",
|
|
"auth": "permission:reports.view",
|
|
"params": "not documented",
|
|
"purpose": "List all available reports.",
|
|
"example": "curl http://localhost:5001/api/reports -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"reports": [
|
|
{
|
|
"category": "inventory",
|
|
"description": "Machine count grouped by machine type",
|
|
"endpoint": "/api/reports/machines-by-type",
|
|
"id": "machines-by-type",
|
|
"name": "Machines by Type"
|
|
},
|
|
{
|
|
"category": "inventory",
|
|
"description": "Asset count grouped by status",
|
|
"endpoint": "/api/reports/assets-by-status",
|
|
"id": "assets-by-status",
|
|
"name": "Assets by Status"
|
|
},
|
|
{
|
|
"category": "usage",
|
|
"description": "Most clicked knowledge base articles",
|
|
"endpoint": "/api/reports/kb-popularity",
|
|
"id": "kb-popularity",
|
|
"name": "KB Popularity"
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"total": 13
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/reports/asset-inventory",
|
|
"auth": "permission:reports.view",
|
|
"params": "not documented",
|
|
"purpose": "Report: Complete asset inventory summary.",
|
|
"example": "curl http://localhost:5001/api/reports/asset-inventory -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "businessunitid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "format",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "locationid",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"data": {
|
|
"bylocation": [],
|
|
"bystatus": [],
|
|
"bytype": []
|
|
},
|
|
"generated": "2026-01-01T00:00:00.000000",
|
|
"report": "asset_inventory",
|
|
"total": 0
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/reports/assets-by-status",
|
|
"auth": "permission:reports.view",
|
|
"params": "not documented",
|
|
"purpose": "Report: Asset count grouped by status.",
|
|
"example": "curl http://localhost:5001/api/reports/assets-by-status -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "assettypeid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "businessunitid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "format",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"data": [],
|
|
"generated": "2026-01-01T00:00:00.000000",
|
|
"report": "assets_by_status",
|
|
"total": 0
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/reports/email",
|
|
"auth": "permission:reports.export",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Email a report's data as an HTML table (on-demand delivery).",
|
|
"example": "curl -X POST http://localhost:5001/api/reports/email -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"columns": [
|
|
{
|
|
"key": "vendor",
|
|
"label": "Vendor"
|
|
}
|
|
],
|
|
"rows": [
|
|
{
|
|
"vendor": "Dell"
|
|
}
|
|
],
|
|
"subject": "Warranty Report",
|
|
"to": "<redacted:email>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"reason": "notconfigured",
|
|
"sent": false
|
|
},
|
|
"message": "Email is not configured (SMTP disabled or host unset).",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/reports/kb-popularity",
|
|
"auth": "permission:reports.view",
|
|
"params": "not documented",
|
|
"purpose": "Report: Most clicked knowledge base articles.",
|
|
"example": "curl http://localhost:5001/api/reports/kb-popularity -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "format",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "limit",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 20
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"data": [],
|
|
"generated": "2026-01-01T00:00:00.000000",
|
|
"report": "kb_popularity",
|
|
"total": 0
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/reports/machines-by-type",
|
|
"auth": "permission:reports.view",
|
|
"params": "not documented",
|
|
"purpose": "Report: Machine count grouped by machine type.",
|
|
"example": "curl http://localhost:5001/api/reports/machines-by-type -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "businessunitid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "format",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"data": [],
|
|
"generated": "2026-01-01T00:00:00.000000",
|
|
"report": "machines_by_type",
|
|
"total": 0
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/reports/pc-relationships",
|
|
"auth": "permission:reports.view",
|
|
"params": "not documented",
|
|
"purpose": "Report: PCs with relationships to shop floor machines.",
|
|
"example": "curl http://localhost:5001/api/reports/pc-relationships -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "format",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"data": [
|
|
{
|
|
"hostname": "<redacted:host>",
|
|
"ip": "<redacted:host>",
|
|
"machine_number": "4242",
|
|
"model": "",
|
|
"vendor": ""
|
|
}
|
|
],
|
|
"generated": "2026-01-01T00:00:00.000000",
|
|
"report": "pc_relationships",
|
|
"total": 1
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/reports/software-compliance",
|
|
"auth": "permission:reports.view",
|
|
"params": "not documented",
|
|
"purpose": "Report: Required applications vs installed (per PC).",
|
|
"example": "curl http://localhost:5001/api/reports/software-compliance -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "appid",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "format",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"data": [],
|
|
"generated": "2026-01-01T00:00:00.000000",
|
|
"message": "No required applications defined",
|
|
"report": "software_compliance"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-scripts",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/scripts",
|
|
"auth": "permission:endpoints.runscript",
|
|
"params": "not documented",
|
|
"purpose": "List scripts (active by default).",
|
|
"example": "curl http://localhost:5001/api/scripts -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/scripts",
|
|
"auth": "permission:endpoints.runscript",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a script catalog entry (body uploaded separately).",
|
|
"example": "curl -X POST http://localhost:5001/api/scripts -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"scriptname": "autologon",
|
|
"workingdirectory": "C:\\Program Files\\Sysinternals"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"captureoutput": false,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"errormode": "default",
|
|
"filename": null,
|
|
"hasbody": false,
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"runcontext": "system",
|
|
"scriptdescription": null,
|
|
"scriptid": 1,
|
|
"scriptname": "autologon",
|
|
"sha256": null,
|
|
"workingdirectory": "C:\\Program Files\\Sysinternals"
|
|
},
|
|
"message": "Script created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/scripts/<int:script_id>",
|
|
"auth": "permission:endpoints.runscript",
|
|
"params": "path: script_id (int)",
|
|
"purpose": "UNDOCUMENTED: scripts.delete_script has no docstring.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/scripts/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/scripts/<int:script_id>",
|
|
"auth": "permission:endpoints.runscript",
|
|
"params": "path: script_id (int)",
|
|
"purpose": "UNDOCUMENTED: scripts.get_script has no docstring.",
|
|
"example": "curl http://localhost:5001/api/scripts/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/scripts/<int:script_id>",
|
|
"auth": "permission:endpoints.runscript",
|
|
"params": "path: script_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: scripts.update_script has no docstring.",
|
|
"example": "curl -X PUT http://localhost:5001/api/scripts/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"scriptdescription": "now documented"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"captureoutput": true,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"errormode": "default",
|
|
"filename": null,
|
|
"hasbody": false,
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"runcontext": "system",
|
|
"scriptdescription": "now documented",
|
|
"scriptid": 1,
|
|
"scriptname": "keep-my-flag",
|
|
"sha256": null,
|
|
"workingdirectory": null
|
|
},
|
|
"message": "Script updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/scripts/<int:script_id>/body",
|
|
"auth": "permission:endpoints.runscript",
|
|
"params": "path: script_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Upload (or replace) the .ps1 body for a script.",
|
|
"example": "curl -X POST http://localhost:5001/api/scripts/1/body -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"bytes": 23,
|
|
"captureoutput": false,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"errormode": "default",
|
|
"filename": "script-1.ps1",
|
|
"hasbody": true,
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"runcontext": "system",
|
|
"scriptdescription": null,
|
|
"scriptid": 1,
|
|
"scriptname": "digest-check",
|
|
"sha256": "<redacted:digest>",
|
|
"uploadedfilename": "digest-check.ps1",
|
|
"workingdirectory": null
|
|
},
|
|
"message": "Script body uploaded",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/scripts/body/<path:filename>",
|
|
"auth": "permission:endpoints.runscript",
|
|
"params": "path: filename (path)",
|
|
"purpose": "Operator-facing script body download (JWT/RBAC).",
|
|
"example": "curl http://localhost:5001/api/scripts/body/example.png -H \"Authorization: Bearer $TOK\""
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-search",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/search",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "Global search across multiple entity types.",
|
|
"example": "curl http://localhost:5001/api/search -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "q",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": ""
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"counts": {
|
|
"knowledgebase": 2
|
|
},
|
|
"degraded": [
|
|
"Employee"
|
|
],
|
|
"query": "zzkeyword",
|
|
"results": [
|
|
{
|
|
"id": 1,
|
|
"linkurl": "u",
|
|
"relevance": 25.0,
|
|
"subtitle": "Livesearchapp",
|
|
"title": "Zzrunbook for the live one",
|
|
"type": "knowledgebase",
|
|
"url": "/knowledgebase/1"
|
|
},
|
|
{
|
|
"id": 3,
|
|
"linkurl": "u",
|
|
"relevance": 25.0,
|
|
"subtitle": null,
|
|
"title": "Zzrunbook with no topic",
|
|
"type": "knowledgebase",
|
|
"url": "/knowledgebase/3"
|
|
}
|
|
],
|
|
"total": 2,
|
|
"total_all": 2
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/search/suggest",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "A better spelling for a query that found nothing, or null.",
|
|
"example": "curl http://localhost:5001/api/search/suggest -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "q",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": ""
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"query": "keyecne",
|
|
"suggestion": "keyence"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-settings",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/settings",
|
|
"auth": "jwt-optional (works signed out; the handler decides what shows)",
|
|
"params": "not documented",
|
|
"purpose": "List all settings, optionally filtered by category.",
|
|
"example": "curl http://localhost:5001/api/settings -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "category",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"category": "auth",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": "SAML Assertion Consumer Service URL",
|
|
"key": "saml_acs_url",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"settingid": 111,
|
|
"value": "",
|
|
"valuetype": "string"
|
|
},
|
|
{
|
|
"category": "auth",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": "SAML group name that grants admin role",
|
|
"key": "saml_admin_group",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"settingid": 114,
|
|
"value": "",
|
|
"valuetype": "string"
|
|
},
|
|
{
|
|
"category": "auth",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": "Allow local username/password login when SAML is enabled",
|
|
"key": "saml_allow_local_login",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"settingid": 112,
|
|
"value": true,
|
|
"valuetype": "boolean"
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/settings",
|
|
"auth": "permission:settings.edit",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new setting (admin only).",
|
|
"example": "curl -X POST http://localhost:5001/api/settings -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/settings/<key>",
|
|
"auth": "jwt-optional (works signed out; the handler decides what shows)",
|
|
"params": "path: key (string)",
|
|
"purpose": "Get a single setting by key.",
|
|
"example": "curl http://localhost:5001/api/settings/x -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"category": "plugin.endpoints",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": "Accept a one-line install bootstrap token in the ?t= query string as well as the X-Endpoint-Bootstrap-Token header. On (the default) keeps the pasted install commands and the Download .ps1 link workin...",
|
|
"key": "plugin.endpoints.bootstrapquerytoken",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"settingid": 1,
|
|
"value": false,
|
|
"valuetype": "boolean"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/settings/<key>",
|
|
"auth": "permission:settings.edit",
|
|
"params": "path: key (string); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a setting value.",
|
|
"example": "curl -X PUT http://localhost:5001/api/settings/x -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"value": "<redacted:address>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"category": "plugin.endpoints",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": "Accept a one-line install bootstrap token in the ?t= query string as well as the X-Endpoint-Bootstrap-Token header. On (the default) keeps the pasted install commands and the Download .ps1 link workin...",
|
|
"key": "plugin.endpoints.bootstrapquerytoken",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"settingid": 1,
|
|
"value": false,
|
|
"valuetype": "boolean"
|
|
},
|
|
"message": "Setting updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/settings/asset-import/import",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Validate uploaded CSVs and, when commit=true, load them.",
|
|
"example": "curl -X POST http://localhost:5001/api/settings/asset-import/import -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/settings/asset-import/script",
|
|
"auth": "jwt + role:admin",
|
|
"params": "not documented",
|
|
"purpose": "Download Collect-ShopDB.ps1 with this site's CSV path embedded.",
|
|
"example": "curl http://localhost:5001/api/settings/asset-import/script -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/settings/asset-import/templates",
|
|
"auth": "jwt + role:admin",
|
|
"params": "not documented",
|
|
"purpose": "List the importable CSV tables in the order they must be uploaded.",
|
|
"example": "curl http://localhost:5001/api/settings/asset-import/templates -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"tables": [
|
|
{
|
|
"filename": "assetstatuses.csv",
|
|
"table": "assetstatuses"
|
|
},
|
|
{
|
|
"filename": "assettypes.csv",
|
|
"table": "assettypes"
|
|
},
|
|
{
|
|
"filename": "locationtypes.csv",
|
|
"table": "locationtypes"
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
]
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/settings/asset-import/templates/<tablename>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: tablename (string)",
|
|
"purpose": "Download a generated CSV template for a single importable table.",
|
|
"example": "curl http://localhost:5001/api/settings/asset-import/templates/x -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/settings/asset-import/winc/batches",
|
|
"auth": "jwt + role:admin",
|
|
"params": "not documented",
|
|
"purpose": "List applied/undone WINC import batches, newest first (for the undo UI).",
|
|
"example": "curl http://localhost:5001/api/settings/asset-import/winc/batches -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"batches": [
|
|
{
|
|
"batchid": "<redacted:token>",
|
|
"createdat": "2026-01-01 00:00:00.000000",
|
|
"createdby": "<redacted:person>",
|
|
"kind": "winc-machine-adoption",
|
|
"rowcount": 1,
|
|
"status": "undone",
|
|
"undoneat": "2026-01-01 00:00:00.000000"
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/settings/asset-import/winc/commit",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Apply a WINC plan reversibly. Requires acknowledgment for needs-create.",
|
|
"example": "curl -X POST http://localhost:5001/api/settings/asset-import/winc/commit -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"batchid": "<redacted:token>",
|
|
"blocking": false,
|
|
"committed": true,
|
|
"kind": "winc-machine-adoption",
|
|
"needscreate": {
|
|
"businessunit": {
|
|
"Large Parts": 1
|
|
}
|
|
},
|
|
"planhash": "<redacted:secret>",
|
|
"rowcount": 1,
|
|
"summary": {
|
|
"ambiguous_match": 0,
|
|
"businessunit_blank": 0,
|
|
"businessunit_needs-create": 1,
|
|
"businessunit_resolved": 0,
|
|
"businessunit_unresolved": 0,
|
|
"export_rows": 2,
|
|
"in_scope": 1,
|
|
"location_blank": 0,
|
|
"location_needs-create": 0,
|
|
"location_resolved": 1,
|
|
"location_unresolved": 0,
|
|
"non_workstation_rows": 1,
|
|
"skipped_no_existing_machine": 0
|
|
},
|
|
"uncreatable": {},
|
|
"unresolved": {}
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/settings/asset-import/winc/preview",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Read-only WINC analysis: report what a commit would do. Writes nothing.",
|
|
"example": "curl -X POST http://localhost:5001/api/settings/asset-import/winc/preview -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"blocking": true,
|
|
"committed": false,
|
|
"kind": "winc-machine-adoption",
|
|
"needscreate": {
|
|
"businessunit": {
|
|
"Large Parts": 1
|
|
},
|
|
"location": {
|
|
"T6": 1
|
|
}
|
|
},
|
|
"planhash": "<redacted:secret>",
|
|
"rowcount": 1,
|
|
"summary": {
|
|
"ambiguous_match": 0,
|
|
"businessunit_blank": 0,
|
|
"businessunit_needs-create": 1,
|
|
"businessunit_resolved": 0,
|
|
"businessunit_unresolved": 0,
|
|
"export_rows": 1,
|
|
"in_scope": 1,
|
|
"location_blank": 0,
|
|
"location_needs-create": 1,
|
|
"location_resolved": 0,
|
|
"location_unresolved": 0,
|
|
"non_workstation_rows": 0,
|
|
"skipped_no_existing_machine": 0
|
|
},
|
|
"uncreatable": {
|
|
"location": {
|
|
"T6": 1
|
|
}
|
|
},
|
|
"unresolved": {}
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/settings/asset-import/winc/undo",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Reverse an applied WINC import batch by id. Conservative and reversible.",
|
|
"example": "curl -X POST http://localhost:5001/api/settings/asset-import/winc/undo -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"batchid": "<redacted:token>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"batchid": "<redacted:token>",
|
|
"conflicts": [
|
|
{
|
|
"column": null,
|
|
"operation": "insert",
|
|
"reason": "still referenced by dashboarddefaults.businessunitid",
|
|
"table": "businessunits",
|
|
"targetid": 1
|
|
}
|
|
],
|
|
"reverted": 3
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/settings/branding-logo",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Upload a branding logo image and point the matching setting at it.",
|
|
"example": "curl -X POST http://localhost:5001/api/settings/branding-logo -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"key": "site_favicon",
|
|
"value": "/api/settings/branding/logo-favicon.ico"
|
|
},
|
|
"message": "Logo uploaded",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/settings/branding/<path:filename>",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "path: filename (path)",
|
|
"purpose": "Serve an uploaded branding logo (public - kiosks/print pages read it).",
|
|
"example": "curl http://localhost:5001/api/settings/branding/example.png"
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/settings/map-blueprint",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Upload a floor-map blueprint image and point the setting at it.",
|
|
"example": "curl -X POST http://localhost:5001/api/settings/map-blueprint -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/settings/map-blueprint/<path:filename>",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "path: filename (path)",
|
|
"purpose": "Serve an uploaded blueprint image (public - kiosks read it).",
|
|
"example": "curl http://localhost:5001/api/settings/map-blueprint/example.png"
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/settings/seed",
|
|
"auth": "permission:settings.edit",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Seed default settings if they don't exist.",
|
|
"example": "curl -X POST http://localhost:5001/api/settings/seed -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {},
|
|
"responseexample": {
|
|
"data": {
|
|
"created": 112
|
|
},
|
|
"message": "112 default settings created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/settings/test-email",
|
|
"auth": "permission:settings.edit",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Send a test email to verify SMTP configuration.",
|
|
"example": "curl -X POST http://localhost:5001/api/settings/test-email -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"to": "<redacted:email>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"error": "[Errno -2] Name or service not known",
|
|
"sent": false
|
|
},
|
|
"message": "Test email failed: [Errno -2] Name or service not known",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-setup",
|
|
"endpoints": [
|
|
{
|
|
"method": "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/<snapshotid>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: snapshotid (string)",
|
|
"purpose": "Return one set's full manifest plus a resolved compatibility verdict.",
|
|
"example": "curl http://localhost:5001/api/shopdbbackups/x -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/shopdbbackups/<snapshotid>/restore",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: snapshotid (string); body: JSON (fields not yet documented)",
|
|
"purpose": "Queue a restore of a set, gated on schema compatibility.",
|
|
"example": "curl -X POST http://localhost:5001/api/shopdbbackups/x/restore -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/shopdbbackups/finalize-restore",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Run the post-restore schema upgrade in the app context.",
|
|
"example": "curl -X POST http://localhost:5001/api/shopdbbackups/finalize-restore -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"queued": true,
|
|
"snapshotid": "wj-2026-09-06T120000Z"
|
|
},
|
|
"message": "Schema upgrade queued.",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/shopdbbackups/history",
|
|
"auth": "jwt + role:admin",
|
|
"params": "not documented",
|
|
"purpose": "Return the recorded history of backup and restore runs, newest first.",
|
|
"example": "curl http://localhost:5001/api/shopdbbackups/history -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"backups": [],
|
|
"restores": []
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/shopdbbackups/settings",
|
|
"auth": "jwt + role:admin",
|
|
"params": "not documented",
|
|
"purpose": "Return destination + retention config for the settings pane.",
|
|
"example": "curl http://localhost:5001/api/shopdbbackups/settings -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"backupsroot": "/backups",
|
|
"destinationkind": "local",
|
|
"destinationkinds": [
|
|
"local",
|
|
"smb",
|
|
"aws"
|
|
],
|
|
"fields": {},
|
|
"isarmed": true,
|
|
"retention": {
|
|
"keepdaily": 5,
|
|
"keepmonthly": 6,
|
|
"keepweekly": 4
|
|
}
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/shopdbbackups/settings",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Persist the backup destination kind and its credential/config fields.",
|
|
"example": "curl -X PUT http://localhost:5001/api/shopdbbackups/settings -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {},
|
|
"responseexample": {
|
|
"data": {
|
|
"backupsroot": "/backups",
|
|
"destinationkind": "local",
|
|
"destinationkinds": [
|
|
"local",
|
|
"smb",
|
|
"aws"
|
|
],
|
|
"fields": {},
|
|
"isarmed": true,
|
|
"retention": {
|
|
"keepdaily": 5,
|
|
"keepmonthly": 6,
|
|
"keepweekly": 4
|
|
}
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/shopdbbackups/status",
|
|
"auth": "jwt + role:admin",
|
|
"params": "not documented",
|
|
"purpose": "Return the live status of the most recent backup and restore runs.",
|
|
"example": "curl http://localhost:5001/api/shopdbbackups/status -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"backup": null,
|
|
"restore": null
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-supportteams",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/supportteams",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "List support teams (with contacts). ?active and ?teamname filters.",
|
|
"example": "curl http://localhost:5001/api/supportteams -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "teamname",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"contacts": [],
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": false,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"supportteamid": 1,
|
|
"teamname": "Retired",
|
|
"teamurl": null,
|
|
"webhookurl": null
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/supportteams",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new support team.",
|
|
"example": "curl -X POST http://localhost:5001/api/supportteams -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"createddate": "2026-01-01 00:00:00",
|
|
"modifieddate": "2026-01-01T00:00:00",
|
|
"teamname": "Legacy"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"contacts": [],
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"supportteamid": 1,
|
|
"teamname": "Controls",
|
|
"teamurl": "https://servicenow.example/group/controls",
|
|
"webhookurl": null
|
|
},
|
|
"message": "Support team created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/supportteams/<int:team_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: team_id (int)",
|
|
"purpose": "Delete a support team; 409 while any application references it.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/supportteams/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"message": "Support team deleted",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/supportteams/<int:team_id>",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: team_id (int)",
|
|
"purpose": "Get a single support team with its contacts.",
|
|
"example": "curl http://localhost:5001/api/supportteams/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"contacts": [
|
|
{
|
|
"contactid": 2,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "First",
|
|
"sortorder": 1,
|
|
"sso": "111",
|
|
"supportteamid": 1
|
|
},
|
|
{
|
|
"contactid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "Second",
|
|
"sortorder": 2,
|
|
"sso": "222",
|
|
"supportteamid": 1
|
|
}
|
|
],
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"supportteamid": 1,
|
|
"teamname": "Controls",
|
|
"teamurl": null,
|
|
"webhookurl": null
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/supportteams/<int:team_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: team_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a support team.",
|
|
"example": "curl -X PUT http://localhost:5001/api/supportteams/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"teamname": "Controls Renamed",
|
|
"teamurl": "https://x.example"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"contacts": [],
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"supportteamid": 1,
|
|
"teamname": "Controls Renamed",
|
|
"teamurl": "https://x.example",
|
|
"webhookurl": null
|
|
},
|
|
"message": "Support team updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/supportteams/<int:team_id>/contacts",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: team_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Add a contact to a support team.",
|
|
"example": "curl -X POST http://localhost:5001/api/supportteams/1/contacts -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"createddate": "2026-01-01 00:00:00",
|
|
"modifieddate": "2026-01-01T00:00:00",
|
|
"name": "LegacyOwner"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"contactid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "Second",
|
|
"sortorder": 2,
|
|
"sso": "222",
|
|
"supportteamid": 1
|
|
},
|
|
"message": "Contact created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/supportteams/<int:team_id>/contacts/<int:contact_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: team_id (int), contact_id (int)",
|
|
"purpose": "Delete a support-team contact.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/supportteams/1/contacts/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"message": "Contact deleted",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/supportteams/<int:team_id>/contacts/<int:contact_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: team_id (int), contact_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a support-team contact.",
|
|
"example": "curl -X PUT http://localhost:5001/api/supportteams/1/contacts/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"name": "First Updated"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"contactid": 2,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "First Updated",
|
|
"sortorder": 1,
|
|
"sso": "111",
|
|
"supportteamid": 1
|
|
},
|
|
"message": "Contact updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-users",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/users",
|
|
"auth": "jwt + role:admin",
|
|
"params": "not documented",
|
|
"purpose": "List all users.",
|
|
"example": "curl http://localhost:5001/api/users -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"directpermissions": [],
|
|
"email": "<redacted:person>",
|
|
"failedlogins": 0,
|
|
"firstname": "<redacted:person>",
|
|
"isactive": true,
|
|
"islocked": false,
|
|
"lastlogindate": "2026-01-01T00:00:00Z",
|
|
"lastname": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"mustchangepassword": "<redacted:secret>",
|
|
"permissions": [
|
|
"apitokens.create",
|
|
"applications.create",
|
|
"applications.delete",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"roles": [
|
|
{
|
|
"color": null,
|
|
"roleid": 1,
|
|
"rolename": "admin"
|
|
}
|
|
],
|
|
"userid": 1,
|
|
"username": "<redacted:person>"
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/users",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new user.",
|
|
"example": "curl -X POST http://localhost:5001/api/users -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"directpermissions": [
|
|
"endpoints.runscript"
|
|
],
|
|
"email": "<redacted:person>",
|
|
"password": "<redacted:secret>",
|
|
"roles": [],
|
|
"sendwelcome": false,
|
|
"username": "<redacted:person>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"directpermissions": [
|
|
"endpoints.restart"
|
|
],
|
|
"email": "<redacted:person>",
|
|
"failedlogins": 0,
|
|
"firstname": "<redacted:person>",
|
|
"isactive": true,
|
|
"islocked": false,
|
|
"lastlogindate": null,
|
|
"lastname": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"mustchangepassword": "<redacted:secret>",
|
|
"permissions": [
|
|
"applications.view",
|
|
"assets.view",
|
|
"backups.download",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"roles": [
|
|
{
|
|
"color": "#0DCAF0",
|
|
"roleid": 3,
|
|
"rolename": "technician"
|
|
}
|
|
],
|
|
"userid": 2,
|
|
"username": "<redacted:person>",
|
|
"warning": "User created but the welcome email could not be sent."
|
|
},
|
|
"message": "User created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/users/<int:userid>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: userid (int)",
|
|
"purpose": "Delete a user.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/users/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"message": "User deleted",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/users/<int:userid>",
|
|
"auth": "jwt",
|
|
"params": "path: userid (int)",
|
|
"purpose": "Get a single user.",
|
|
"example": "curl http://localhost:5001/api/users/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"directpermissions": [],
|
|
"email": "<redacted:person>",
|
|
"failedlogins": 0,
|
|
"firstname": "<redacted:person>",
|
|
"isactive": true,
|
|
"islocked": false,
|
|
"lastlogindate": "2026-01-01T00:00:00Z",
|
|
"lastname": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"mustchangepassword": "<redacted:secret>",
|
|
"permissions": [],
|
|
"roles": [],
|
|
"userid": 1,
|
|
"username": "<redacted:person>"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/users/<int:userid>",
|
|
"auth": "jwt",
|
|
"params": "path: userid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a user.",
|
|
"example": "curl -X PUT http://localhost:5001/api/users/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"password": "<redacted:secret>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"directpermissions": [],
|
|
"email": "<redacted:person>",
|
|
"failedlogins": 0,
|
|
"firstname": "<redacted:person>",
|
|
"isactive": true,
|
|
"islocked": false,
|
|
"lastlogindate": null,
|
|
"lastname": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"mustchangepassword": "<redacted:secret>",
|
|
"permissions": [],
|
|
"roles": [],
|
|
"userid": 2,
|
|
"username": "<redacted:person>"
|
|
},
|
|
"message": "User updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/users/permissions",
|
|
"auth": "jwt",
|
|
"params": "not documented",
|
|
"purpose": "List assignable permissions grouped by category.",
|
|
"example": "curl http://localhost:5001/api/users/permissions -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/users/roles",
|
|
"auth": "jwt",
|
|
"params": "not documented",
|
|
"purpose": "List all roles with their permissions.",
|
|
"example": "curl http://localhost:5001/api/users/roles -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"color": null,
|
|
"description": "Administrator",
|
|
"grantable": null,
|
|
"isadmin": true,
|
|
"isguest": false,
|
|
"permissions": [],
|
|
"roleid": 1,
|
|
"rolename": "admin",
|
|
"usercount": 1
|
|
},
|
|
{
|
|
"color": "#6C757D",
|
|
"description": "Anyone who is not signed in. Holds nothing by default; grant it a permission to open that up to people with no account.",
|
|
"grantable": [
|
|
"applications.view",
|
|
"assets.view",
|
|
"computers.view",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"isadmin": false,
|
|
"isguest": true,
|
|
"permissions": [],
|
|
"roleid": 2,
|
|
"rolename": "guest",
|
|
"usercount": 0
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/users/roles",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new role.",
|
|
"example": "curl -X POST http://localhost:5001/api/users/roles -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"color": "#ff8800",
|
|
"description": "colorful",
|
|
"permissions": [],
|
|
"rolename": "painters"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"color": "#ff8800",
|
|
"description": "colorful",
|
|
"permissions": [],
|
|
"roleid": 2,
|
|
"rolename": "painters"
|
|
},
|
|
"message": "Role created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/users/roles/<int:roleid>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: roleid (int)",
|
|
"purpose": "Delete a role.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/users/roles/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/users/roles/<int:roleid>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: roleid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a role.",
|
|
"example": "curl -X PUT http://localhost:5001/api/users/roles/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"permissions": [
|
|
"reports.view"
|
|
]
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"color": "#6C757D",
|
|
"description": "Anyone who is not signed in. Holds nothing by default; grant it a permission to open that up to people with no account.",
|
|
"permissions": [
|
|
"reports.view"
|
|
],
|
|
"roleid": 2,
|
|
"rolename": "guest"
|
|
},
|
|
"message": "Role updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "core-vendors",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/vendors",
|
|
"auth": "permission:assets.view",
|
|
"params": "not documented",
|
|
"purpose": "List all vendors.",
|
|
"example": "curl http://localhost:5001/api/vendors -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "vendor",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": null,
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"notes": null,
|
|
"supportemail": "<redacted:person>",
|
|
"supportphone": "<redacted:person>",
|
|
"vendor": "Acme",
|
|
"vendorid": 1,
|
|
"website": null
|
|
}
|
|
],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 1,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/vendors",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new vendor.",
|
|
"example": "curl -X POST http://localhost:5001/api/vendors -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"createddate": "2026-01-01 00:00:00",
|
|
"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": "<redacted:person>",
|
|
"supportphone": "<redacted:person>",
|
|
"vendor": "Unscoped Vendor",
|
|
"vendorid": 1,
|
|
"website": null
|
|
},
|
|
"message": "Vendor created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/vendors/<int:vendor_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: vendor_id (int)",
|
|
"purpose": "Delete (deactivate) a vendor.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/vendors/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/vendors/<int:vendor_id>",
|
|
"auth": "permission:assets.view",
|
|
"params": "path: vendor_id (int)",
|
|
"purpose": "Get a single vendor.",
|
|
"example": "curl http://localhost:5001/api/vendors/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/vendors/<int:vendor_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: vendor_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a vendor.",
|
|
"example": "curl -X PUT http://localhost:5001/api/vendors/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "plugin-backups",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/backups/asset/<int:assetid>",
|
|
"auth": "permission:backups.view",
|
|
"params": "path: assetid (int)",
|
|
"purpose": "Revision history for one asset, newest first.",
|
|
"example": "curl http://localhost:5001/api/backups/asset/1 -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "kind",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/backups/asset/<int:assetid>/info",
|
|
"auth": "permission:backups.view",
|
|
"params": "path: assetid (int)",
|
|
"purpose": "A kind's 'at a glance' card, built from its LATEST revision.",
|
|
"example": "curl http://localhost:5001/api/backups/asset/1/info -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "kind",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/backups/dashboard/stale",
|
|
"auth": "permission:backups.view",
|
|
"params": "not documented",
|
|
"purpose": "Chains whose backup has stopped running.",
|
|
"example": "curl http://localhost:5001/api/backups/dashboard/stale -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/backups/kinds",
|
|
"auth": "permission:backups.view",
|
|
"params": "not documented",
|
|
"purpose": "Registered backup kinds, for UI that needs to enumerate them.",
|
|
"example": "curl http://localhost:5001/api/backups/kinds -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"assettypes": [
|
|
"machine"
|
|
],
|
|
"displayname": "<redacted:person>",
|
|
"formats": [
|
|
{
|
|
"ext": ".reg",
|
|
"hint": "Restore with the Load... button in the NTLARS settings dialog.",
|
|
"id": "ntlars",
|
|
"label": "NTLARS Load... (.reg)",
|
|
"mimetype": "application/octet-stream"
|
|
},
|
|
{
|
|
"ext": ".reg",
|
|
"hint": "Use when importing outside NTLARS on a 64-bit machine.",
|
|
"id": "wow6432node",
|
|
"label": "Direct reg import (.reg, WOW6432Node)",
|
|
"mimetype": "application/octet-stream"
|
|
}
|
|
],
|
|
"key": "ntlars",
|
|
"storagebackend": "shopdb"
|
|
},
|
|
{
|
|
"assettypes": [
|
|
"machine"
|
|
],
|
|
"displayname": "<redacted:person>",
|
|
"formats": [],
|
|
"key": "partmarker",
|
|
"storagebackend": "share"
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/backups/revisions/<int:backuprevisionid>",
|
|
"auth": "permission:backups.view",
|
|
"params": "path: backuprevisionid (int)",
|
|
"purpose": "One revision, including its parsed payload where there is one.",
|
|
"example": "curl http://localhost:5001/api/backups/revisions/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/backups/revisions/<int:backuprevisionid>/diff",
|
|
"auth": "permission:backups.view",
|
|
"params": "path: backuprevisionid (int)",
|
|
"purpose": "Diff two revisions of the same asset+kind.",
|
|
"example": "curl http://localhost:5001/api/backups/revisions/1/diff -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "against",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"againstid": 1,
|
|
"backuprevisionid": 2,
|
|
"changecount": 1,
|
|
"changes": [
|
|
{
|
|
"after": "OKUMA",
|
|
"aftertype": "REG_SZ",
|
|
"before": "",
|
|
"beforetype": "REG_SZ",
|
|
"change": "changed",
|
|
"keypath": "General",
|
|
"valuename": "Cnc"
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/backups/revisions/<int:backuprevisionid>/download",
|
|
"auth": "permission:backups.download",
|
|
"params": "path: backuprevisionid (int)",
|
|
"purpose": "Render a revision back to its native file format.",
|
|
"example": "curl http://localhost:5001/api/backups/revisions/1/download -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "format",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "plugin-computers",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers",
|
|
"auth": "permission:computers.view",
|
|
"params": "not documented",
|
|
"purpose": "List all computers with filtering and pagination.",
|
|
"example": "curl http://localhost:5001/api/computers -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "assetnumber",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "businessunit_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "businessunitid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "dir",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "asc"
|
|
},
|
|
{
|
|
"name": "location_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "locationid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "os_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "osid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "shopfloor",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "sort",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "hostname"
|
|
},
|
|
{
|
|
"name": "type_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "typeid",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"accessmethods": [],
|
|
"assetid": 1,
|
|
"assetnumber": "PC-1",
|
|
"assettypecolor": null,
|
|
"assettypeid": 1,
|
|
"assettypename": "computer",
|
|
"businessunitid": null,
|
|
"computer": {
|
|
"accessprotocolnames": [],
|
|
"assetid": 1,
|
|
"azuredevicecategory": null,
|
|
"azuredeviceid": null,
|
|
"azureobjectid": null,
|
|
"computerid": 1,
|
|
"computertypeid": 1,
|
|
"computertypename": "Standard",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"hostname": "<redacted:host>",
|
|
"isactive": true,
|
|
"lastboottime": null,
|
|
"lastreporteddate": null,
|
|
"loggedinuser": null,
|
|
"modelnumberid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"osid": null,
|
|
"vendorid": null
|
|
},
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
}
|
|
],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 1,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/computers",
|
|
"auth": "permission:computers.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create new computer (creates both Asset and Computer records).",
|
|
"example": "curl -X POST http://localhost:5001/api/computers -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"assetnumber": "PC-IMPORT-1",
|
|
"createddate": "2026-01-01 00:00:00",
|
|
"hostname": "<redacted:host>",
|
|
"modifieddate": "2026-01-01T00:00:00"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"accessmethods": [],
|
|
"assetid": 1,
|
|
"assetnumber": "AUDIT-PC-1",
|
|
"assettypecolor": null,
|
|
"assettypeid": 1,
|
|
"assettypename": "computer",
|
|
"businessunitid": null,
|
|
"computer": {
|
|
"accessprotocolnames": [],
|
|
"assetid": 1,
|
|
"azuredevicecategory": null,
|
|
"azuredeviceid": null,
|
|
"azureobjectid": null,
|
|
"computerid": 1,
|
|
"computertypeid": null,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"hostname": "<redacted:host>",
|
|
"isactive": true,
|
|
"lastboottime": null,
|
|
"lastreporteddate": null,
|
|
"loggedinuser": null,
|
|
"modelnumberid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"osid": null,
|
|
"vendorid": null
|
|
},
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"statuscolor": null,
|
|
"statusid": 1,
|
|
"statusname": "In Use"
|
|
},
|
|
"message": "Computer created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/computers/<int:computer_id>",
|
|
"auth": "permission:computers.delete",
|
|
"params": "path: computer_id (int)",
|
|
"purpose": "Delete (soft delete) computer.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/computers/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/<int:computer_id>",
|
|
"auth": "permission:computers.view",
|
|
"params": "path: computer_id (int)",
|
|
"purpose": "Get a single computer with full details.",
|
|
"example": "curl http://localhost:5001/api/computers/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"accessmethods": [],
|
|
"assetid": 1,
|
|
"assetnumber": "PC-2001",
|
|
"assettypecolor": null,
|
|
"assettypeid": 1,
|
|
"assettypename": "computer",
|
|
"businessunitid": null,
|
|
"communications": [],
|
|
"computer": {
|
|
"accessprotocolnames": [],
|
|
"assetid": 1,
|
|
"azuredevicecategory": null,
|
|
"azuredeviceid": null,
|
|
"azureobjectid": null,
|
|
"computerid": 1,
|
|
"computertypeid": null,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"hostname": "<redacted:host>",
|
|
"imageurl": "/api/models/images/model-1.png",
|
|
"isactive": true,
|
|
"lastboottime": null,
|
|
"lastreporteddate": null,
|
|
"loggedinuser": null,
|
|
"modelname": "IMG-MODEL-1",
|
|
"modelnumberid": 1,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"osid": null,
|
|
"vendorid": null
|
|
},
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/computers/<int:computer_id>",
|
|
"auth": "permission:computers.edit",
|
|
"params": "path: computer_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update computer (both Asset and Computer records).",
|
|
"example": "curl -X PUT http://localhost:5001/api/computers/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"gaugelabreference": "GL-2",
|
|
"maintenancereference": "MNT-2"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"accessmethods": [
|
|
{
|
|
"id": 1,
|
|
"link": "rdp://auditpc1",
|
|
"name": "RDP",
|
|
"port": null,
|
|
"portoverride": null,
|
|
"protocolid": 1,
|
|
"scheme": "rdp"
|
|
}
|
|
],
|
|
"assetid": 1,
|
|
"assetnumber": "AUDIT-PC-1",
|
|
"assettypecolor": null,
|
|
"assettypeid": 1,
|
|
"assettypename": "computer",
|
|
"businessunitid": null,
|
|
"computer": {
|
|
"accessprotocolnames": [
|
|
"RDP"
|
|
],
|
|
"assetid": 1,
|
|
"azuredevicecategory": null,
|
|
"azuredeviceid": null,
|
|
"azureobjectid": null,
|
|
"computerid": 1,
|
|
"computertypeid": null,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"hostname": "<redacted:host>",
|
|
"isactive": true,
|
|
"lastboottime": null,
|
|
"lastreporteddate": null,
|
|
"loggedinuser": null,
|
|
"modelnumberid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"osid": null,
|
|
"vendorid": null
|
|
},
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"statuscolor": null,
|
|
"statusid": 1,
|
|
"statusname": "In Use"
|
|
},
|
|
"message": "Computer updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/<int:computer_id>/apps",
|
|
"auth": "permission:computers.view",
|
|
"params": "path: computer_id (int)",
|
|
"purpose": "Get all installed applications for a computer.",
|
|
"example": "curl http://localhost:5001/api/computers/1/apps -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/computers/<int:computer_id>/apps",
|
|
"auth": "permission:computers.create",
|
|
"params": "path: computer_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Add an installed application to a computer.",
|
|
"example": "curl -X POST http://localhost:5001/api/computers/1/apps -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/computers/<int:computer_id>/apps/<int:app_id>",
|
|
"auth": "permission:computers.delete",
|
|
"params": "path: computer_id (int), app_id (int)",
|
|
"purpose": "Remove an installed application from a computer.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/computers/1/apps/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/computers/<int:computer_id>/report",
|
|
"auth": "permission:computers.create",
|
|
"params": "path: computer_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Report computer status (for agent-based reporting).",
|
|
"example": "curl -X POST http://localhost:5001/api/computers/1/report -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/asset/<int:asset_id>/policypanel",
|
|
"auth": "permission:computers.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Keyvalue panel: which policy governs this endpoint, and what it allows.",
|
|
"example": "curl http://localhost:5001/api/computers/asset/1/policypanel -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/by-asset/<int:asset_id>",
|
|
"auth": "permission:computers.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Get computer data by asset ID.",
|
|
"example": "curl http://localhost:5001/api/computers/by-asset/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/by-hostname/<hostname>",
|
|
"auth": "permission:computers.view",
|
|
"params": "path: hostname (string)",
|
|
"purpose": "Get computer by hostname.",
|
|
"example": "curl http://localhost:5001/api/computers/by-hostname/x -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/client-script",
|
|
"auth": "jwt + role:admin",
|
|
"params": "not documented",
|
|
"purpose": "The collector reporter, stamped with THIS site's values.",
|
|
"example": "curl http://localhost:5001/api/computers/client-script -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/dashboard/quiet",
|
|
"auth": "permission:computers.view",
|
|
"params": "not documented",
|
|
"purpose": "PCs that WERE reporting, have stopped, and are still meant to be in use.",
|
|
"example": "curl http://localhost:5001/api/computers/dashboard/quiet -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"computerid": 2,
|
|
"hostname": "<redacted:host>",
|
|
"lastreported": "2026-01-01T00:00:00.000000Z",
|
|
"quietdays": 9
|
|
},
|
|
{
|
|
"computerid": 1,
|
|
"hostname": "<redacted:host>",
|
|
"lastreported": "2026-01-01T00:00:00.000000Z",
|
|
"quietdays": 2
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/dashboard/sharedmachines",
|
|
"auth": "permission:computers.view",
|
|
"params": "not documented",
|
|
"purpose": "Machine numbers claimed by more than one PC, with nothing filed under them.",
|
|
"example": "curl http://localhost:5001/api/computers/dashboard/sharedmachines -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"assetid": 1,
|
|
"machinenumber": "2026",
|
|
"pccount": 2,
|
|
"pcs": "PCONE, PCTWO"
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/dashboard/summary",
|
|
"auth": "permission:computers.view",
|
|
"params": "not documented",
|
|
"purpose": "Get computer dashboard summary data.",
|
|
"example": "curl http://localhost:5001/api/computers/dashboard/summary -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"byos": [],
|
|
"bytype": [],
|
|
"nonshopfloor": 0,
|
|
"shopfloor": 0,
|
|
"total": 0
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/display-kiosks",
|
|
"auth": "permission:computers.view",
|
|
"params": "not documented",
|
|
"purpose": "Reporting display kiosks, for the Dashboard Defaults picker.",
|
|
"example": "curl http://localhost:5001/api/computers/display-kiosks -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"computerid": 1,
|
|
"fqdn": "<redacted:host>",
|
|
"hostname": "<redacted:host>",
|
|
"serialnumber": "<redacted:host>"
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/policies/actions",
|
|
"auth": "permission:computers.view",
|
|
"params": "not documented",
|
|
"purpose": "The allowlisted action names + labels a policy may reference.",
|
|
"example": "curl http://localhost:5001/api/computers/policies/actions -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"action": "service_start",
|
|
"description": "Start a Windows service by name on the endpoint.",
|
|
"kind": "command",
|
|
"label": "Start service",
|
|
"mayauthor": true,
|
|
"requiredpermission": null
|
|
},
|
|
{
|
|
"action": "service_stop",
|
|
"description": "Stop a running Windows service by name on the endpoint.",
|
|
"kind": "command",
|
|
"label": "Stop service",
|
|
"mayauthor": true,
|
|
"requiredpermission": null
|
|
},
|
|
{
|
|
"action": "service_status",
|
|
"description": "Report whether a named Windows service is running.",
|
|
"kind": "command",
|
|
"label": "Check service",
|
|
"mayauthor": true,
|
|
"requiredpermission": null
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/policies/business",
|
|
"auth": "permission:computers.view",
|
|
"params": "not documented",
|
|
"purpose": "UNDOCUMENTED: computers.list_business_policies has no docstring.",
|
|
"example": "curl http://localhost:5001/api/computers/policies/business -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/computers/policies/business",
|
|
"auth": "permission:computers.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: computers.create_business_policy has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/computers/policies/business -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/computers/policies/business/<int:policy_id>",
|
|
"auth": "permission:computers.delete",
|
|
"params": "path: policy_id (int)",
|
|
"purpose": "UNDOCUMENTED: computers.delete_business_policy has no docstring.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/computers/policies/business/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/policies/business/<int:policy_id>",
|
|
"auth": "permission:computers.view",
|
|
"params": "path: policy_id (int)",
|
|
"purpose": "UNDOCUMENTED: computers.get_business_policy has no docstring.",
|
|
"example": "curl http://localhost:5001/api/computers/policies/business/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/computers/policies/business/<int:policy_id>",
|
|
"auth": "permission:computers.edit",
|
|
"params": "path: policy_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: computers.update_business_policy has no docstring.",
|
|
"example": "curl -X PUT http://localhost:5001/api/computers/policies/business/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/policies/configuration",
|
|
"auth": "permission:computers.view",
|
|
"params": "not documented",
|
|
"purpose": "UNDOCUMENTED: computers.list_configuration_policies has no docstring.",
|
|
"example": "curl http://localhost:5001/api/computers/policies/configuration -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/computers/policies/configuration",
|
|
"auth": "permission:computers.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: computers.create_configuration_policy has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/computers/policies/configuration -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"actions": [
|
|
{
|
|
"action": "run_script"
|
|
}
|
|
],
|
|
"name": "Legitimate"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"actions": [
|
|
{
|
|
"action": "run_script",
|
|
"configurationpolicyactionid": 1,
|
|
"configurationpolicyid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"desiredstate": null,
|
|
"intervalminutes": null,
|
|
"isactive": true,
|
|
"mode": "gate",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"params": null,
|
|
"sortorder": 0
|
|
}
|
|
],
|
|
"configurationpolicyid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": null,
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "Legitimate",
|
|
"scopejson": null,
|
|
"source": "local"
|
|
},
|
|
"message": "Configuration policy created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/computers/policies/configuration/<int:policy_id>",
|
|
"auth": "permission:computers.delete",
|
|
"params": "path: policy_id (int)",
|
|
"purpose": "UNDOCUMENTED: computers.delete_configuration_policy has no docstring.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/computers/policies/configuration/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/policies/configuration/<int:policy_id>",
|
|
"auth": "permission:computers.view",
|
|
"params": "path: policy_id (int)",
|
|
"purpose": "UNDOCUMENTED: computers.get_configuration_policy has no docstring.",
|
|
"example": "curl http://localhost:5001/api/computers/policies/configuration/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/computers/policies/configuration/<int:policy_id>",
|
|
"auth": "permission:computers.edit",
|
|
"params": "path: policy_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: computers.update_configuration_policy has no docstring.",
|
|
"example": "curl -X PUT http://localhost:5001/api/computers/policies/configuration/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"description": "clearer wording",
|
|
"name": "New Name"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"actions": [
|
|
{
|
|
"action": "run_script",
|
|
"configurationpolicyactionid": 1,
|
|
"configurationpolicyid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"desiredstate": null,
|
|
"intervalminutes": null,
|
|
"isactive": true,
|
|
"mode": "gate",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"params": null,
|
|
"sortorder": 0
|
|
}
|
|
],
|
|
"configurationpolicyid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": "clearer wording",
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "New Name",
|
|
"scopejson": null,
|
|
"source": "local"
|
|
},
|
|
"message": "Configuration policy updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/policies/effective/<int:asset_id>",
|
|
"auth": "permission:computers.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Preview the resolved effective policy for one endpoint (debug/UI).",
|
|
"example": "curl http://localhost:5001/api/computers/policies/effective/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/protocols",
|
|
"auth": "permission:computers.view",
|
|
"params": "not documented",
|
|
"purpose": "List access protocols. ?active=false includes disabled ones.",
|
|
"example": "curl http://localhost:5001/api/computers/protocols -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/computers/protocols",
|
|
"auth": "permission:computers.edit",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: computers.create_protocol has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/computers/protocols -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/computers/protocols/<int:protocol_id>",
|
|
"auth": "permission:computers.edit",
|
|
"params": "path: protocol_id (int)",
|
|
"purpose": "UNDOCUMENTED: computers.delete_protocol has no docstring.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/computers/protocols/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PATCH|PUT",
|
|
"path": "/api/computers/protocols/<int:protocol_id>",
|
|
"auth": "permission:computers.edit",
|
|
"params": "path: protocol_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: computers.update_protocol has no docstring.",
|
|
"example": "curl -X PATCH http://localhost:5001/api/computers/protocols/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/types",
|
|
"auth": "permission:computers.view",
|
|
"params": "not documented",
|
|
"purpose": "List all computer types.",
|
|
"example": "curl http://localhost:5001/api/computers/types -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/computers/types",
|
|
"auth": "permission:computers.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new computer type.",
|
|
"example": "curl -X POST http://localhost:5001/api/computers/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/computers/types/<int:type_id>",
|
|
"auth": "permission:computers.delete",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "Delete a computer type. Refused if any PC still uses it.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/computers/types/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/computers/types/<int:type_id>",
|
|
"auth": "permission:computers.view",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "Get a single computer type.",
|
|
"example": "curl http://localhost:5001/api/computers/types/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/computers/types/<int:type_id>",
|
|
"auth": "permission:computers.edit",
|
|
"params": "path: type_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a computer type.",
|
|
"example": "curl -X PUT http://localhost:5001/api/computers/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "plugin-employees",
|
|
"endpoints": [
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/employees/<int:sso>/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/<int:sso>/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/<int:sso>",
|
|
"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/<int:sso>",
|
|
"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/<sso>",
|
|
"auth": "permission:employees.view",
|
|
"params": "path: sso (string)",
|
|
"purpose": "Look up a single employee by SSO.",
|
|
"example": "curl http://localhost:5001/api/employees/lookup/x -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"First_Name": "Test",
|
|
"Last_Name": "Person",
|
|
"Picture": null,
|
|
"Role": null,
|
|
"SSO": 210000001,
|
|
"Team": null,
|
|
"photofilename": "photo-210000001.png",
|
|
"photourl": "/api/employees/photo/photo-210000001.png"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/employees/photo/<path:filename>",
|
|
"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/<sso>",
|
|
"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": "<redacted:secret>",
|
|
"domain": null,
|
|
"endpointstateid": 6,
|
|
"health": {
|
|
"label": "ok",
|
|
"level": "ok"
|
|
},
|
|
"hostname": "<redacted:host>",
|
|
"idleseconds": null,
|
|
"lastboottime": null,
|
|
"lastreportedat": "2026-01-01T00:00:00.000000Z",
|
|
"loggedinuser": null,
|
|
"machines": [],
|
|
"memorypercent": null,
|
|
"mtconnectcheckedat": null,
|
|
"mtconnectrunning": null,
|
|
"pendingreboot": null,
|
|
"status": "reporting",
|
|
"trayversion": null,
|
|
"uptimedisplay": null,
|
|
"uptimeseconds": null
|
|
},
|
|
{
|
|
"agentversion": "1.20.0",
|
|
"alias": "SHARED",
|
|
"assetid": 5,
|
|
"assetnumber": "SHARED",
|
|
"computerid": 5,
|
|
"computertype": null,
|
|
"computertypeid": null,
|
|
"cpupercent": null,
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"credentialstate": "<redacted:secret>",
|
|
"domain": null,
|
|
"endpointstateid": 5,
|
|
"health": {
|
|
"label": "ok",
|
|
"level": "ok"
|
|
},
|
|
"hostname": "<redacted:host>",
|
|
"idleseconds": null,
|
|
"lastboottime": null,
|
|
"lastreportedat": "2026-01-01T00:00:00.000000Z",
|
|
"loggedinuser": null,
|
|
"machines": [],
|
|
"memorypercent": null,
|
|
"mtconnectcheckedat": null,
|
|
"mtconnectrunning": null,
|
|
"pendingreboot": null,
|
|
"status": "reporting",
|
|
"trayversion": null,
|
|
"uptimedisplay": null,
|
|
"uptimeseconds": null
|
|
}
|
|
],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 2,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/",
|
|
"auth": "permission:endpoints.fleet",
|
|
"params": "not documented",
|
|
"purpose": "List reported endpoint states.",
|
|
"example": "curl http://localhost:5001/api/endpoints/ -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "businessunitid",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "computertypeid",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "credentialstate",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "locationid",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "sort",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "status",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"agentversion": null,
|
|
"alias": "Bay 3 Controller",
|
|
"assetid": 1,
|
|
"assetnumber": "fleetbox",
|
|
"computerid": 1,
|
|
"computertype": null,
|
|
"computertypeid": null,
|
|
"cpupercent": null,
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"credentialstate": "<redacted:secret>",
|
|
"domain": null,
|
|
"endpointstateid": 1,
|
|
"health": {
|
|
"label": "no agent",
|
|
"level": "unknown"
|
|
},
|
|
"hostname": "<redacted:host>",
|
|
"idleseconds": null,
|
|
"lastboottime": null,
|
|
"lastreportedat": null,
|
|
"loggedinuser": null,
|
|
"machines": [],
|
|
"memorypercent": null,
|
|
"mtconnectcheckedat": null,
|
|
"mtconnectrunning": null,
|
|
"pendingreboot": null,
|
|
"status": "never",
|
|
"trayversion": null,
|
|
"uptimedisplay": null,
|
|
"uptimeseconds": null
|
|
}
|
|
],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 1,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/<int:asset_id>",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Get the current state for one endpoint by asset id.",
|
|
"example": "curl http://localhost:5001/api/endpoints/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"actionminimums": {
|
|
"collect_log": "1.16.0"
|
|
},
|
|
"agentcurrent": "1.6.3",
|
|
"agentversion": "1.20.0",
|
|
"assetid": 2,
|
|
"cpupercent": null,
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"credential": {
|
|
"credentialprefix": "<redacted:secret>",
|
|
"enrolledvia": "auto",
|
|
"issuedat": "2026-01-01T00:00:00.000000Z",
|
|
"lastusedat": "2026-01-01T00:00:00.000000Z",
|
|
"reenrollblocked": true,
|
|
"reenrollblockedreason": "rollback",
|
|
"revokedat": "2026-01-01T00:00:00.000000Z",
|
|
"state": "reenrollblocked",
|
|
"statelabel": "Re-enroll blocked"
|
|
},
|
|
"domain": null,
|
|
"endpointstateid": 2,
|
|
"hostname": "<redacted:host>",
|
|
"idleseconds": null,
|
|
"lastboottime": null,
|
|
"lastreportedat": "2026-01-01T00:00:00.000000Z",
|
|
"loggedinuser": null,
|
|
"memorypercent": null,
|
|
"mtconnectcheckedat": null,
|
|
"mtconnectrunning": null,
|
|
"pendingreboot": null,
|
|
"status": "reporting",
|
|
"trayversion": null,
|
|
"uptimedisplay": null,
|
|
"uptimeseconds": null
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/<int:asset_id>/agentupgrade",
|
|
"auth": "permission:endpoints.agentupdate",
|
|
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Push the published agent build to one endpoint.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/1/agentupgrade -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"action": "run_script",
|
|
"target": "script:1"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"action": "run_script",
|
|
"assetid": 1,
|
|
"claimedat": null,
|
|
"completedat": null,
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"endpointcommandid": 1,
|
|
"requestedby": "<redacted:person>",
|
|
"resultmessage": null,
|
|
"status": "pending",
|
|
"target": "script:1",
|
|
"targetkind": "script"
|
|
},
|
|
"message": "Command queued",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/<int:asset_id>/commands",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Recent commands for one endpoint, newest first (operator view).",
|
|
"example": "curl http://localhost:5001/api/endpoints/1/commands -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/<int:asset_id>/commands",
|
|
"auth": "permission:endpoints.command",
|
|
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Queue an allowlisted command for one endpoint.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/1/commands -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"action": "service_status",
|
|
"overridereason": "line down, need status",
|
|
"policyoverride": true,
|
|
"target": "spooler"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"action": "collect_log",
|
|
"assetid": 1,
|
|
"claimedat": null,
|
|
"completedat": null,
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"endpointcommandid": 1,
|
|
"requestedby": "<redacted:person>",
|
|
"resultmessage": null,
|
|
"status": "pending",
|
|
"target": "C:\\logs\\app.log",
|
|
"targetkind": "logpath"
|
|
},
|
|
"message": "Command queued",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/<int:asset_id>/events",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "List curated Windows events for one endpoint, newest first.",
|
|
"example": "curl http://localhost:5001/api/endpoints/1/events -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "eventid",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/<int:asset_id>/holdableactions",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Desired-mode actions on this endpoint, with current hold state.",
|
|
"example": "curl http://localhost:5001/api/endpoints/1/holdableactions -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"action": "service_start",
|
|
"held": false
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/endpoints/<int:asset_id>/lock",
|
|
"auth": "permission:endpoints.command",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Lift the quarantine on this endpoint.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/endpoints/1/lock -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/<int:asset_id>/lock",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "The endpoint lock standing on this endpoint, or null.",
|
|
"example": "curl http://localhost:5001/api/endpoints/1/lock -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"endpointlockid": 1,
|
|
"lockedat": "2026-01-01T00:00:00.000000Z",
|
|
"lockedbyuserid": 1,
|
|
"lockedbyusername": "<redacted:person>",
|
|
"reason": "visible to all",
|
|
"releasedat": null,
|
|
"releasedbyusername": "<redacted:person>"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/<int:asset_id>/lock",
|
|
"auth": "permission:endpoints.command",
|
|
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Quarantine this endpoint against non-admin commands.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/1/lock -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"reason": "locked but still reconciled"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"endpointlockid": 1,
|
|
"lockedat": "2026-01-01T00:00:00.000000Z",
|
|
"lockedbyuserid": 1,
|
|
"lockedbyusername": "<redacted:person>",
|
|
"reason": "locked but still reconciled",
|
|
"releasedat": null,
|
|
"releasedbyusername": "<redacted:person>"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/<int:asset_id>/logcollections",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Collected-log history for one endpoint, newest first.",
|
|
"example": "curl http://localhost:5001/api/endpoints/1/logcollections -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/<int:asset_id>/policyholds",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Active break-glass holds for one endpoint.",
|
|
"example": "curl http://localhost:5001/api/endpoints/1/policyholds -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"action": "service_stop",
|
|
"createdbyusername": "<redacted:person>",
|
|
"expiresat": "2026-01-01T00:00:00.000000",
|
|
"reason": "vendor on site"
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/<int:asset_id>/policyholds",
|
|
"auth": "permission:endpoints.command",
|
|
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Deliberately suspend desired-state reconciliation for one or more actions.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/1/policyholds -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"actions": [
|
|
"service_start",
|
|
"service_stop"
|
|
],
|
|
"minutes": 60,
|
|
"reason": "stripping the enclosure"
|
|
},
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"action": "service_stop",
|
|
"createdbyusername": "<redacted:person>",
|
|
"expiresat": "2026-01-01T00:00:00.000000",
|
|
"reason": "stripping the enclosure"
|
|
},
|
|
{
|
|
"action": "service_start",
|
|
"createdbyusername": "<redacted:person>",
|
|
"expiresat": "2026-01-01T00:00:00.000000",
|
|
"reason": "stripping the enclosure"
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/endpoints/<int:asset_id>/policyholds/<action>",
|
|
"auth": "permission:endpoints.command",
|
|
"params": "path: asset_id (int), action (string)",
|
|
"purpose": "End a hold early, resuming reconciliation of one action.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/endpoints/1/policyholds/x -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/<int:asset_id>/scriptruns",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "The last few run_script commands for one endpoint, newest first.",
|
|
"example": "curl http://localhost:5001/api/endpoints/1/scriptruns -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "limit",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 5
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"action": "run_script",
|
|
"assetid": 1,
|
|
"claimedat": null,
|
|
"completedat": null,
|
|
"createdat": "2026-01-01T00:00:00Z",
|
|
"endpointcommandid": 6,
|
|
"requestedby": "<redacted:person>",
|
|
"resultdetail": null,
|
|
"resultmessage": null,
|
|
"scriptname": "test-open-notepad",
|
|
"status": "succeeded",
|
|
"target": "script:1",
|
|
"targetkind": null
|
|
},
|
|
{
|
|
"action": "run_script",
|
|
"assetid": 1,
|
|
"claimedat": null,
|
|
"completedat": null,
|
|
"createdat": "2026-01-01T00:00:00Z",
|
|
"endpointcommandid": 5,
|
|
"requestedby": "<redacted:person>",
|
|
"resultdetail": null,
|
|
"resultmessage": null,
|
|
"scriptname": "test-open-notepad",
|
|
"status": "succeeded",
|
|
"target": "script:1",
|
|
"targetkind": null
|
|
},
|
|
{
|
|
"action": "run_script",
|
|
"assetid": 1,
|
|
"claimedat": null,
|
|
"completedat": null,
|
|
"createdat": "2026-01-01T00:00:00Z",
|
|
"endpointcommandid": 4,
|
|
"requestedby": "<redacted:person>",
|
|
"resultdetail": null,
|
|
"resultmessage": null,
|
|
"scriptname": "test-open-notepad",
|
|
"status": "succeeded",
|
|
"target": "script:1",
|
|
"targetkind": null
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/adoptiontool/package",
|
|
"auth": "permission:endpoints.agentpackage",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Bundle the adoption tool as a downloadable ZIP.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/adoptiontool/package -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/endpoints/agentkey",
|
|
"auth": "jwt + role:admin",
|
|
"params": "not documented",
|
|
"purpose": "Revoke the endpoint agent key: stop all managed-token endpoint traffic.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/endpoints/agentkey -H \"Authorization: Bearer $TOK\"",
|
|
"requestexample": {},
|
|
"responseexample": {
|
|
"data": {
|
|
"envkeyfallback": true,
|
|
"key": null,
|
|
"provisioned": false,
|
|
"revoked": 0
|
|
},
|
|
"message": "Endpoint agent key revoked",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/agentkey",
|
|
"auth": "jwt + role:admin",
|
|
"params": "not documented",
|
|
"purpose": "Report the endpoint agent key state (no secret).",
|
|
"example": "curl http://localhost:5001/api/endpoints/agentkey -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/agentkey/regenerate",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Mint a fresh endpoint agent key, revoking any previous one.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/agentkey/regenerate -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {},
|
|
"responseexample": {
|
|
"data": {
|
|
"envkeyfallback": false,
|
|
"key": {
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"displayprefix": "<redacted:secret>",
|
|
"expiresat": null,
|
|
"isactive": true,
|
|
"isexpired": false,
|
|
"lastusedat": null,
|
|
"name": "Endpoint agent key",
|
|
"resourcescopes": null,
|
|
"scopes": [
|
|
"collector.ingest.endpoints"
|
|
],
|
|
"tokenid": 1,
|
|
"tokenprefix": "<redacted:secret>",
|
|
"userid": 1
|
|
},
|
|
"provisioned": true,
|
|
"secret": "<redacted:secret>",
|
|
"warning": "Save this key now. It will not be shown again. Configure it as the agent X-API-Key."
|
|
},
|
|
"message": "Endpoint agent key generated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/alerts",
|
|
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
|
|
"params": "not documented",
|
|
"purpose": "Fleet alerts for one endpoint by hostname (collector-token auth).",
|
|
"example": "curl http://localhost:5001/api/endpoints/alerts -H \"X-API-Key: $KEY\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "hostname",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"message": "Scheduled maintenance at 3:30 PM",
|
|
"notificationId": 1,
|
|
"notificationid": 1,
|
|
"timeout": 0,
|
|
"title": "Scheduled maintenance at 3:30 PM",
|
|
"type": "Fleet Alert",
|
|
"typeColor": "#ffc107",
|
|
"typecolor": "#ffc107"
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/alerts/<int:notification_id>/acknowledge",
|
|
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
|
|
"params": "path: notification_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Agent acknowledges a fleet alert (collector-token auth).",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/alerts/1/acknowledge -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"assetid": 1,
|
|
"hostname": "<redacted:host>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"acknowledged": true
|
|
},
|
|
"message": "Alert already acknowledged",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/apppackage/<int:appversionid>",
|
|
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
|
|
"params": "path: appversionid (int)",
|
|
"purpose": "Agent-facing installer download (collector-token auth).",
|
|
"example": "curl http://localhost:5001/api/endpoints/apppackage/1 -H \"X-API-Key: $KEY\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/apppackage/app/<int:app_id>",
|
|
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
|
|
"params": "path: app_id (int)",
|
|
"purpose": "Agent-facing installer download by APP (collector-token auth).",
|
|
"example": "curl http://localhost:5001/api/endpoints/apppackage/app/1 -H \"X-API-Key: $KEY\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/apppackage/app/<int:app_id>/<path:filename>",
|
|
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
|
|
"params": "path: app_id (int), filename (path)",
|
|
"purpose": "Agent-facing installer download by APP (collector-token auth).",
|
|
"example": "curl http://localhost:5001/api/endpoints/apppackage/app/1/example.png -H \"X-API-Key: $KEY\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/activity",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "List panel: one chronological feed of what happened to this endpoint.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/activity -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/applications",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Table panel: the installed-software (SBOM) snapshot for this endpoint.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/applications -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/diskhealth",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Physical drive health rows.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/diskhealth -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/hardware",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Keyvalue panel: processor, memory and system chassis inventory.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/hardware -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/interfaces",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Table panel: every hardware NIC the agent last reported.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/interfaces -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/iphistory",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Table panel: every address this asset has held, newest change first.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/iphistory -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/listeners",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Table panel: TCP sockets in LISTEN, with the owning process.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/listeners -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/mappeddrives",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "List panel: mapped network drives with a health badge each.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/mappeddrives -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/osinfo",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Keyvalue panel: operating system, firmware and domain membership.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/osinfo -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/recentevents",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "List panel: the endpoint's most recent curated events, newest first.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/recentevents -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/services",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "List panel: monitored services/processes with a run-state badge per row.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/services -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"action": {
|
|
"running": false,
|
|
"start": "process_start",
|
|
"status": "process_status",
|
|
"stop": "process_stop",
|
|
"target": "dncMain.exe",
|
|
"targetkind": "process"
|
|
},
|
|
"drift": true,
|
|
"kind": "process",
|
|
"name": "eDNC",
|
|
"statecolor": "gray",
|
|
"statelabel": "Unknown"
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/status",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Keyvalue panel: the endpoint's current status snapshot.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/status -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"agentbehind": false,
|
|
"agentcurrent": "1.6.3",
|
|
"agentversion": "1.20.0",
|
|
"credential": {
|
|
"credentialprefix": "<redacted:secret>",
|
|
"enrolledvia": "auto",
|
|
"issuedat": "2026-01-01T00:00:00.000000Z",
|
|
"lastusedat": "2026-01-01T00:00:00.000000Z",
|
|
"reenrollblocked": true,
|
|
"reenrollblockedreason": "rollback",
|
|
"revokedat": "2026-01-01T00:00:00.000000Z",
|
|
"state": "reenrollblocked",
|
|
"statelabel": "Re-enroll blocked"
|
|
},
|
|
"fields": [
|
|
{
|
|
"label": "Agent",
|
|
"mono": true,
|
|
"value": "1.20.0"
|
|
},
|
|
{
|
|
"format": "datetime",
|
|
"label": "Last reported",
|
|
"mono": false,
|
|
"value": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
{
|
|
"label": "Credential",
|
|
"mono": false,
|
|
"value": "Re-enroll blocked"
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
]
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/storage",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Tabs panel: volume capacity and physical drive health as two sections.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/storage -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/telemetrymeta",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Lightweight freshness probe for the panels.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/telemetrymeta -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/asset/<int:asset_id>/usercontext",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Keyvalue panel: session-scoped data from the interactive user probe.",
|
|
"example": "curl http://localhost:5001/api/endpoints/asset/1/usercontext -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/collect",
|
|
"auth": "api-key (endpoints collector token)",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Agent telemetry ingest. Same handler as POST /api/collector/endpoints.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/collect -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"agentversion": "1.20.0",
|
|
"hostname": "<redacted:host>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"action": "created",
|
|
"assetid": 1,
|
|
"identityvalue": "BAY-01",
|
|
"status": "ok",
|
|
"warnings": []
|
|
},
|
|
"message": "endpoints collector created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/commands/<int:command_id>/result",
|
|
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
|
|
"params": "path: command_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Agent reports a claimed command's outcome (collector-token auth).",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/commands/1/result -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
|
|
"queryparams": [
|
|
{
|
|
"name": "hostname",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"requestexample": {
|
|
"succeeded": true
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"action": "mtconnect_status",
|
|
"assetid": 1,
|
|
"claimedat": null,
|
|
"completedat": "2026-01-01T00:00:00.000000Z",
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"endpointcommandid": 1,
|
|
"requestedby": "<redacted:person>",
|
|
"resultmessage": null,
|
|
"status": "succeeded",
|
|
"target": null,
|
|
"targetkind": null
|
|
},
|
|
"message": "Result recorded",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/commands/next",
|
|
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
|
|
"params": "not documented",
|
|
"purpose": "Agent long-poll: claim the next pending command for a hostname.",
|
|
"example": "curl http://localhost:5001/api/endpoints/commands/next -H \"X-API-Key: $KEY\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "hostname",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"action": "mtconnect_status",
|
|
"endpointcommandid": 1,
|
|
"target": null,
|
|
"targetkind": null
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/dashboard/enrollmentpending",
|
|
"auth": "permission:endpoints.fleet",
|
|
"params": "not documented",
|
|
"purpose": "One queue row while enroll requests wait for an admin, else nothing.",
|
|
"example": "curl http://localhost:5001/api/endpoints/dashboard/enrollmentpending -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"pendingcount": 2,
|
|
"summary": "2 PCs waiting for enrollment approval"
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/dashboard/quiet",
|
|
"auth": "permission:endpoints.fleet",
|
|
"params": "not documented",
|
|
"purpose": "Endpoints that reported before, then went quiet past the window.",
|
|
"example": "curl http://localhost:5001/api/endpoints/dashboard/quiet -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/dashboard/reenrollblocked",
|
|
"auth": "permission:endpoints.fleet",
|
|
"params": "not documented",
|
|
"purpose": "PCs kept from re-enrolling for more than 7 days.",
|
|
"example": "curl http://localhost:5001/api/endpoints/dashboard/reenrollblocked -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"assetid": 2,
|
|
"blockeddays": 9,
|
|
"computerid": 2,
|
|
"hostname": "<redacted:host>",
|
|
"reason": "rollback"
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/dashboard/stability",
|
|
"auth": "permission:endpoints.fleet",
|
|
"params": "not documented",
|
|
"purpose": "Endpoints with recent crash/shutdown/corruption events.",
|
|
"example": "curl http://localhost:5001/api/endpoints/dashboard/stability -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/dashboard/summary",
|
|
"auth": "permission:endpoints.fleet",
|
|
"params": "not documented",
|
|
"purpose": "High-level fleet counts for the endpoints dashboard.",
|
|
"example": "curl http://localhost:5001/api/endpoints/dashboard/summary -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/enroll",
|
|
"auth": "none (per-IP rate limited and capped; a valid fleet key only decides auto-enroll)",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "A PC asks for its own credential.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/enroll -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"agentversion": "1.20.0",
|
|
"deviceid": null,
|
|
"enrollnonce": "mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm",
|
|
"hostname": "<redacted:host>",
|
|
"serialnumber": "<redacted:host>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"credential": "<redacted:secret>",
|
|
"status": "enrolled"
|
|
},
|
|
"message": "Endpoint enrolled",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/enrollment",
|
|
"auth": "permission:endpoints.fleet",
|
|
"params": "not documented",
|
|
"purpose": "Credential state of every computer, plus pending and recent requests.",
|
|
"example": "curl http://localhost:5001/api/endpoints/enrollment -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "state",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"computers": [
|
|
{
|
|
"assetid": 1,
|
|
"credentialprefix": "<redacted:secret>",
|
|
"enrolledvia": "auto",
|
|
"hostname": "<redacted:host>",
|
|
"issuedat": "2026-01-01T00:00:00.000000Z",
|
|
"lastusedat": null,
|
|
"reenrollblocked": false,
|
|
"reenrollblockedreason": null,
|
|
"serialnumber": "<redacted:host>",
|
|
"state": "enrolled"
|
|
},
|
|
{
|
|
"assetid": 2,
|
|
"credentialprefix": "<redacted:secret>",
|
|
"enrolledvia": null,
|
|
"hostname": "<redacted:host>",
|
|
"issuedat": null,
|
|
"lastusedat": null,
|
|
"reenrollblocked": false,
|
|
"reenrollblockedreason": null,
|
|
"serialnumber": "<redacted:host>",
|
|
"state": "notenrolled"
|
|
},
|
|
{
|
|
"assetid": 3,
|
|
"credentialprefix": "<redacted:secret>",
|
|
"enrolledvia": null,
|
|
"hostname": "<redacted:host>",
|
|
"issuedat": null,
|
|
"lastusedat": null,
|
|
"reenrollblocked": false,
|
|
"reenrollblockedreason": null,
|
|
"serialnumber": "<redacted:host>",
|
|
"state": "pending"
|
|
}
|
|
],
|
|
"counts": {
|
|
"enrolled": 1,
|
|
"notenrolled": 1,
|
|
"pending": 1,
|
|
"pendingcomputers": 1
|
|
},
|
|
"requests": [
|
|
{
|
|
"agentversion": "1.20.0",
|
|
"decidedat": null,
|
|
"decidedby": null,
|
|
"deviceid": null,
|
|
"hostname": "<redacted:host>",
|
|
"lastseenat": "2026-01-01T00:00:00.000000Z",
|
|
"matchedassetid": 3,
|
|
"reason": "no serial on record",
|
|
"requestedat": "2026-01-01T00:00:00.000000Z",
|
|
"requestid": "00000000",
|
|
"serialnumber": "<redacted:host>",
|
|
"sourceip": "127.0.0.1",
|
|
"status": "pending"
|
|
},
|
|
{
|
|
"agentversion": "1.20.0",
|
|
"decidedat": null,
|
|
"decidedby": null,
|
|
"deviceid": null,
|
|
"hostname": "<redacted:host>",
|
|
"lastseenat": "2026-01-01T00:00:00.000000Z",
|
|
"matchedassetid": 1,
|
|
"reason": null,
|
|
"requestedat": "2026-01-01T00:00:00.000000Z",
|
|
"requestid": "00000000",
|
|
"serialnumber": "<redacted:host>",
|
|
"sourceip": "127.0.0.1",
|
|
"status": "issued"
|
|
}
|
|
],
|
|
"settings": {
|
|
"autoenroll": true,
|
|
"maxpendingenrollments": 500,
|
|
"revokeddeniessharedkey": false,
|
|
"sharedkeyallowed": true
|
|
}
|
|
},
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 3,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/enrollment/assets/<int:assetid>/allow-reenroll",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: assetid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Lift a re-enrollment block. The PC enrolls on its next attempt.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/enrollment/assets/1/allow-reenroll -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"credentialid": 1,
|
|
"credentialprefix": "<redacted:secret>",
|
|
"enrolledvia": "auto",
|
|
"issuedat": "2026-01-01T00:00:00.000000Z",
|
|
"lastusedat": null,
|
|
"reenrollblocked": false,
|
|
"reenrollblockedreason": null,
|
|
"revokedat": "2026-01-01T00:00:00.000000Z",
|
|
"revokedby": "testadmin"
|
|
},
|
|
"message": "Re-enrollment allowed",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/enrollment/assets/<int:assetid>/revoke",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: assetid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Un-enroll a PC. Its agent gets CREDENTIAL_INVALID and enrolls again.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/enrollment/assets/1/revoke -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"blockreenroll": true,
|
|
"reason": "rollback"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"credentialid": 1,
|
|
"credentialprefix": "<redacted:secret>",
|
|
"enrolledvia": "auto",
|
|
"issuedat": "2026-01-01T00:00:00.000000Z",
|
|
"lastusedat": null,
|
|
"reenrollblocked": true,
|
|
"reenrollblockedreason": "rollback",
|
|
"revokedat": "2026-01-01T00:00:00.000000Z",
|
|
"revokedby": "testadmin"
|
|
},
|
|
"message": "Endpoint credential revoked",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/enrollment/migration",
|
|
"auth": "permission:endpoints.fleet",
|
|
"params": "not documented",
|
|
"purpose": "Per-computer readiness to move onto per-PC credentials, plus waves.",
|
|
"example": "curl http://localhost:5001/api/endpoints/enrollment/migration -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "state",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"computers": [
|
|
{
|
|
"agentversion": "1.19.0",
|
|
"assetid": 2,
|
|
"blockers": [],
|
|
"hostname": "<redacted:host>",
|
|
"lastreportedat": "2026-01-01T00:00:00.000000Z",
|
|
"state": "ready"
|
|
},
|
|
{
|
|
"agentversion": "1.19.0",
|
|
"assetid": 3,
|
|
"blockers": [],
|
|
"hostname": "<redacted:host>",
|
|
"lastreportedat": "2026-01-01T00:00:00.000000Z",
|
|
"state": "ready"
|
|
},
|
|
{
|
|
"agentversion": "1.20.0",
|
|
"assetid": 1,
|
|
"blockers": [
|
|
"awaiting enrollment"
|
|
],
|
|
"hostname": "<redacted:host>",
|
|
"lastreportedat": "2026-01-01T00:00:00.000000Z",
|
|
"state": "blocked"
|
|
}
|
|
],
|
|
"counts": {
|
|
"blocked": 1,
|
|
"enrolled": 0,
|
|
"notreporting": 0,
|
|
"pending": 0,
|
|
"ready": 2,
|
|
"upgrading": 0
|
|
},
|
|
"target": "1.20.0",
|
|
"waves": [
|
|
{
|
|
"createdat": "2026-01-01T00:00:00Z",
|
|
"createdby": "<redacted:person>",
|
|
"done": false,
|
|
"enrolled": 0,
|
|
"failed": 1,
|
|
"queued": 3,
|
|
"size": 3,
|
|
"waveid": 1
|
|
},
|
|
{
|
|
"createdat": "2026-01-01T00:00:00Z",
|
|
"createdby": "<redacted:person>",
|
|
"done": false,
|
|
"enrolled": 0,
|
|
"failed": 0,
|
|
"queued": 2,
|
|
"size": 2,
|
|
"waveid": 2
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 3,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/enrollment/migration/wave",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Push the agent upgrade to a batch of READY PCs.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/enrollment/migration/wave -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"action": "run_script",
|
|
"target": "script:1"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"queued": [
|
|
1
|
|
],
|
|
"retried": [],
|
|
"skipped": [
|
|
{
|
|
"assetid": 2,
|
|
"reason": "offline"
|
|
},
|
|
{
|
|
"assetid": 3,
|
|
"reason": "notreporting"
|
|
},
|
|
{
|
|
"assetid": 999999,
|
|
"reason": "not a computer"
|
|
}
|
|
],
|
|
"waveid": 1
|
|
},
|
|
"message": "1 PC(s) queued",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/enrollment/requests/<int:requestid>/approve",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: requestid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Bind a pending request to the asset the admin picked.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/enrollment/requests/1/approve -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"assetid": 1,
|
|
"sethostname": "<redacted:host>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"agentversion": "1.20.0",
|
|
"decidedat": "2026-01-01T00:00:00.000000Z",
|
|
"decidedby": "testadmin",
|
|
"deviceid": null,
|
|
"hostname": "<redacted:host>",
|
|
"hostnameresult": "<redacted:host>",
|
|
"lastseenat": "2026-01-01T00:00:00.000000Z",
|
|
"matchedassetid": 1,
|
|
"reason": null,
|
|
"requestedat": "2026-01-01T00:00:00.000000Z",
|
|
"requestid": "00000000",
|
|
"serialnumber": "<redacted:host>",
|
|
"sourceip": "127.0.0.1",
|
|
"status": "approved"
|
|
},
|
|
"message": "Enroll request approved; that computer was renamed to the hostname the PC reports",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/enrollment/requests/<int:requestid>/reject",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: requestid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: endpoints.reject_enroll_request has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/enrollment/requests/1/reject -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"agentversion": "1.20.0",
|
|
"decidedat": "2026-01-01T00:00:00.000000Z",
|
|
"decidedby": "testadmin",
|
|
"deviceid": null,
|
|
"hostname": "<redacted:host>",
|
|
"lastseenat": "2026-01-01T00:00:00.000000Z",
|
|
"matchedassetid": 1,
|
|
"reason": "awaiting approval",
|
|
"requestedat": "2026-01-01T00:00:00.000000Z",
|
|
"requestid": "00000000",
|
|
"serialnumber": "<redacted:host>",
|
|
"sourceip": "127.0.0.1",
|
|
"status": "rejected"
|
|
},
|
|
"message": "Enroll request rejected",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/endpoints/enrollment/settings",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Change the enrollment settings.",
|
|
"example": "curl -X PUT http://localhost:5001/api/endpoints/enrollment/settings -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"revokeddeniessharedkey": true
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"autoenroll": true,
|
|
"maxpendingenrollments": 500,
|
|
"revokeddeniessharedkey": false,
|
|
"sharedkeyallowed": false
|
|
},
|
|
"message": "Enrollment settings saved",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/logcollections/<int:collection_id>",
|
|
"auth": "permission:endpoints.updateapp",
|
|
"params": "path: collection_id (int)",
|
|
"purpose": "One collected log including its content, for the scrollable pane.",
|
|
"example": "curl http://localhost:5001/api/endpoints/logcollections/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/logcollections/<int:collection_id>/download",
|
|
"auth": "permission:endpoints.updateapp",
|
|
"params": "path: collection_id (int)",
|
|
"purpose": "Serve a collected log as a file attachment.",
|
|
"example": "curl http://localhost:5001/api/endpoints/logcollections/1/download -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/monitors",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "not documented",
|
|
"purpose": "List monitor definitions (shipped and local).",
|
|
"example": "curl http://localhost:5001/api/endpoints/monitors -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/monitors",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a user-defined (local) monitor definition.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/monitors -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/endpoints/monitors/<int:monitor_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: monitor_id (int)",
|
|
"purpose": "Delete a local monitor definition. Shipped rows are protected.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/endpoints/monitors/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/endpoints/monitors/<int:monitor_id>",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: monitor_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a local monitor definition. Shipped rows are read-only.",
|
|
"example": "curl -X PUT http://localhost:5001/api/endpoints/monitors/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"launchpath": "D:\\Dnc\\bin\\DncMain.exe"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"datacollectorpath": null,
|
|
"displayname": "<redacted:person>",
|
|
"endpointmonitorid": 1,
|
|
"isactive": false,
|
|
"kind": "process",
|
|
"launchpath": "C:\\Program Files\\Dnc\\bin\\DncMain.exe",
|
|
"logcollectorpath": null,
|
|
"processname": "UDC",
|
|
"servicename": null,
|
|
"source": "shipped"
|
|
},
|
|
"message": "Monitor updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/monitors/resolve",
|
|
"auth": "permission:endpoints.view",
|
|
"params": "not documented",
|
|
"purpose": "Resolve the monitor set for a PC type (agent runtime fetch).",
|
|
"example": "curl http://localhost:5001/api/endpoints/monitors/resolve -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "pctype",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/monitors/resolved",
|
|
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
|
|
"params": "not documented",
|
|
"purpose": "Agent watch list: the monitors this endpoint should report on.",
|
|
"example": "curl http://localhost:5001/api/endpoints/monitors/resolved -H \"X-API-Key: $KEY\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "hostname",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"processes": [
|
|
{
|
|
"app": "Edge",
|
|
"launchpath": "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
|
|
"name": "msedge.exe"
|
|
}
|
|
],
|
|
"services": []
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/operatorreports",
|
|
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Agent uploads one operator issue report (collector-token auth).",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/operatorreports -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"details": "the CMM app will not start",
|
|
"hasimage": true,
|
|
"imagebytesize": 70,
|
|
"imagemimetype": "image/png",
|
|
"operatorreportid": 1,
|
|
"reason": "Other (free text)",
|
|
"reportedhostname": "<redacted:host>"
|
|
},
|
|
"message": "Operator report received",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/operatorreports/<int:operatorreportid>/image",
|
|
"auth": "permission:endpoints.operatorreports",
|
|
"params": "path: operatorreportid (int)",
|
|
"purpose": "Serve one operator report's screenshot.",
|
|
"example": "curl http://localhost:5001/api/endpoints/operatorreports/1/image -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/panel/<int:asset_id>/operatorreports",
|
|
"auth": "permission:endpoints.operatorreports",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Operator Reports panel: this PC's recent operator issue reports.",
|
|
"example": "curl http://localhost:5001/api/endpoints/panel/1/operatorreports -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"reports": [
|
|
{
|
|
"assetid": 1,
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"details": "second",
|
|
"hasimage": false,
|
|
"imagebytesize": null,
|
|
"imagemimetype": null,
|
|
"operatorreportid": 2,
|
|
"reason": "Other (free text)",
|
|
"reportedhostname": "<redacted:host>"
|
|
},
|
|
{
|
|
"assetid": 1,
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"details": "first",
|
|
"hasimage": false,
|
|
"imagebytesize": null,
|
|
"imagemimetype": null,
|
|
"operatorreportid": 1,
|
|
"reason": "Other (free text)",
|
|
"reportedhostname": "<redacted:host>"
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/scriptbody/<int:script_id>",
|
|
"auth": "api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)",
|
|
"params": "path: script_id (int)",
|
|
"purpose": "Agent-facing script body download (collector-token auth).",
|
|
"example": "curl http://localhost:5001/api/endpoints/scriptbody/1 -H \"X-API-Key: $KEY\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/settings/server-cert",
|
|
"auth": "jwt + role:admin",
|
|
"params": "not documented",
|
|
"purpose": "Get details about the current server certificate.",
|
|
"example": "curl http://localhost:5001/api/endpoints/settings/server-cert -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"expires_in_days": 29,
|
|
"is_self_signed": true,
|
|
"issuer": "CN = pin.example.test",
|
|
"not_after": "Oct 18 18:57:47 2026 GMT",
|
|
"not_before": "Sep 17 18:57:47 2026 GMT",
|
|
"san_list": [],
|
|
"sha1thumbprint": "<redacted:digest>",
|
|
"spkisha256": "<redacted:digest>",
|
|
"subject_cn": "pin.example.test",
|
|
"thumbprint": "99:F1:E1:1D:5A:66:EE:44:8C:CA:5C:D8:BF:EA:C3:F3:8F:82:40:D3:5E:C9:4D:F0:AC:0B:3C:AD:80:D7:C1:DF"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/settings/server-cert/download",
|
|
"auth": "permission:endpoints.fleet",
|
|
"params": "not documented",
|
|
"purpose": "The PUBLIC server certificate as a DER .cer file, never the key.",
|
|
"example": "curl http://localhost:5001/api/endpoints/settings/server-cert/download -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/settings/server-cert/generate",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Generate a new self-signed server certificate.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/settings/server-cert/generate -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"cn": "shopdb.example.test",
|
|
"days": 30,
|
|
"san": "<redacted:address>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"message": "Certificate generated successfully. Nginx is restarting."
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/settings/server-cert/live",
|
|
"auth": "permission:endpoints.fleet",
|
|
"params": "not documented",
|
|
"purpose": "The certificate PCs actually receive from this site's public address.",
|
|
"example": "curl http://localhost:5001/api/endpoints/settings/server-cert/live -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"configured": true,
|
|
"error": "Could not read the certificate from shopdb.example.test:443 (Connection refused)",
|
|
"matchesfile": false,
|
|
"presentedsha1thumbprint": null,
|
|
"presentedspkisha256": null,
|
|
"url": "https://shopdb.example.test"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/settings/server-cert/upload",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Upload a new server certificate and private key.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/settings/server-cert/upload -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"message": "Certificate uploaded successfully. Nginx is restarting."
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/siteagent",
|
|
"auth": "permission:endpoints.agentpackage",
|
|
"params": "not documented",
|
|
"purpose": "Report whether the site agent build has a prebuilt binary staged.",
|
|
"example": "curl http://localhost:5001/api/endpoints/siteagent -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"agentcurrent": null,
|
|
"agentlegacy": null,
|
|
"agentstaged": false,
|
|
"agentversions": [],
|
|
"certavailable": true,
|
|
"serverpin": "<redacted:digest>",
|
|
"sharedkeyallowed": false,
|
|
"traycurrent": null,
|
|
"traylegacy": null,
|
|
"traystaged": false,
|
|
"trayversions": []
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/siteagent/binaries/<binkey>",
|
|
"auth": "permission:endpoints.agentpackage",
|
|
"params": "path: binkey (string)",
|
|
"purpose": "List staged versions for a binary (agent or tray), newest first.",
|
|
"example": "curl http://localhost:5001/api/endpoints/siteagent/binaries/x -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/siteagent/binaries/<binkey>",
|
|
"auth": "permission:endpoints.agentpackage",
|
|
"params": "path: binkey (string); body: JSON (fields not yet documented)",
|
|
"purpose": "Stage an uploaded binary as a new version.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/siteagent/binaries/x -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"binary": "agent",
|
|
"current": "<redacted:address>",
|
|
"registration": {
|
|
"agentversion": "<redacted:address>",
|
|
"appid": 1,
|
|
"appname": "ShopDB Endpoint Agent",
|
|
"contents": {
|
|
"agent": {
|
|
"filename": "shopdbagent.exe",
|
|
"sha256": "<redacted:digest>",
|
|
"version": "<redacted:address>"
|
|
}
|
|
},
|
|
"created": false,
|
|
"installpath": "/api/applications/package/1/shopdb-endpoint-agent.zip",
|
|
"ok": true,
|
|
"sha256": "<redacted:digest>",
|
|
"size": 135
|
|
},
|
|
"versions": [
|
|
{
|
|
"iscurrent": true,
|
|
"size": 130,
|
|
"uploadedat": "2026-01-01T00:00:00.000000Z",
|
|
"version": "<redacted:address>"
|
|
},
|
|
{
|
|
"iscurrent": false,
|
|
"size": 130,
|
|
"uploadedat": "2026-01-01T00:00:00.000000Z",
|
|
"version": "<redacted:address>"
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/siteagent/binaries/<binkey>/adopt",
|
|
"auth": "permission:endpoints.agentpackage",
|
|
"params": "path: binkey (string); body: JSON (fields not yet documented)",
|
|
"purpose": "Adopt the unmanaged legacy flat file into the version store.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/siteagent/binaries/x/adopt -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/endpoints/siteagent/binaries/<binkey>/current",
|
|
"auth": "permission:endpoints.agentpackage",
|
|
"params": "path: binkey (string); body: JSON (fields not yet documented)",
|
|
"purpose": "Point 'current' at an already-staged version (roll back or forward).",
|
|
"example": "curl -X PUT http://localhost:5001/api/endpoints/siteagent/binaries/x/current -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"version": "<redacted:address>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"binary": "agent",
|
|
"current": "<redacted:address>",
|
|
"registration": {
|
|
"agentversion": "<redacted:address>",
|
|
"appid": 1,
|
|
"appname": "ShopDB Endpoint Agent",
|
|
"contents": {
|
|
"agent": {
|
|
"filename": "shopdbagent.exe",
|
|
"sha256": "<redacted:digest>",
|
|
"version": "<redacted:address>"
|
|
}
|
|
},
|
|
"created": false,
|
|
"installpath": "/api/applications/package/1/shopdb-endpoint-agent.zip",
|
|
"ok": true,
|
|
"sha256": "<redacted:digest>",
|
|
"size": 135
|
|
},
|
|
"versions": [
|
|
{
|
|
"iscurrent": false,
|
|
"size": 258,
|
|
"uploadedat": "2026-01-01T00:00:00.000000Z",
|
|
"version": "<redacted:address>"
|
|
},
|
|
{
|
|
"iscurrent": true,
|
|
"size": 258,
|
|
"uploadedat": "2026-01-01T00:00:00.000000Z",
|
|
"version": "<redacted:address>"
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/siteagent/binaries/<binkey>/detect",
|
|
"auth": "permission:endpoints.agentpackage",
|
|
"params": "path: binkey (string); body: JSON (fields not yet documented)",
|
|
"purpose": "Read the PE file version of an uploaded EXE without staging it.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/siteagent/binaries/x/detect -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/siteagent/bootstrap.ps1",
|
|
"auth": "api-key (single-use bootstrap token in the X-Endpoint-Bootstrap-Token header, or ?t= while that is enabled; per-IP rate limited, 404 when not usable)",
|
|
"params": "not documented",
|
|
"purpose": "The PowerShell the one-line command downloads, runs and deletes.",
|
|
"example": "curl http://localhost:5001/api/endpoints/siteagent/bootstrap.ps1"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/siteagent/bootstrap/package",
|
|
"auth": "api-key (single-use bootstrap token in the X-Endpoint-Bootstrap-Token header, or ?t= while that is enabled; per-IP rate limited, 404 when not usable)",
|
|
"params": "not documented",
|
|
"purpose": "The keyless agent package the bootstrap script installs.",
|
|
"example": "curl http://localhost:5001/api/endpoints/siteagent/bootstrap/package"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/endpoints/siteagent/bootstrap/tokens",
|
|
"auth": "jwt + role:admin",
|
|
"params": "not documented",
|
|
"purpose": "Every bootstrap token, newest first. Never a secret.",
|
|
"example": "curl http://localhost:5001/api/endpoints/siteagent/bootstrap/tokens -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"tokens": [
|
|
{
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"createdby": "<redacted:person>",
|
|
"expiresat": "2026-01-01T00:00:00.000000Z",
|
|
"lastusedat": null,
|
|
"lastusedip": null,
|
|
"maxuses": 25,
|
|
"remaining": 25,
|
|
"revokedat": null,
|
|
"state": "active",
|
|
"tokenid": 1,
|
|
"tokenprefix": "<redacted:secret>",
|
|
"usecount": 0
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/siteagent/bootstrap/tokens",
|
|
"auth": "jwt + role:admin",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Mint one short-lived bootstrap token. The secret is returned ONCE.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/siteagent/bootstrap/tokens -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"hours": 6,
|
|
"maxuses": 3
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"command": "powershell -ExecutionPolicy Bypass -c \"try { New-Item -ItemType Directory -Force -Path 'C:\\Program Files\\ShopDB\\bootstrap' | Out-Null; icacls 'C:\\Program Files\\ShopDB\\bootstrap' /inheritance:r /grant ...",
|
|
"scripturl": "https://shopdb.test/shopdb/api/endpoints/siteagent/bootstrap.ps1?t=<redacted:token>&via=download",
|
|
"secret": "<redacted:secret>",
|
|
"token": {
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"createdby": "<redacted:person>",
|
|
"expiresat": "2026-01-01T00:00:00.000000Z",
|
|
"lastusedat": null,
|
|
"lastusedip": null,
|
|
"maxuses": 500,
|
|
"remaining": 500,
|
|
"revokedat": null,
|
|
"state": "active",
|
|
"tokenid": 1,
|
|
"tokenprefix": "<redacted:secret>",
|
|
"usecount": 0
|
|
}
|
|
},
|
|
"message": "Bootstrap token created. The command is shown once.",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/siteagent/bootstrap/tokens/<int:tokenid>/revoke",
|
|
"auth": "jwt + role:admin",
|
|
"params": "path: tokenid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Kill a bootstrap token now. Already-revoked is a no-op, not an error.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/siteagent/bootstrap/tokens/1/revoke -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"token": {
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"createdby": "<redacted:person>",
|
|
"expiresat": "2026-01-01T00:00:00.000000Z",
|
|
"lastusedat": null,
|
|
"lastusedip": null,
|
|
"maxuses": 25,
|
|
"remaining": 25,
|
|
"revokedat": "2026-01-01T00:00:00.000000Z",
|
|
"state": "revoked",
|
|
"tokenid": 1,
|
|
"tokenprefix": "<redacted:secret>",
|
|
"usecount": 0
|
|
}
|
|
},
|
|
"message": "Bootstrap token revoked",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/endpoints/siteagent/package",
|
|
"auth": "permission:endpoints.agentpackage",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Bundle the site agent as a downloadable ZIP.",
|
|
"example": "curl -X POST http://localhost:5001/api/endpoints/siteagent/package -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"baseurl": "https://shopdb.test",
|
|
"bundlecert": true,
|
|
"cadenceseconds": 900,
|
|
"collectorkey": "<redacted:token>",
|
|
"nextserverpin": "<redacted:digest>"
|
|
},
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "plugin-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": "<redacted:path>"
|
|
},
|
|
"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": "<redacted:path>"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"shareroot": "<redacted:path>"
|
|
},
|
|
"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": "<redacted:host>",
|
|
"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/<int:entryid>",
|
|
"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/<int:entryid>",
|
|
"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/<int:entryid>/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/<int:entryid>/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": "<redacted:digest>",
|
|
"PayloadSource": "inline",
|
|
"Script": "scripts/x.ps1",
|
|
"Type": "PS1",
|
|
"appid": null,
|
|
"appname": null,
|
|
"entryid": 1,
|
|
"haspayload": true,
|
|
"payloadref": "config.reg",
|
|
"payloadsha256": "<redacted:digest>",
|
|
"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/<sha256>",
|
|
"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": "<redacted:host>",
|
|
"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
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"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": "<redacted:host>",
|
|
"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/<int:reportid>",
|
|
"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": "<redacted:host>",
|
|
"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
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"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/<int:scopeid>",
|
|
"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/<int:scopeid>",
|
|
"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/<int:scopeid>",
|
|
"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/<int:scopeid>/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/<int:scopeid>/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/<int:scopeid>/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/<int:scopeid>/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": "<redacted:path>"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/geenforce/scopes/<int:scopeid>/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/<int:scopeid>/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/<int:scopeid>/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/<int:scopeid>/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/<int:scopeid>/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": "<redacted:host>",
|
|
"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/<int:scopeid>/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/<int:scopeid>/versions/<int:versionnumber>",
|
|
"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/<int:guideid>",
|
|
"auth": "permission:guides.delete",
|
|
"params": "path: guideid (int)",
|
|
"purpose": "UNDOCUMENTED: guides.delete_guide has no docstring.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/guides/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/guides/<int:guideid>",
|
|
"auth": "permission:guides.view",
|
|
"params": "path: guideid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: guides.update_guide has no docstring.",
|
|
"example": "curl -X PUT http://localhost:5001/api/guides/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"blocks": [],
|
|
"title": "Replacing a marker controller"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"blocks": [],
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"guideid": 1,
|
|
"publishedat": null,
|
|
"revision": 2,
|
|
"saved": true,
|
|
"slug": "replacing-a-marker-controler",
|
|
"status": "draft",
|
|
"summary": null,
|
|
"tags": [],
|
|
"title": "Replacing a marker controller",
|
|
"updatedat": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"message": "Saved",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/guides/<int:guideid>/publish",
|
|
"auth": "permission:guides.publish",
|
|
"params": "path: guideid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: guides.publish_guide has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/guides/1/publish -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/guides/<int:guideid>/restore/<int:revisionid>",
|
|
"auth": "permission:guides.view",
|
|
"params": "path: guideid (int), revisionid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: guides.restore_revision has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/guides/1/restore/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/guides/<int:guideid>/revisions",
|
|
"auth": "permission:guides.view",
|
|
"params": "path: guideid (int)",
|
|
"purpose": "UNDOCUMENTED: guides.list_revisions has no docstring.",
|
|
"example": "curl http://localhost:5001/api/guides/1/revisions -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/guides/<int:guideid>/unpublish",
|
|
"auth": "permission:guides.publish",
|
|
"params": "path: guideid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: guides.unpublish_guide has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/guides/1/unpublish -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/guides/<int:guideid>/working",
|
|
"auth": "permission:guides.view",
|
|
"params": "path: guideid (int)",
|
|
"purpose": "The working copy, for the editor.",
|
|
"example": "curl http://localhost:5001/api/guides/1/working -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/guides/<slug>",
|
|
"auth": "permission:guides.view",
|
|
"params": "path: slug (string)",
|
|
"purpose": "What a reader gets: the published revision.",
|
|
"example": "curl http://localhost:5001/api/guides/x -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/guides/images",
|
|
"auth": "permission:guides.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Take a pasted or dropped image.",
|
|
"example": "curl -X POST http://localhost:5001/api/guides/images -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"bytesize": 40,
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"filename": "screenshot.png",
|
|
"guideid": null,
|
|
"guideimageid": 1,
|
|
"mimetype": "image/png",
|
|
"url": "/api/guides/images/1"
|
|
},
|
|
"message": "Image uploaded",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/guides/images/<int:imageid>",
|
|
"auth": "permission:guides.view",
|
|
"params": "path: imageid (int)",
|
|
"purpose": "The image itself, under the same rule as the guide that holds it.",
|
|
"example": "curl http://localhost:5001/api/guides/images/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/guides/revisions/<int:revisionid>",
|
|
"auth": "permission:guides.view",
|
|
"params": "path: revisionid (int)",
|
|
"purpose": "One revision by id.",
|
|
"example": "curl http://localhost:5001/api/guides/revisions/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"blocks": [
|
|
{
|
|
"id": "b1",
|
|
"text": "secret draft wording",
|
|
"type": "paragraph"
|
|
}
|
|
],
|
|
"createdat": "2026-01-01T00:00:00.000000Z",
|
|
"createdby": "<redacted:person>",
|
|
"guideid": 1,
|
|
"guiderevisionid": 1,
|
|
"note": null,
|
|
"revision": 1,
|
|
"shorthash": "<redacted:secret>",
|
|
"summary": null,
|
|
"tags": [],
|
|
"title": "Published procedure"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/guides/tags",
|
|
"auth": "permission:guides.view",
|
|
"params": "not documented",
|
|
"purpose": "Every tag in use, with a count, for the filter chips.",
|
|
"example": "curl http://localhost:5001/api/guides/tags -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "plugin-knowledgebase",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/knowledgebase",
|
|
"auth": "permission:kb.view",
|
|
"params": "not documented",
|
|
"purpose": "List all knowledge base articles.",
|
|
"example": "curl http://localhost:5001/api/knowledgebase -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "appid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "linkurl",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "order",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "desc"
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "shortdescription",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "sort",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "clicks"
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"appid": 1,
|
|
"application": {
|
|
"appid": 1,
|
|
"appname": "Spotfire"
|
|
},
|
|
"clicks": 0,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"keywords": "install",
|
|
"lastupdated": "2026-01-01T00:00:00.000000Z",
|
|
"linkid": 3,
|
|
"linkurl": "https://kb.example/c",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"shortdescription": "Spotfire install guide"
|
|
},
|
|
{
|
|
"appid": 1,
|
|
"application": {
|
|
"appid": 1,
|
|
"appname": "Spotfire"
|
|
},
|
|
"clicks": 0,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"keywords": "export",
|
|
"lastupdated": "2026-01-01T00:00:00.000000Z",
|
|
"linkid": 2,
|
|
"linkurl": "https://kb.example/b",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"shortdescription": "Export a visualization"
|
|
},
|
|
{
|
|
"appid": 1,
|
|
"application": {
|
|
"appid": 1,
|
|
"appname": "Spotfire"
|
|
},
|
|
"clicks": 0,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"keywords": "login",
|
|
"lastupdated": "2026-01-01T00:00:00.000000Z",
|
|
"linkid": 1,
|
|
"linkurl": "https://kb.example/a",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"shortdescription": "Dashboard login steps"
|
|
}
|
|
],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 3,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/knowledgebase",
|
|
"auth": "permission:kb.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new knowledge base article.",
|
|
"example": "curl -X POST http://localhost:5001/api/knowledgebase -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"keywords": "printer reset",
|
|
"linkurl": "https://kb.example/printer-reset",
|
|
"shortdescription": "How to reset a printer"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"appid": null,
|
|
"clicks": 0,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"keywords": "printer reset",
|
|
"lastupdated": "2026-01-01T00:00:00.000000Z",
|
|
"linkid": 1,
|
|
"linkurl": "https://kb.example/printer-reset",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"shortdescription": "How to reset a printer"
|
|
},
|
|
"message": "Article created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/knowledgebase/<int:link_id>",
|
|
"auth": "permission:kb.delete",
|
|
"params": "path: link_id (int)",
|
|
"purpose": "Delete (deactivate) a knowledge base article.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/knowledgebase/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/knowledgebase/<int:link_id>",
|
|
"auth": "permission:kb.view",
|
|
"params": "path: link_id (int)",
|
|
"purpose": "Get a single knowledge base article.",
|
|
"example": "curl http://localhost:5001/api/knowledgebase/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"appid": null,
|
|
"application": null,
|
|
"clicks": 0,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"keywords": "printer reset",
|
|
"lastupdated": "2026-01-01T00:00:00.000000Z",
|
|
"linkid": 1,
|
|
"linkurl": "https://kb.example/printer-reset",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"shortdescription": "How to reset a printer"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/knowledgebase/<int:link_id>",
|
|
"auth": "permission:kb.edit",
|
|
"params": "path: link_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a knowledge base article.",
|
|
"example": "curl -X PUT http://localhost:5001/api/knowledgebase/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/knowledgebase/<int:link_id>/click",
|
|
"auth": "permission:kb.view",
|
|
"params": "path: link_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Increment the click counter for an article the caller is allowed to read.",
|
|
"example": "curl -X POST http://localhost:5001/api/knowledgebase/1/click -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/knowledgebase/stats",
|
|
"auth": "permission:kb.view",
|
|
"params": "not documented",
|
|
"purpose": "Get knowledge base statistics.",
|
|
"example": "curl http://localhost:5001/api/knowledgebase/stats -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"totalarticles": 0,
|
|
"totalclicks": 0
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "plugin-machines",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/machines",
|
|
"auth": "permission:machines.view",
|
|
"params": "not documented",
|
|
"purpose": "List all machines with filtering and pagination.",
|
|
"example": "curl http://localhost:5001/api/machines -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "assetnumber",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "businessunit_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "businessunitid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "dir",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "asc"
|
|
},
|
|
{
|
|
"name": "location_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "locationid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "sort",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "assetnumber"
|
|
},
|
|
{
|
|
"name": "type_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "typeid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "vendor_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "vendorid",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"assetid": 1,
|
|
"assetnumber": "0410",
|
|
"assettypecolor": null,
|
|
"assettypeid": 1,
|
|
"assettypename": "machine",
|
|
"businessunitid": null,
|
|
"createdby": "<redacted:person>",
|
|
"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": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "Cell 4 washer",
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
}
|
|
],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 1,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/machines",
|
|
"auth": "permission:machines.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create new machine (creates both Asset and Machine records).",
|
|
"example": "curl -X POST http://localhost:5001/api/machines -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"assetnumber": "MAINT-DATE-1",
|
|
"lastmaintenancedate": "2026-01-01",
|
|
"name": "Maintenance date probe",
|
|
"nextmaintenancedate": "2026-01-01"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"assetnumber": "MAINT-DATE-1",
|
|
"assettypecolor": null,
|
|
"assettypeid": 1,
|
|
"assettypename": "machine",
|
|
"businessunitid": null,
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"machine": {
|
|
"assetid": 1,
|
|
"controllermodelid": null,
|
|
"controllervendorid": null,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"islocationonly": false,
|
|
"lastmaintenancedate": "2026-01-01",
|
|
"machineid": 1,
|
|
"machinetypeid": null,
|
|
"maintenanceintervaldays": null,
|
|
"modelnumberid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"nextmaintenancedate": "2026-01-01",
|
|
"requiresmanualconfig": false,
|
|
"vendorid": null
|
|
},
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "Maintenance date probe",
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
},
|
|
"message": "Machine created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/machines/<int:machine_id>",
|
|
"auth": "permission:machines.delete",
|
|
"params": "path: machine_id (int)",
|
|
"purpose": "Delete (soft delete) machine.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/machines/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/machines/<int:machine_id>",
|
|
"auth": "permission:machines.view",
|
|
"params": "path: machine_id (int)",
|
|
"purpose": "Get a single machine item with full details.",
|
|
"example": "curl http://localhost:5001/api/machines/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"assetnumber": "2001",
|
|
"assettypecolor": null,
|
|
"assettypeid": 1,
|
|
"assettypename": "machine",
|
|
"businessunitid": null,
|
|
"createdby": "<redacted:person>",
|
|
"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": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/machines/<int:machine_id>",
|
|
"auth": "permission:machines.edit",
|
|
"params": "path: machine_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update machine (both Asset and Machine records).",
|
|
"example": "curl -X PUT http://localhost:5001/api/machines/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/machines/by-asset/<int:asset_id>",
|
|
"auth": "permission:machines.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Get machine data by asset ID.",
|
|
"example": "curl http://localhost:5001/api/machines/by-asset/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/machines/dashboard/outofservice",
|
|
"auth": "permission:machines.view",
|
|
"params": "not documented",
|
|
"purpose": "Machines whose status says they are not running.",
|
|
"example": "curl http://localhost:5001/api/machines/dashboard/outofservice -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/machines/dashboard/summary",
|
|
"auth": "permission:machines.view",
|
|
"params": "not documented",
|
|
"purpose": "Get machine dashboard summary data.",
|
|
"example": "curl http://localhost:5001/api/machines/dashboard/summary -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"bystatus": [
|
|
{
|
|
"count": 1,
|
|
"status": "In Use"
|
|
}
|
|
],
|
|
"bytype": [],
|
|
"total": 1
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/machines/types",
|
|
"auth": "permission:machines.view",
|
|
"params": "not documented",
|
|
"purpose": "List all machine types.",
|
|
"example": "curl http://localhost:5001/api/machines/types -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/machines/types",
|
|
"auth": "permission:machines.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new machine type.",
|
|
"example": "curl -X POST http://localhost:5001/api/machines/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/machines/types/<int:type_id>",
|
|
"auth": "permission:machines.delete",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "Delete a machine type. Refused if any asset still uses it.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/machines/types/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/machines/types/<int:type_id>",
|
|
"auth": "permission:machines.view",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "Get a single machine type.",
|
|
"example": "curl http://localhost:5001/api/machines/types/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/machines/types/<int:type_id>",
|
|
"auth": "permission:machines.edit",
|
|
"params": "path: type_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a machine type.",
|
|
"example": "curl -X PUT http://localhost:5001/api/machines/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "plugin-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": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"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": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "Paged tool 5",
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 26,
|
|
"serialnumber": "<redacted:host>",
|
|
"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": "<redacted:host>",
|
|
"statusid": 1
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"assetnumber": "MT-001",
|
|
"assettypecolor": null,
|
|
"assettypeid": 1,
|
|
"assettypename": "measuring_tool",
|
|
"businessunitid": null,
|
|
"createdby": "<redacted:person>",
|
|
"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": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "Bench caliper",
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"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/<int:tool_id>",
|
|
"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/<int:tool_id>",
|
|
"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": "<redacted:person>",
|
|
"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": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "Bench caliper",
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"statuscolor": null,
|
|
"statusid": 1,
|
|
"statusname": "In Use"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/measuringtools/<int:tool_id>",
|
|
"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": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"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": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "After rename",
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 20,
|
|
"serialnumber": "<redacted:host>",
|
|
"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/<int:asset_id>",
|
|
"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"
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"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/<int:type_id>",
|
|
"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/<int:type_id>",
|
|
"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/<int:type_id>",
|
|
"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": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"ipaddress": "<redacted:host>",
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"networkdevice": {
|
|
"assetid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"firmwareversion": null,
|
|
"hostname": "<redacted:host>",
|
|
"isactive": true,
|
|
"ismanaged": false,
|
|
"ispoe": false,
|
|
"modelnumberid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"networkdeviceid": 1,
|
|
"networkdevicetypeid": 1,
|
|
"networkdevicetypename": "Switch",
|
|
"portcount": null,
|
|
"rackunit": null,
|
|
"vendorid": 1,
|
|
"vendorname": "Cisco"
|
|
},
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
}
|
|
],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 1,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/network",
|
|
"auth": "permission:network.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create new network device (creates both Asset and NetworkDevice records).",
|
|
"example": "curl -X POST http://localhost:5001/api/network -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"assetnumber": "SW-CORE-01",
|
|
"hostname": "<redacted:host>",
|
|
"ipaddress": "<redacted:host>",
|
|
"name": "Core switch"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"assetnumber": "APNL-Dock-Door-4",
|
|
"assettypecolor": null,
|
|
"assettypeid": 1,
|
|
"assettypename": "network_device",
|
|
"businessunitid": null,
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"ipaddress": "<redacted:host>",
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "Dock Door 4",
|
|
"networkdevice": {
|
|
"assetid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"firmwareversion": null,
|
|
"hostname": "<redacted:host>",
|
|
"isactive": true,
|
|
"ismanaged": false,
|
|
"ispoe": false,
|
|
"modelnumberid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"networkdeviceid": 1,
|
|
"networkdevicetypeid": 1,
|
|
"networkdevicetypename": "Access Panel",
|
|
"portcount": null,
|
|
"rackunit": null,
|
|
"vendorid": null
|
|
},
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
},
|
|
"message": "Network device created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/network/<int:device_id>",
|
|
"auth": "permission:network.delete",
|
|
"params": "path: device_id (int)",
|
|
"purpose": "Delete (soft delete) network device.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/network/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/network/<int:device_id>",
|
|
"auth": "permission:network.view",
|
|
"params": "path: device_id (int)",
|
|
"purpose": "Get a single network device with full details.",
|
|
"example": "curl http://localhost:5001/api/network/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"assetnumber": "AST-networkdevice",
|
|
"assettypecolor": null,
|
|
"assettypeid": 3,
|
|
"assettypename": "network_device",
|
|
"businessunitid": null,
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": "GL-2",
|
|
"ipaddress": "<redacted:host>",
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": "MNT-2",
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"networkdevice": {
|
|
"assetid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"firmwareversion": null,
|
|
"hostname": "<redacted:host>",
|
|
"isactive": true,
|
|
"ismanaged": false,
|
|
"ispoe": false,
|
|
"modelnumberid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"networkdeviceid": 1,
|
|
"networkdevicetypeid": null,
|
|
"portcount": null,
|
|
"rackunit": null,
|
|
"vendorid": null
|
|
},
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/network/<int:device_id>",
|
|
"auth": "permission:network.edit",
|
|
"params": "path: device_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update network device (both Asset and NetworkDevice records).",
|
|
"example": "curl -X PUT http://localhost:5001/api/network/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"gaugelabreference": "GL-2",
|
|
"maintenancereference": "MNT-2"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"assetnumber": "AST-networkdevice",
|
|
"assettypecolor": null,
|
|
"assettypeid": 3,
|
|
"assettypename": "network_device",
|
|
"businessunitid": null,
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": "GL-2",
|
|
"ipaddress": "<redacted:host>",
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": "MNT-2",
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"networkdevice": {
|
|
"assetid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"firmwareversion": null,
|
|
"hostname": "<redacted:host>",
|
|
"isactive": true,
|
|
"ismanaged": false,
|
|
"ispoe": false,
|
|
"modelnumberid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"networkdeviceid": 1,
|
|
"networkdevicetypeid": null,
|
|
"portcount": null,
|
|
"rackunit": null,
|
|
"vendorid": null
|
|
},
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
},
|
|
"message": "Network device updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/network/by-asset/<int:asset_id>",
|
|
"auth": "permission:network.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Get network device data by asset ID.",
|
|
"example": "curl http://localhost:5001/api/network/by-asset/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/network/by-hostname/<hostname>",
|
|
"auth": "permission:network.view",
|
|
"params": "path: hostname (string)",
|
|
"purpose": "Get network device by hostname.",
|
|
"example": "curl http://localhost:5001/api/network/by-hostname/x -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/network/dashboard/summary",
|
|
"auth": "permission:network.view",
|
|
"params": "not documented",
|
|
"purpose": "Get network device dashboard summary data.",
|
|
"example": "curl http://localhost:5001/api/network/dashboard/summary -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"bytype": [],
|
|
"byvendor": [],
|
|
"nonpoe": 0,
|
|
"poe": 0,
|
|
"total": 0
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/network/subnets",
|
|
"auth": "permission:network.view",
|
|
"params": "not documented",
|
|
"purpose": "List all subnets with filtering and pagination.",
|
|
"example": "curl http://localhost:5001/api/network/subnets -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "locationid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "type",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "vlanid",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/network/subnets",
|
|
"auth": "permission:network.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new subnet.",
|
|
"example": "curl -X POST http://localhost:5001/api/network/subnets -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"cidr": "<redacted:address>",
|
|
"name": "Attached",
|
|
"vlanid": 1
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"broadcastaddress": null,
|
|
"cidr": "<redacted:address>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": null,
|
|
"dhcpenabled": true,
|
|
"dhcprangeend": null,
|
|
"dhcprangestart": null,
|
|
"dns1": null,
|
|
"dns2": null,
|
|
"gatewayip": null,
|
|
"isactive": true,
|
|
"locationid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "Attached",
|
|
"networkaddress": null,
|
|
"subnetid": 1,
|
|
"subnetmask": null,
|
|
"subnettype": null,
|
|
"vlanid": 1,
|
|
"vlanname": "In use",
|
|
"vlannumber": 77
|
|
},
|
|
"message": "Subnet created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/network/subnets/<int:subnet_id>",
|
|
"auth": "permission:network.delete",
|
|
"params": "path: subnet_id (int)",
|
|
"purpose": "Delete (soft delete) a subnet.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/network/subnets/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/network/subnets/<int:subnet_id>",
|
|
"auth": "permission:network.view",
|
|
"params": "path: subnet_id (int)",
|
|
"purpose": "Get a single subnet plus the network devices whose primary IP falls in its CIDR range.",
|
|
"example": "curl http://localhost:5001/api/network/subnets/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/network/subnets/<int:subnet_id>",
|
|
"auth": "permission:network.edit",
|
|
"params": "path: subnet_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a subnet.",
|
|
"example": "curl -X PUT http://localhost:5001/api/network/subnets/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/network/types",
|
|
"auth": "permission:network.view",
|
|
"params": "not documented",
|
|
"purpose": "List all network device types.",
|
|
"example": "curl http://localhost:5001/api/network/types -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/network/types",
|
|
"auth": "permission:network.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new network device type.",
|
|
"example": "curl -X POST http://localhost:5001/api/network/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"networkdevicetype": "Door Controller",
|
|
"prefix": "DOOR"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"color": null,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": null,
|
|
"icon": null,
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"networkdevicetype": "Door Controller",
|
|
"networkdevicetypeid": 1,
|
|
"prefix": "DOOR"
|
|
},
|
|
"message": "Network device type created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/network/types/<int:type_id>",
|
|
"auth": "permission:network.delete",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "Delete a network device type. Refused if any device still uses it.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/network/types/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/network/types/<int:type_id>",
|
|
"auth": "permission:network.view",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "Get a single network device type.",
|
|
"example": "curl http://localhost:5001/api/network/types/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/network/types/<int:type_id>",
|
|
"auth": "permission:network.edit",
|
|
"params": "path: type_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a network device type.",
|
|
"example": "curl -X PUT http://localhost:5001/api/network/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"prefix": "DR"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"color": null,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": null,
|
|
"icon": null,
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"networkdevicetype": "Door Controller",
|
|
"networkdevicetypeid": 1,
|
|
"prefix": "DR"
|
|
},
|
|
"message": "Network device type updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/network/vlans",
|
|
"auth": "permission:network.view",
|
|
"params": "not documented",
|
|
"purpose": "List all VLANs with filtering and pagination.",
|
|
"example": "curl http://localhost:5001/api/network/vlans -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "type",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/network/vlans",
|
|
"auth": "permission:network.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new VLAN.",
|
|
"example": "curl -X POST http://localhost:5001/api/network/vlans -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"name": "VLAN 4094",
|
|
"vlannumber": 4094
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"description": null,
|
|
"isactive": true,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": "VLAN 4094",
|
|
"subnetcount": 0,
|
|
"vlanid": 1,
|
|
"vlannumber": 4094,
|
|
"vlantype": null
|
|
},
|
|
"message": "VLAN created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/network/vlans/<int:vlan_id>",
|
|
"auth": "permission:network.delete",
|
|
"params": "path: vlan_id (int)",
|
|
"purpose": "Delete (soft delete) a VLAN.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/network/vlans/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/network/vlans/<int:vlan_id>",
|
|
"auth": "permission:network.view",
|
|
"params": "path: vlan_id (int)",
|
|
"purpose": "Get a single VLAN with its subnets.",
|
|
"example": "curl http://localhost:5001/api/network/vlans/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/network/vlans/<int:vlan_id>",
|
|
"auth": "permission:network.edit",
|
|
"params": "path: vlan_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a VLAN.",
|
|
"example": "curl -X PUT http://localhost:5001/api/network/vlans/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "plugin-notifications",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/notifications",
|
|
"auth": "permission:notifications.view",
|
|
"params": "not documented",
|
|
"purpose": "List all notifications with filtering and pagination.",
|
|
"example": "curl http://localhost:5001/api/notifications -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "current",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "false"
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "ticketnumber",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "type_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "typeid",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/notifications",
|
|
"auth": "permission:notifications.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new notification.",
|
|
"example": "curl -X POST http://localhost:5001/api/notifications -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"alertfleet": true,
|
|
"alertscope": {
|
|
"computertype": "CMM PC",
|
|
"hostname": [
|
|
"<redacted:host>",
|
|
"<redacted:host>"
|
|
]
|
|
},
|
|
"notification": "Line 3 is down",
|
|
"notificationtypeid": 1
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"alertfleet": true,
|
|
"alertscope": {
|
|
"computertype": "CMM PC",
|
|
"hostname": [
|
|
"<redacted:host>",
|
|
"<redacted:host>"
|
|
]
|
|
},
|
|
"alerttimeout": 0,
|
|
"appid": null,
|
|
"businessunitid": null,
|
|
"employeename": "<redacted:person>",
|
|
"employeesso": "<redacted:person>",
|
|
"enddate": null,
|
|
"endtime": null,
|
|
"isactive": true,
|
|
"iscurrent": true,
|
|
"isshopfloor": false,
|
|
"link": null,
|
|
"linkurl": null,
|
|
"message": "Line 3 is down",
|
|
"notification": "Line 3 is down",
|
|
"notificationid": 1,
|
|
"notificationtypeid": 1,
|
|
"startdate": "2026-01-01T00:00:00.000000+00:00",
|
|
"starttime": "2026-01-01T00:00:00.000000+00:00",
|
|
"ticketnumber": null,
|
|
"title": "Line 3 is down",
|
|
"typecolor": "#d93f3f",
|
|
"typename": "Fleet Alert"
|
|
},
|
|
"message": "Notification created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/notifications/<int:notification_id>",
|
|
"auth": "permission:notifications.delete",
|
|
"params": "path: notification_id (int)",
|
|
"purpose": "Delete (soft delete) a notification.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/notifications/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/notifications/<int:notification_id>",
|
|
"auth": "permission:notifications.view",
|
|
"params": "path: notification_id (int)",
|
|
"purpose": "Get a single notification.",
|
|
"example": "curl http://localhost:5001/api/notifications/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/notifications/<int:notification_id>",
|
|
"auth": "permission:notifications.edit",
|
|
"params": "path: notification_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a notification.",
|
|
"example": "curl -X PUT http://localhost:5001/api/notifications/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"alertfleet": null,
|
|
"alerttimeout": null
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"alertfleet": false,
|
|
"alertscope": null,
|
|
"alerttimeout": 0,
|
|
"appid": null,
|
|
"businessunitid": null,
|
|
"employeename": "<redacted:person>",
|
|
"employeesso": "<redacted:person>",
|
|
"enddate": null,
|
|
"endtime": null,
|
|
"isactive": true,
|
|
"iscurrent": true,
|
|
"isshopfloor": false,
|
|
"link": null,
|
|
"linkurl": null,
|
|
"message": "Line 3 is down",
|
|
"notification": "Line 3 is down",
|
|
"notificationid": 1,
|
|
"notificationtypeid": 1,
|
|
"startdate": "2026-01-01T00:00:00.000000+00:00",
|
|
"starttime": "2026-01-01T00:00:00.000000+00:00",
|
|
"ticketnumber": null,
|
|
"title": "Line 3 is down",
|
|
"typecolor": "#d93f3f",
|
|
"typename": "Fleet Alert"
|
|
},
|
|
"message": "Notification updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/notifications/active",
|
|
"auth": "permission:notifications.view",
|
|
"params": "not documented",
|
|
"purpose": "Get currently active notifications for display.",
|
|
"example": "curl http://localhost:5001/api/notifications/active -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"notifications": [],
|
|
"total": 0
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/notifications/calendar",
|
|
"auth": "permission:notifications.view",
|
|
"params": "not documented",
|
|
"purpose": "Get notifications in FullCalendar event format.",
|
|
"example": "curl http://localhost:5001/api/notifications/calendar -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "end",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "start",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/notifications/dashboard/active",
|
|
"auth": "permission:notifications.view",
|
|
"params": "not documented",
|
|
"purpose": "Notifications currently showing on the floor.",
|
|
"example": "curl http://localhost:5001/api/notifications/dashboard/active -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/notifications/dashboard/summary",
|
|
"auth": "permission:notifications.view",
|
|
"params": "not documented",
|
|
"purpose": "Get notifications dashboard summary.",
|
|
"example": "curl http://localhost:5001/api/notifications/dashboard/summary -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"active": 0,
|
|
"bytype": []
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/notifications/employee/<sso>",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "path: sso (string)",
|
|
"purpose": "Get recognitions for a specific employee by SSO.",
|
|
"example": "curl http://localhost:5001/api/notifications/employee/x"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/notifications/shopfloor",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "not documented",
|
|
"purpose": "Get notifications for shopfloor TV dashboard.",
|
|
"example": "curl http://localhost:5001/api/notifications/shopfloor",
|
|
"queryparams": [
|
|
{
|
|
"name": "businessunit",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"configversion": "2b7c2d2f543f",
|
|
"current": [
|
|
{
|
|
"boardcategory": "Current Events",
|
|
"boardorder": 50,
|
|
"displaystyle": "grid",
|
|
"employeename": "<redacted:person>",
|
|
"employeepicture": "<redacted:person>",
|
|
"employeesso": "<redacted:person>",
|
|
"endtime": null,
|
|
"isactive": true,
|
|
"isshopfloor": true,
|
|
"link": null,
|
|
"notification": "press down",
|
|
"notificationid": 2,
|
|
"resolved": false,
|
|
"starttime": null,
|
|
"ticketnumber": null,
|
|
"typecolor": "#17a2b8",
|
|
"typename": "Incident"
|
|
},
|
|
{
|
|
"boardcategory": "Current Events",
|
|
"boardorder": 30,
|
|
"displaystyle": "grid",
|
|
"employeename": "<redacted:person>",
|
|
"employeepicture": "<redacted:person>",
|
|
"employeesso": "<redacted:person>",
|
|
"endtime": null,
|
|
"isactive": true,
|
|
"isshopfloor": true,
|
|
"link": null,
|
|
"notification": "retooling",
|
|
"notificationid": 1,
|
|
"resolved": false,
|
|
"starttime": null,
|
|
"ticketnumber": null,
|
|
"typecolor": "#17a2b8",
|
|
"typename": "Change"
|
|
}
|
|
],
|
|
"timestamp": "2026-01-01T00:00:00.000000",
|
|
"upcoming": []
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/notifications/types",
|
|
"auth": "permission:notifications.view",
|
|
"params": "not documented",
|
|
"purpose": "List all notification types.",
|
|
"example": "curl http://localhost:5001/api/notifications/types -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"boardcategory": "Alerts",
|
|
"boardorder": 100,
|
|
"displaystyle": "grid",
|
|
"expirydays": null,
|
|
"expiryhour": null,
|
|
"expiryminute": 0,
|
|
"expirymode": "none",
|
|
"gracewindowminutes": 0,
|
|
"isactive": true,
|
|
"notificationtypeid": 1,
|
|
"showemployeephoto": "<redacted:person>",
|
|
"splitperemployee": "<redacted:person>",
|
|
"typecolor": "#17a2b8",
|
|
"typedescription": null,
|
|
"typename": "Awareness"
|
|
}
|
|
],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 1,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/notifications/types",
|
|
"auth": "permission:notifications.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new notification type.",
|
|
"example": "curl -X POST http://localhost:5001/api/notifications/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"boardcategory": "Alerts",
|
|
"displaystyle": "grid",
|
|
"typename": "Awareness"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"boardcategory": "Alerts",
|
|
"boardorder": 100,
|
|
"displaystyle": "grid",
|
|
"expirydays": null,
|
|
"expiryhour": null,
|
|
"expiryminute": 0,
|
|
"expirymode": "none",
|
|
"gracewindowminutes": 0,
|
|
"isactive": true,
|
|
"notificationtypeid": 1,
|
|
"showemployeephoto": "<redacted:person>",
|
|
"splitperemployee": "<redacted:person>",
|
|
"typecolor": "#17a2b8",
|
|
"typedescription": null,
|
|
"typename": "Awareness"
|
|
},
|
|
"message": "Notification type created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "PATCH|PUT",
|
|
"path": "/api/notifications/types/<int:type_id>",
|
|
"auth": "permission:notifications.create",
|
|
"params": "path: type_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a notification type, including its auto-expiry rule.",
|
|
"example": "curl -X PATCH http://localhost:5001/api/notifications/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"boardcategory": "Alerts"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"boardcategory": "Alerts",
|
|
"boardorder": 100,
|
|
"displaystyle": "grid",
|
|
"expirydays": null,
|
|
"expiryhour": null,
|
|
"expiryminute": 0,
|
|
"expirymode": "none",
|
|
"gracewindowminutes": 0,
|
|
"isactive": true,
|
|
"notificationtypeid": 1,
|
|
"showemployeephoto": "<redacted:person>",
|
|
"splitperemployee": "<redacted:person>",
|
|
"typecolor": "#17a2b8",
|
|
"typedescription": null,
|
|
"typename": "Awareness"
|
|
},
|
|
"message": "Notification type updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "plugin-printedparts",
|
|
"endpoints": [
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/printedparts/files/<int:file_id>",
|
|
"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/<int:file_id>/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/<path:filename>",
|
|
"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/<int:item_id>",
|
|
"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/<int:item_id>",
|
|
"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/<int:item_id>",
|
|
"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/<int:item_id>/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/<int:item_id>/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/<int:item_id>/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/<int:item_id>/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/<int:item_id>/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=<image>).",
|
|
"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/<int:item_id>/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": "<redacted:person>",
|
|
"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/<int:item_id>/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/<itemcode>",
|
|
"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": "<redacted:person>",
|
|
"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=<n> (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",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"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=<n> (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",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"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",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"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": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"ipaddress": "<redacted:host>",
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"printer": {
|
|
"assetid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"hostname": "<redacted:host>",
|
|
"installpath": null,
|
|
"isactive": true,
|
|
"iscolor": false,
|
|
"iscsf": false,
|
|
"isduplex": false,
|
|
"isnetwork": true,
|
|
"modelname": "ZT411",
|
|
"modelnumberid": 1,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"pin": null,
|
|
"printerid": 1,
|
|
"printertypeid": 1,
|
|
"printertypename": "Thermal",
|
|
"sharename": null,
|
|
"vendorid": null,
|
|
"windowsname": null
|
|
},
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
}
|
|
],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 1,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/printers",
|
|
"auth": "permission:printers.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create new printer (creates both Asset and Printer records).",
|
|
"example": "curl -X POST http://localhost:5001/api/printers -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"assetnumber": "CSF01-Materials-HP",
|
|
"hostname": "<redacted:host>",
|
|
"installpath": "<redacted:sharepath>",
|
|
"mapx": 120,
|
|
"mapy": 240
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"assetnumber": "SpoolsInspection-Xerox",
|
|
"assettypecolor": null,
|
|
"assettypeid": 1,
|
|
"assettypename": "printer",
|
|
"businessunitid": null,
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": null,
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"printer": {
|
|
"assetid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"hostname": "<redacted:host>",
|
|
"installpath": null,
|
|
"isactive": true,
|
|
"iscolor": false,
|
|
"iscsf": false,
|
|
"isduplex": false,
|
|
"isnetwork": true,
|
|
"modelname": "VersaLink C7125",
|
|
"modelnumberid": 1,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"pin": null,
|
|
"printerid": 1,
|
|
"printertypeid": null,
|
|
"sharename": null,
|
|
"vendorfrommodel": true,
|
|
"vendorid": null,
|
|
"vendorname": "Xerox",
|
|
"windowsname": null
|
|
},
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
},
|
|
"message": "Printer created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/printers/<int:printer_id>",
|
|
"auth": "permission:printers.delete",
|
|
"params": "path: printer_id (int)",
|
|
"purpose": "Delete (soft delete) printer.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/printers/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/<int:printer_id>",
|
|
"auth": "permission:printers.view",
|
|
"params": "path: printer_id (int)",
|
|
"purpose": "Get a single printer with full details.",
|
|
"example": "curl http://localhost:5001/api/printers/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"assetnumber": "PR-2001",
|
|
"assettypecolor": null,
|
|
"assettypeid": 1,
|
|
"assettypename": "printer",
|
|
"businessunitid": null,
|
|
"communications": [],
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"drivers": [],
|
|
"gaugelabreference": null,
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": null,
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"printer": {
|
|
"assetid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"hostname": "<redacted:host>",
|
|
"imageurl": "/api/models/images/model-1.png",
|
|
"installpath": null,
|
|
"isactive": true,
|
|
"iscolor": false,
|
|
"iscsf": false,
|
|
"isduplex": false,
|
|
"isnetwork": true,
|
|
"modelname": "IMG-MODEL-1",
|
|
"modelnumberid": 1,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"pin": null,
|
|
"printerid": 1,
|
|
"printertypeid": null,
|
|
"sharename": null,
|
|
"vendorid": null,
|
|
"windowsname": null
|
|
},
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/printers/<int:printer_id>",
|
|
"auth": "permission:printers.edit",
|
|
"params": "path: printer_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update printer (both Asset and Printer records).",
|
|
"example": "curl -X PUT http://localhost:5001/api/printers/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"gaugelabreference": "GL-2",
|
|
"maintenancereference": "MNT-2"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"assetnumber": "AST-printer",
|
|
"assettypecolor": null,
|
|
"assettypeid": 2,
|
|
"assettypename": "printer",
|
|
"businessunitid": null,
|
|
"createdby": "<redacted:person>",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"deletedby": null,
|
|
"deleteddate": null,
|
|
"gaugelabreference": "GL-2",
|
|
"isactive": true,
|
|
"levelid": null,
|
|
"locationcode": null,
|
|
"locationid": null,
|
|
"maintenancereference": "MNT-2",
|
|
"mapverifiedat": null,
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"modifiedby": "<redacted:person>",
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"name": null,
|
|
"notes": null,
|
|
"ownlevelid": null,
|
|
"ownlocationid": null,
|
|
"ownmapx": null,
|
|
"ownmapy": null,
|
|
"pluginid": 1,
|
|
"printer": {
|
|
"assetid": 1,
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"hostname": "<redacted:host>",
|
|
"installpath": null,
|
|
"isactive": true,
|
|
"iscolor": false,
|
|
"iscsf": false,
|
|
"isduplex": false,
|
|
"isnetwork": true,
|
|
"modelnumberid": null,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"pin": null,
|
|
"printerid": 1,
|
|
"printertypeid": null,
|
|
"sharename": null,
|
|
"vendorid": null,
|
|
"windowsname": null
|
|
},
|
|
"serialnumber": "<redacted:host>",
|
|
"statusid": 1
|
|
},
|
|
"message": "Printer updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/<int:printer_id>/supplies",
|
|
"auth": "permission:printers.view",
|
|
"params": "path: printer_id (int)",
|
|
"purpose": "Get supply levels from Zabbix (real-time lookup).",
|
|
"example": "curl http://localhost:5001/api/printers/1/supplies -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/assignments/for-asset/<int:asset_id>",
|
|
"auth": "permission:printers.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "What THIS asset is assigned, without inheritance.",
|
|
"example": "curl http://localhost:5001/api/printers/assignments/for-asset/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 4,
|
|
"defaultprinterassetid": null,
|
|
"printerassetids": []
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/printers/assignments/for-asset/<int:asset_id>",
|
|
"auth": "permission:printers.edit",
|
|
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Reconcile one asset's whole printer assignment in a single call.",
|
|
"example": "curl -X PUT http://localhost:5001/api/printers/assignments/for-asset/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"defaultprinterassetid": 4,
|
|
"printerassetids": [
|
|
4,
|
|
5
|
|
]
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 3,
|
|
"defaultprinterassetid": 4,
|
|
"printerassetids": [
|
|
4,
|
|
5
|
|
]
|
|
},
|
|
"message": "Printer assignment updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/printers/assignments/seed-from-observed/<int:asset_id>",
|
|
"auth": "permission:printers.edit",
|
|
"params": "path: asset_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Write what a PC observed as the assignment of the asset in the path.",
|
|
"example": "curl -X POST http://localhost:5001/api/printers/assignments/seed-from-observed/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/by-asset/<int:asset_id>",
|
|
"auth": "permission:printers.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "Get printer data by asset ID.",
|
|
"example": "curl http://localhost:5001/api/printers/by-asset/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/dashboard/summary",
|
|
"auth": "permission:printers.view",
|
|
"params": "not documented",
|
|
"purpose": "Get printer dashboard summary data.",
|
|
"example": "curl http://localhost:5001/api/printers/dashboard/summary -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"bytype": [],
|
|
"byvendor": [],
|
|
"criticalsupplies": 0,
|
|
"lowsupplies": 0,
|
|
"online": 0,
|
|
"total": 0,
|
|
"totalprinters": 0
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/dashboard/supplies",
|
|
"auth": "permission:printers.view",
|
|
"params": "not documented",
|
|
"purpose": "Printers needing a cartridge, flattened to one row per printer.",
|
|
"example": "curl http://localhost:5001/api/printers/dashboard/supplies -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"rows": [
|
|
{
|
|
"iscritical": true,
|
|
"levelid": null,
|
|
"location": "Shop floor",
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"printerid": 2,
|
|
"printername": "Bravo",
|
|
"supplies": [
|
|
{
|
|
"level": "critical",
|
|
"text": "Black Toner 0%",
|
|
"title": "No part number on file for this model"
|
|
}
|
|
],
|
|
"worstremaining": 0
|
|
},
|
|
{
|
|
"iscritical": true,
|
|
"levelid": null,
|
|
"location": "Shop floor",
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"printerid": 3,
|
|
"printername": "Charlie",
|
|
"supplies": [
|
|
{
|
|
"level": "critical",
|
|
"text": "Black Toner 2%",
|
|
"title": "No part number on file for this model"
|
|
}
|
|
],
|
|
"worstremaining": 2
|
|
},
|
|
{
|
|
"iscritical": true,
|
|
"levelid": null,
|
|
"location": "Shop floor",
|
|
"mapx": null,
|
|
"mapy": null,
|
|
"printerid": 1,
|
|
"printername": "Alpha",
|
|
"supplies": [
|
|
{
|
|
"level": "critical",
|
|
"text": "Black Toner 4%",
|
|
"title": "No part number on file for this model"
|
|
}
|
|
],
|
|
"worstremaining": 4
|
|
},
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"unavailable": null
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/drivers",
|
|
"auth": "permission:printers.view",
|
|
"params": "not documented",
|
|
"purpose": "List printer drivers. ?active=false includes inactive ones.",
|
|
"example": "curl http://localhost:5001/api/printers/drivers -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/printers/drivers",
|
|
"auth": "permission:printers.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: printers_asset.create_driver has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/printers/drivers -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"drivername": "HP Universal Printing PCL 6",
|
|
"location": "<redacted:sharepath>",
|
|
"name": "HP universal",
|
|
"vendorid": 1
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"description": null,
|
|
"driverid": 1,
|
|
"drivername": "HP Universal Printing PCL 6",
|
|
"isactive": true,
|
|
"location": "<redacted:sharepath>",
|
|
"modelname": null,
|
|
"modelnumberid": null,
|
|
"name": "HP universal",
|
|
"vendorid": 1
|
|
},
|
|
"message": "Driver created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/printers/drivers/<int:driver_id>",
|
|
"auth": "permission:printers.delete",
|
|
"params": "path: driver_id (int)",
|
|
"purpose": "UNDOCUMENTED: printers_asset.delete_driver has no docstring.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/printers/drivers/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/printers/drivers/<int:driver_id>",
|
|
"auth": "permission:printers.edit",
|
|
"params": "path: driver_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: printers_asset.update_driver has no docstring.",
|
|
"example": "curl -X PUT http://localhost:5001/api/printers/drivers/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"drivername": "Xerox Global Print Driver PCL6",
|
|
"vendorid": 2
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"description": null,
|
|
"driverid": 1,
|
|
"drivername": "Xerox Global Print Driver PCL6",
|
|
"isactive": true,
|
|
"location": "<redacted:sharepath>",
|
|
"modelname": null,
|
|
"modelnumberid": null,
|
|
"name": "Xerox universal",
|
|
"vendorid": 2
|
|
},
|
|
"message": "Driver updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/for-host/<hostname>",
|
|
"auth": "jwt-optional (works signed out; the handler decides what shows)",
|
|
"params": "path: hostname (string)",
|
|
"purpose": "Printers assigned to a PC, by hostname, with what it takes to install one.",
|
|
"example": "curl http://localhost:5001/api/printers/for-host/x -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"assetnumber": "1001",
|
|
"defaultprinterid": null,
|
|
"hostname": "<redacted:host>",
|
|
"printers": [
|
|
{
|
|
"assetid": 4,
|
|
"driverid": null,
|
|
"driverlocation": null,
|
|
"drivername": null,
|
|
"hostname": "<redacted:host>",
|
|
"inheritedfromassetid": 3,
|
|
"installpath": null,
|
|
"ipaddress": "<redacted:host>",
|
|
"isdefault": false,
|
|
"port": null,
|
|
"printerid": 1,
|
|
"queuename": "PRINTER-A",
|
|
"sharename": null,
|
|
"windowsname": "PRINTER-A"
|
|
},
|
|
{
|
|
"assetid": 5,
|
|
"driverid": null,
|
|
"driverlocation": null,
|
|
"drivername": null,
|
|
"hostname": "<redacted:host>",
|
|
"inheritedfromassetid": 3,
|
|
"installpath": null,
|
|
"ipaddress": "<redacted:host>",
|
|
"isdefault": false,
|
|
"port": null,
|
|
"printerid": 2,
|
|
"queuename": "PRINTER-B",
|
|
"sharename": null,
|
|
"windowsname": "PRINTER-B"
|
|
},
|
|
{
|
|
"assetid": 6,
|
|
"driverid": null,
|
|
"driverlocation": null,
|
|
"drivername": null,
|
|
"hostname": "<redacted:host>",
|
|
"inheritedfromassetid": 3,
|
|
"installpath": null,
|
|
"ipaddress": "<redacted:host>",
|
|
"isdefault": false,
|
|
"port": null,
|
|
"printerid": 3,
|
|
"queuename": "PRINTER-C",
|
|
"sharename": null,
|
|
"windowsname": "PRINTER-C"
|
|
}
|
|
],
|
|
"source": "inherited"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/install-batch",
|
|
"auth": "jwt-optional (works signed out; the handler decides what shows)",
|
|
"params": "not documented",
|
|
"purpose": "Generate a Windows .bat that installs the selected printers.",
|
|
"example": "curl http://localhost:5001/api/printers/install-batch -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "printerids",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/install-list",
|
|
"auth": "jwt-optional (works signed out; the handler decides what shows)",
|
|
"params": "not documented",
|
|
"purpose": "Flat, unpaginated list of network printers for the printer installer.",
|
|
"example": "curl http://localhost:5001/api/printers/install-list -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "format",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"hostname": "<redacted:host>",
|
|
"installpath": "<redacted:sharepath>",
|
|
"ipaddress": "<redacted:host>",
|
|
"iscsf": false,
|
|
"levelid": null,
|
|
"locationname": null,
|
|
"machinenumber": "CSF01-Materials-HP",
|
|
"mapx": 120,
|
|
"mapy": 240,
|
|
"modelnumber": null,
|
|
"name": "CSF01-Materials-HP",
|
|
"printerid": 1,
|
|
"sharename": null,
|
|
"vendorname": "",
|
|
"windowsname": null
|
|
}
|
|
],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/lookup",
|
|
"auth": "permission:printers.view",
|
|
"params": "not documented",
|
|
"purpose": "Find a printer by IP or FQDN. Parity with the classic printerlookup.asp.",
|
|
"example": "curl http://localhost:5001/api/printers/lookup -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "fqdn",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "ip",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/lowsupplies",
|
|
"auth": "permission:printers.view",
|
|
"params": "not documented",
|
|
"purpose": "Get printers with low or critical supply levels.",
|
|
"example": "curl http://localhost:5001/api/printers/lowsupplies -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"printers": [],
|
|
"summary": {
|
|
"critical": 0,
|
|
"low": 0,
|
|
"total_checked": 0
|
|
}
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/models",
|
|
"auth": "permission:printers.view",
|
|
"params": "not documented",
|
|
"purpose": "List models with a supply count, for the supply-management picker.",
|
|
"example": "curl http://localhost:5001/api/printers/models -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "vendor_id",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "vendorid",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "withsupplies",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": ""
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [
|
|
{
|
|
"modelnumber": "TestModel C999",
|
|
"modelnumberid": 1,
|
|
"supplycount": 1,
|
|
"vendor": "TestVendor",
|
|
"vendorid": 1
|
|
}
|
|
],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 1,
|
|
"totalpages": 1
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/models/<int:modelnumberid>/supplies",
|
|
"auth": "permission:printers.view",
|
|
"params": "path: modelnumberid (int)",
|
|
"purpose": "List all supplies mapped to a model.",
|
|
"example": "curl http://localhost:5001/api/printers/models/1/supplies -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"modelnumber": "TestModel C999",
|
|
"modelnumberid": 1,
|
|
"supplies": [
|
|
{
|
|
"capacitytier": "standard",
|
|
"color": "black",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"marketingname": "414A Black",
|
|
"modelnumber": "TestModel C999",
|
|
"modelnumberid": 1,
|
|
"modelsupplyid": 1,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"notes": null,
|
|
"pageyield": 2400,
|
|
"partnumber": "W2020A",
|
|
"supplytype": "toner"
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/printers/models/<int:modelnumberid>/supplies",
|
|
"auth": "permission:printers.create",
|
|
"params": "path: modelnumberid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Add a supply to a model.",
|
|
"example": "curl -X POST http://localhost:5001/api/printers/models/1/supplies -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"capacitytier": "standard",
|
|
"color": "black",
|
|
"marketingname": "414A Black",
|
|
"pageyield": 2400,
|
|
"partnumber": "W2020A",
|
|
"supplytype": "toner"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"capacitytier": "standard",
|
|
"color": "black",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"marketingname": "414A Black",
|
|
"modelnumber": "TestModel C999",
|
|
"modelnumberid": 1,
|
|
"modelsupplyid": 1,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"notes": null,
|
|
"pageyield": 2400,
|
|
"partnumber": "W2020A",
|
|
"supplytype": "toner"
|
|
},
|
|
"message": "Supply added",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/observed/<hostname>",
|
|
"auth": "permission:printers.view",
|
|
"params": "path: hostname (string)",
|
|
"purpose": "What a host last reported, each queue judged against what it is assigned.",
|
|
"example": "curl http://localhost:5001/api/printers/observed/x -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/observed/for-asset/<int:asset_id>",
|
|
"auth": "permission:printers.view",
|
|
"params": "path: asset_id (int)",
|
|
"purpose": "The same comparison, reached from an asset page: one block per host.",
|
|
"example": "curl http://localhost:5001/api/printers/observed/for-asset/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"assetid": 1,
|
|
"assetnumber": "1001",
|
|
"hosts": [
|
|
{
|
|
"assetid": 1,
|
|
"assetnumber": "1001",
|
|
"hostname": "<redacted:host>",
|
|
"observedat": "2026-01-01T00:00:00.000000",
|
|
"queues": [
|
|
{
|
|
"classification": "extra",
|
|
"driftfields": [],
|
|
"drivername": "HP Universal Printing PS",
|
|
"expecteddrivername": null,
|
|
"expectedportaddress": null,
|
|
"expectedqueuename": null,
|
|
"inheritedfromassetid": null,
|
|
"isassigneddefault": false,
|
|
"isdefault": true,
|
|
"isshared": false,
|
|
"portaddress": "<redacted:address>",
|
|
"portname": "IP_10.20.0.11",
|
|
"printerassetid": 5,
|
|
"printerid": 1,
|
|
"printername": "Bay label printer",
|
|
"queuename": "PRINTER-A"
|
|
},
|
|
{
|
|
"classification": "extra",
|
|
"driftfields": [],
|
|
"drivername": "HP Universal Printing PS",
|
|
"expecteddrivername": null,
|
|
"expectedportaddress": null,
|
|
"expectedqueuename": null,
|
|
"inheritedfromassetid": null,
|
|
"isassigneddefault": false,
|
|
"isdefault": false,
|
|
"isshared": false,
|
|
"portaddress": "<redacted:address>",
|
|
"portname": "IP_10.20.0.12",
|
|
"printerassetid": 6,
|
|
"printerid": 2,
|
|
"printername": "Bay laser printer",
|
|
"queuename": "PRINTER-B"
|
|
},
|
|
{
|
|
"classification": "unknown",
|
|
"driftfields": [],
|
|
"drivername": "HP Universal Printing PS",
|
|
"expecteddrivername": null,
|
|
"expectedportaddress": null,
|
|
"expectedqueuename": null,
|
|
"inheritedfromassetid": null,
|
|
"isassigneddefault": false,
|
|
"isdefault": false,
|
|
"isshared": false,
|
|
"portaddress": "<redacted:address>",
|
|
"portname": "IP_10.20.0.99",
|
|
"printerassetid": null,
|
|
"printerid": null,
|
|
"printername": null,
|
|
"queuename": "Reception Copier"
|
|
}
|
|
],
|
|
"seedcandidate": {
|
|
"defaultprinterassetid": 5,
|
|
"printerassetids": [
|
|
5,
|
|
6
|
|
],
|
|
"skipped": [
|
|
{
|
|
"drivername": "HP Universal Printing PS",
|
|
"isdefault": false,
|
|
"portaddress": "<redacted:address>",
|
|
"portname": "IP_10.20.0.99",
|
|
"queuename": "Reception Copier"
|
|
}
|
|
]
|
|
},
|
|
"source": "none",
|
|
"summary": {
|
|
"drifted": 0,
|
|
"extra": 2,
|
|
"matching": 0,
|
|
"missing": 0,
|
|
"unknown": 1
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/pc-default",
|
|
"auth": "jwt-optional (works signed out; the handler decides what shows)",
|
|
"params": "not documented",
|
|
"purpose": "Default printer for a PC, by machine (asset) number.",
|
|
"example": "curl http://localhost:5001/api/printers/pc-default -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "format",
|
|
"type": "string",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "machine",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"printerid": 1,
|
|
"windowsname": "HP-CSF04-Materials"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/printers/supplies/<int:modelsupplyid>",
|
|
"auth": "permission:printers.delete",
|
|
"params": "path: modelsupplyid (int)",
|
|
"purpose": "Delete a model supply.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/printers/supplies/1 -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"message": "Supply deleted",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/printers/supplies/<int:modelsupplyid>",
|
|
"auth": "permission:printers.edit",
|
|
"params": "path: modelsupplyid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a model supply.",
|
|
"example": "curl -X PUT http://localhost:5001/api/printers/supplies/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"capacitytier": "high",
|
|
"marketingname": "414X Black"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"capacitytier": "high",
|
|
"color": "black",
|
|
"createddate": "2026-01-01T00:00:00.000000Z",
|
|
"isactive": true,
|
|
"marketingname": "414X Black",
|
|
"modelnumber": "TestModel C999",
|
|
"modelnumberid": 1,
|
|
"modelsupplyid": 1,
|
|
"modifieddate": "2026-01-01T00:00:00.000000Z",
|
|
"notes": null,
|
|
"pageyield": null,
|
|
"partnumber": "W2020A",
|
|
"supplytype": "toner"
|
|
},
|
|
"message": "Supply updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/supplies/forecast",
|
|
"auth": "permission:printers.view",
|
|
"params": "not documented",
|
|
"purpose": "Days-to-empty and replacement counts per printer.",
|
|
"example": "curl http://localhost:5001/api/printers/supplies/forecast -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "days",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 90
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": {
|
|
"available": false,
|
|
"cartridges": [],
|
|
"days": 90,
|
|
"horizondays": 14,
|
|
"orderlist": [],
|
|
"reason": "Zabbix is not configured or not reachable",
|
|
"unestimated": []
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/supplies/meta",
|
|
"auth": "permission:printers.view",
|
|
"params": "not documented",
|
|
"purpose": "Allowed values for supply type, color, and capacity tier (for the UI).",
|
|
"example": "curl http://localhost:5001/api/printers/supplies/meta -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"capacitytiers": [
|
|
"standard",
|
|
"high",
|
|
"extrahigh",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"colors": [
|
|
"black",
|
|
"cyan",
|
|
"magenta",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"supplytypes": [
|
|
"toner",
|
|
"drum",
|
|
"waste",
|
|
"<trimmed for the example: 1 more>"
|
|
]
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/printers/supplies/refresh",
|
|
"auth": "permission:printers.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Clear cached Zabbix supply data so the next read pulls fresh values.",
|
|
"example": "curl -X POST http://localhost:5001/api/printers/supplies/refresh -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {},
|
|
"responseexample": {
|
|
"message": "Supply cache cleared",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/types",
|
|
"auth": "permission:printers.view",
|
|
"params": "not documented",
|
|
"purpose": "List all printer types.",
|
|
"example": "curl http://localhost:5001/api/printers/types -H \"Authorization: Bearer $TOK\"",
|
|
"queryparams": [
|
|
{
|
|
"name": "active",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "true"
|
|
},
|
|
{
|
|
"name": "page",
|
|
"type": "integer",
|
|
"required": false,
|
|
"default": 1
|
|
},
|
|
{
|
|
"name": "per_page",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "perpage",
|
|
"type": "integer",
|
|
"required": false
|
|
},
|
|
{
|
|
"name": "search",
|
|
"type": "string",
|
|
"required": false
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"pagination": {
|
|
"hasnext": false,
|
|
"hasprev": false,
|
|
"page": 1,
|
|
"perpage": 20,
|
|
"total": 0,
|
|
"totalpages": 0
|
|
},
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/printers/types",
|
|
"auth": "permission:printers.create",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Create a new printer type.",
|
|
"example": "curl -X POST http://localhost:5001/api/printers/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/printers/types/<int:type_id>",
|
|
"auth": "permission:printers.delete",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "Delete a printer type. Refused if any printer still uses it.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/printers/types/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/printers/types/<int:type_id>",
|
|
"auth": "permission:printers.view",
|
|
"params": "path: type_id (int)",
|
|
"purpose": "Get a single printer type.",
|
|
"example": "curl http://localhost:5001/api/printers/types/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/printers/types/<int:type_id>",
|
|
"auth": "permission:printers.edit",
|
|
"params": "path: type_id (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Update a printer type.",
|
|
"example": "curl -X PUT http://localhost:5001/api/printers/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "plugin-slides",
|
|
"endpoints": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/slides/<surface>",
|
|
"auth": "permission:slides.view or slides.manage",
|
|
"params": "path: surface (string)",
|
|
"purpose": "UNDOCUMENTED: slides.list_slides has no docstring.",
|
|
"example": "curl http://localhost:5001/api/slides/x -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "PATCH",
|
|
"path": "/api/slides/<surface>/<int:slideid>",
|
|
"auth": "permission:slides.manage",
|
|
"params": "path: surface (string), slideid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: slides.update_slide has no docstring.",
|
|
"example": "curl -X PATCH http://localhost:5001/api/slides/x/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/slides/<surface>/delete",
|
|
"auth": "permission:slides.manage",
|
|
"params": "path: surface (string); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: slides.delete_slides has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/slides/x/delete -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/slides/<surface>/order",
|
|
"auth": "permission:slides.manage",
|
|
"params": "path: surface (string); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: slides.reorder_slides has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/slides/x/order -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/slides/<surface>/upload",
|
|
"auth": "permission:slides.manage",
|
|
"params": "path: surface (string); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: slides.upload_slides has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/slides/x/upload -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/slides/feed",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "not documented",
|
|
"purpose": "Flat playlist for a surface. NOT wrapped in the success_response envelope so the screensaver's existing parser needs no change.",
|
|
"example": "curl http://localhost:5001/api/slides/feed",
|
|
"queryparams": [
|
|
{
|
|
"name": "surface",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "lobby"
|
|
}
|
|
],
|
|
"responseexample": {
|
|
"basepath": "/api/slides/img/lobby/",
|
|
"interval": 10,
|
|
"slides": [],
|
|
"success": true,
|
|
"surface": "lobby"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/slides/img/<surface>/<path:filename>",
|
|
"auth": "none (reviewed: named in the public-read or mutation sweep)",
|
|
"params": "path: surface (string), filename (path)",
|
|
"purpose": "Serve a slide image with a path-traversal guard.",
|
|
"example": "curl http://localhost:5001/api/slides/img/x/example.png"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "plugin-tools",
|
|
"endpoints": [
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/tools/secrets",
|
|
"auth": "jwt-optional (works signed out; the handler decides what shows)",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Store an already-encrypted secret and return its token.",
|
|
"example": "curl -X POST http://localhost:5001/api/tools/secrets -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"ciphertext": "<redacted:token>",
|
|
"iv": "MTIzNDU2Nzg5MDEy",
|
|
"views": 100
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"createddate": "2026-01-01T00:00:00.000000",
|
|
"expiresat": "2026-01-01T00:00:00.000000",
|
|
"token": "<redacted:secret>",
|
|
"viewcount": 0,
|
|
"viewsremaining": 100
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/tools/secrets/<token>",
|
|
"auth": "none (the unguessable token in the path is the authorisation)",
|
|
"params": "path: token (string)",
|
|
"purpose": "Whether a link is still live, WITHOUT spending it.",
|
|
"example": "curl http://localhost:5001/api/tools/secrets/x",
|
|
"responseexample": {
|
|
"data": {
|
|
"available": false
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/tools/secrets/<token>",
|
|
"auth": "none (the unguessable token in the path is the authorisation; redeeming spends the secret)",
|
|
"params": "path: token (string); body: JSON (fields not yet documented)",
|
|
"purpose": "Hand over the ciphertext once, then spend the view.",
|
|
"example": "curl -X POST http://localhost:5001/api/tools/secrets/x -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"ciphertext": "<redacted:token>",
|
|
"iv": "MTIzNDU2Nzg5MDEy"
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"surface": "plugin-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/<device_id>",
|
|
"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/<device_id>",
|
|
"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/<device_id>/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/<device_id>/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/<device_id>/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/<device_id>/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": "<redacted:person>",
|
|
"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": "<redacted:person>",
|
|
"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/<device_id>",
|
|
"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": "<redacted:person>"
|
|
},
|
|
"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=<redacted:token>"
|
|
},
|
|
"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": "<redacted:person>"
|
|
},
|
|
"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",
|
|
"<trimmed for the example: 1 more>"
|
|
],
|
|
"days": 365,
|
|
"rows": [
|
|
{
|
|
"action": "check-in",
|
|
"badge": "<redacted:person>",
|
|
"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": "<redacted:person>",
|
|
"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": "<redacted:person>",
|
|
"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": "<redacted:host>",
|
|
"vendor": "Acme"
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assets": [],
|
|
"enddate": "2026-01-01",
|
|
"isactive": true,
|
|
"lastcheckeddate": null,
|
|
"notes": null,
|
|
"prooffilename": null,
|
|
"proofurl": null,
|
|
"provider": "manual",
|
|
"servicelevel": null,
|
|
"servicetag": "<redacted:host>",
|
|
"startdate": null,
|
|
"status": "active",
|
|
"statuscolor": "#4CAF50",
|
|
"vendor": "Acme",
|
|
"warrantyid": 1
|
|
},
|
|
"message": "Warranty created",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/warranty/<int:warrantyid>",
|
|
"auth": "permission:warranty.delete",
|
|
"params": "path: warrantyid (int)",
|
|
"purpose": "UNDOCUMENTED: warranty.delete_warranty has no docstring.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/warranty/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/warranty/<int:warrantyid>",
|
|
"auth": "permission:warranty.view",
|
|
"params": "path: warrantyid (int)",
|
|
"purpose": "UNDOCUMENTED: warranty.get_warranty has no docstring.",
|
|
"example": "curl http://localhost:5001/api/warranty/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/warranty/<int:warrantyid>",
|
|
"auth": "permission:warranty.edit",
|
|
"params": "path: warrantyid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: warranty.update_warranty has no docstring.",
|
|
"example": "curl -X PUT http://localhost:5001/api/warranty/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"requestexample": {
|
|
"enddate": ""
|
|
},
|
|
"responseexample": {
|
|
"data": {
|
|
"assets": [],
|
|
"enddate": null,
|
|
"isactive": true,
|
|
"lastcheckeddate": null,
|
|
"notes": null,
|
|
"prooffilename": null,
|
|
"proofurl": null,
|
|
"provider": "manual",
|
|
"servicelevel": null,
|
|
"servicetag": "<redacted:host>",
|
|
"startdate": null,
|
|
"status": "unknown",
|
|
"statuscolor": "#9E9E9E",
|
|
"vendor": "Acme",
|
|
"warrantyid": 1
|
|
},
|
|
"message": "Warranty updated",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/warranty/<int:warrantyid>/proof",
|
|
"auth": "permission:warranty.edit",
|
|
"params": "path: warrantyid (int)",
|
|
"purpose": "Remove a warranty's proof document.",
|
|
"example": "curl -X DELETE http://localhost:5001/api/warranty/1/proof -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"enddate": null,
|
|
"isactive": true,
|
|
"lastcheckeddate": null,
|
|
"notes": null,
|
|
"prooffilename": null,
|
|
"proofurl": null,
|
|
"provider": "manual",
|
|
"servicelevel": null,
|
|
"servicetag": "<redacted:host>",
|
|
"startdate": null,
|
|
"status": "unknown",
|
|
"statuscolor": "#9E9E9E",
|
|
"vendor": "Dell",
|
|
"warrantyid": 1
|
|
},
|
|
"message": "Proof removed",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/warranty/<int:warrantyid>/proof",
|
|
"auth": "permission:warranty.edit",
|
|
"params": "path: warrantyid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "Upload (or replace) the proof-of-cover document for a warranty.",
|
|
"example": "curl -X POST http://localhost:5001/api/warranty/1/proof -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"responseexample": {
|
|
"data": {
|
|
"enddate": null,
|
|
"isactive": true,
|
|
"lastcheckeddate": null,
|
|
"notes": null,
|
|
"prooffilename": "Dell invoice 4471.pdf",
|
|
"proofurl": "/api/warranty/proof/warranty-1.pdf",
|
|
"provider": "manual",
|
|
"servicelevel": null,
|
|
"servicetag": "<redacted:host>",
|
|
"startdate": null,
|
|
"status": "unknown",
|
|
"statuscolor": "#9E9E9E",
|
|
"vendor": "Dell",
|
|
"warrantyid": 1
|
|
},
|
|
"message": "Proof uploaded",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
},
|
|
"readsbody": true
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/warranty/<int:warrantyid>/refresh",
|
|
"auth": "permission:warranty.edit",
|
|
"params": "path: warrantyid (int); body: JSON (fields not yet documented)",
|
|
"purpose": "UNDOCUMENTED: warranty.refresh_warranty has no docstring.",
|
|
"example": "curl -X POST http://localhost:5001/api/warranty/1/refresh -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/warranty/asset/<int:assetid>",
|
|
"auth": "permission:warranty.view",
|
|
"params": "path: assetid (int)",
|
|
"purpose": "Warranties covering one asset (for the asset-detail panel).",
|
|
"example": "curl http://localhost:5001/api/warranty/asset/1 -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/warranty/dashboard/expiring",
|
|
"auth": "permission:warranty.view",
|
|
"params": "not documented",
|
|
"purpose": "Warranties running out, and ones that already have.",
|
|
"example": "curl http://localhost:5001/api/warranty/dashboard/expiring -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": [],
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/warranty/proof/<path:filename>",
|
|
"auth": "permission:warranty.view",
|
|
"params": "path: filename (path)",
|
|
"purpose": "Download a proof document.",
|
|
"example": "curl http://localhost:5001/api/warranty/proof/example.png -H \"Authorization: Bearer $TOK\""
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/warranty/report",
|
|
"auth": "permission:warranty.view",
|
|
"params": "not documented",
|
|
"purpose": "Counts + lists bucketed by derived status.",
|
|
"example": "curl http://localhost:5001/api/warranty/report -H \"Authorization: Bearer $TOK\"",
|
|
"responseexample": {
|
|
"data": {
|
|
"buckets": {
|
|
"active": [],
|
|
"expired": [],
|
|
"expiring": [],
|
|
"unknown": []
|
|
},
|
|
"counts": {
|
|
"active": 0,
|
|
"expired": 0,
|
|
"expiring": 0,
|
|
"unknown": 0
|
|
}
|
|
},
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/warranty/sync/dell",
|
|
"auth": "permission:warranty.edit",
|
|
"params": "body: JSON (fields not yet documented)",
|
|
"purpose": "Look up every asset serial (= Dell service tag) that has no warranty yet and create warranties for the ones Dell recognizes.",
|
|
"example": "curl -X POST http://localhost:5001/api/warranty/sync/dell -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'",
|
|
"queryparams": [
|
|
{
|
|
"name": "all",
|
|
"type": "string",
|
|
"required": false,
|
|
"default": "false"
|
|
}
|
|
],
|
|
"requestexample": {},
|
|
"responseexample": {
|
|
"data": {
|
|
"candidates": 0,
|
|
"created": 0,
|
|
"matched": 0,
|
|
"updated": 0
|
|
},
|
|
"message": "No PCs need a warranty lookup.",
|
|
"meta": {
|
|
"requestid": "00000000",
|
|
"timestamp": "2026-01-01T00:00:00.000000Z"
|
|
},
|
|
"status": "success"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
] |