Files
shopdb-flask/docs/api-inventory.json
cproudlock 8fc6df8f0a Describe the API this branch actually serves
docs/openapi.json is served live at /api/docs on the production box and
documented none of the routes added since 2026-09-11. It is generated from
docs/api-inventory.json, which is not tracked on this branch, so the generator
had no input - and tests/test_api_inventory_parity.py skipped itself for the
same reason. No route here had ever been checked against the published contract.

The inventory is now generated from this branch's own url_map rather than
carried over from elsewhere, with each route's auth derived from the decorators
and gates on its view rather than guessed. A route whose gate cannot be
classified is marked for review, not quietly called public. gen_openapi.py can
refresh it from the live app, so this does not rot again, and human-authored
prose survives a refresh.

The parity test now RUNS instead of skipping.

The thing that mattered more than the missing pages: nine operations were
published with "security: []" - the machine-readable claim that no credentials
are needed - while their handlers require one. Two of them serve the bootstrap
installer and the agent package. A generated client, a firewall plan or anything
else reading the spec would have been told those are anonymous. Required auth is
now expressed as required, and a token-or-network gate is expressed as optional
auth with the network half named in the description, which is what it actually
is.

A test re-derives auth from the live app and fails when the committed inventory
disagrees, because the parity check only ever compared route lists: a wrong auth
string passed everything.

test_openapi_spec.py asserted that optional auth was the majority of the
surface, a premise the guest-role and permission model has made false. It now
holds the property that matters - an optional-auth route is expressed as
optional - rather than a count that was true once.

gen_openapi.py also loads .env before building the app, like every other script
that builds one, or a plain python run falls back to the hardcoded localhost URL.
2026-09-18 13:31:11 -04:00

4788 lines
222 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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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\""
},
{
"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\""
}
]
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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\""
},
{
"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"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"method": "GET",
"path": "/api/dashboard/widgets",
"auth": "permission:assets.view",
"params": "not documented",
"purpose": "Aggregate dashboard widget definitions from all enabled plugins.",
"example": "curl http://localhost:5001/api/dashboard/widgets -H \"Authorization: Bearer $TOK\""
}
]
},
{
"surface": "core-dashboarddefaults",
"endpoints": [
{
"method": "GET",
"path": "/api/dashboarddefaults",
"auth": "permission:settings.view",
"params": "not documented",
"purpose": "List all visitor-IP -> business-unit mappings.",
"example": "curl http://localhost:5001/api/dashboarddefaults -H \"Authorization: Bearer $TOK\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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"
},
{
"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"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
}
]
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
}
]
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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 '{}'"
},
{
"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"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
}
]
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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"
},
{
"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 '{}'"
},
{
"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"
},
{
"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 '{}'"
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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"
},
{
"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\""
}
]
},
{
"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\""
},
{
"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 '{}'"
},
{
"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 '{}'"
},
{
"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\""
},
{
"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 '{}'"
},
{
"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\""
},
{
"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\""
},
{
"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 '{}'"
}
]
}
]