{ "openapi": "3.1.0", "info": { "title": "ShopDB Flask API", "version": "0.12.0", "description": "Asset-management API (core + plugins). Responses use a `success_response` envelope: `{status, data, meta}`. Auth: Bearer JWT (login or a managed PAT) for `jwt`/`admin`/`permission:*`; `X-API-Key` for collector/managed-token endpoints; public endpoints need neither. A permission-gated route is published as bearer-required, which is what a default install does - a site that grants the permission to the `guest` role makes that same route answer a caller with no token." }, "servers": [ { "url": "/", "description": "relative to the deployed mount" } ], "components": { "schemas": { "SuccessEnvelope": { "type": "object", "properties": { "status": { "type": "string", "enum": [ "success" ] }, "data": { "description": "The payload. Shape is per endpoint." }, "meta": { "type": "object", "properties": { "timestamp": { "type": "string", "format": "date-time" }, "requestid": { "type": "string" }, "pagination": { "type": "object", "properties": { "page": { "type": "integer" }, "perpage": { "type": "integer" }, "total": { "type": "integer" }, "pages": { "type": "integer" } } } } } }, "required": [ "status" ] }, "ErrorEnvelope": { "type": "object", "properties": { "status": { "type": "string", "enum": [ "error" ] }, "data": { "type": "object", "properties": { "error": { "type": "object", "properties": { "code": { "type": "string" }, "message": { "type": "string" }, "details": { "type": "object" } }, "required": [ "code", "message" ] } }, "required": [ "error" ] }, "meta": { "type": "object" } }, "required": [ "status", "data" ] } }, "securitySchemes": { "bearerAuth": { "type": "http", "scheme": "bearer", "bearerFormat": "JWT", "description": "Login token or a managed Personal Access Token (scoped)." }, "apiKeyAuth": { "type": "apiKey", "in": "header", "name": "X-API-Key", "description": "A managed service or device token in a header. X-API-Key for collector and managed tokens (collector.ingest, geenforce.fetch); X-Endpoint-Bootstrap-Token for agent bootstrap; X-Kiosk-Token for a kiosk screen. The operation description names the header and, where the gate is token-OR-network, the allowlist that is the other half." }, "setupCodeAuth": { "type": "apiKey", "in": "query", "name": "code", "description": "A single-use provisioning code, redeemed in the query string because the caller is a browser being pointed at a URL. Spent on any attempt, right or wrong, and short-lived." } } }, "tags": [ { "name": "core-apitokens" }, { "name": "core-applications" }, { "name": "core-assets" }, { "name": "core-auditlogs" }, { "name": "core-auth" }, { "name": "core-businessunits" }, { "name": "core-collector" }, { "name": "core-customfields" }, { "name": "core-dashboard" }, { "name": "core-dashboarddefaults" }, { "name": "core-docs" }, { "name": "core-locations" }, { "name": "core-maplevels" }, { "name": "core-mappositions" }, { "name": "core-models" }, { "name": "core-modeltypes" }, { "name": "core-operatingsystems" }, { "name": "core-plugins" }, { "name": "core-pluginui" }, { "name": "core-reports" }, { "name": "core-scripts" }, { "name": "core-search" }, { "name": "core-settings" }, { "name": "core-setup" }, { "name": "core-shopdbbackups" }, { "name": "core-supportteams" }, { "name": "core-users" }, { "name": "core-vendors" }, { "name": "plugin-backups" }, { "name": "plugin-computers" }, { "name": "plugin-employees" }, { "name": "plugin-endpoints" }, { "name": "plugin-geenforce" }, { "name": "plugin-guides" }, { "name": "plugin-knowledgebase" }, { "name": "plugin-machines" }, { "name": "plugin-measuringtools" }, { "name": "plugin-network" }, { "name": "plugin-notifications" }, { "name": "plugin-printedparts" }, { "name": "plugin-printers" }, { "name": "plugin-slides" }, { "name": "plugin-tools" }, { "name": "plugin-usb" }, { "name": "plugin-warranty" } ], "paths": { "/api/apitokens": { "get": { "tags": [ "core-apitokens" ], "summary": "List the caller's own tokens. Admins may pass ?all=true for everyone's.", "description": "List the caller's own tokens. Admins may pass ?all=true for everyone's.\n\n**Auth:** jwt\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/apitokens -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-apitokens" ], "summary": "Create a token for the caller. Returns the full secret ONCE.", "description": "Create a token for the caller. Returns the full secret ONCE.\n\n**Auth:** permission:apitokens.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/apitokens -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/apitokens/{tokenid}": { "delete": { "tags": [ "core-apitokens" ], "summary": "Revoke (deactivate) a token. Own token, or any if admin.", "description": "Revoke (deactivate) a token. Own token, or any if admin.\n\n**Auth:** permission:apitokens.create\n\n**Params:** path: tokenid (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/apitokens/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "tokenid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-apitokens" ], "summary": "Rename, rescope, or deactivate a token. Own token, or any if admin.", "description": "Rename, rescope, or deactivate a token. Own token, or any if admin.\n\n**Auth:** permission:apitokens.create\n\n**Params:** path: tokenid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/apitokens/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "tokenid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: tokenid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/applications": { "get": { "tags": [ "core-applications" ], "summary": "List all applications.", "description": "List all applications.\n\n**Auth:** permission:applications.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/applications -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-applications" ], "summary": "Create a new application.", "description": "Create a new application.\n\n**Auth:** permission:applications.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/applications -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/applications/{app_id}": { "delete": { "tags": [ "core-applications" ], "summary": "Permanently delete an application, its versions, and its uploads.", "description": "Permanently delete an application, its versions, and its uploads.\n\n**Auth:** permission:applications.delete\n\n**Params:** path: app_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/applications/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-applications" ], "summary": "Get a single application with details.", "description": "Get a single application with details.\n\n**Auth:** permission:applications.view\n\n**Params:** path: app_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/applications/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-applications" ], "summary": "Update an application.", "description": "Update an application.\n\n**Auth:** permission:applications.edit\n\n**Params:** path: app_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/applications/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: app_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/applications/{app_id}/image": { "delete": { "tags": [ "core-applications" ], "summary": "Remove an application's image and clear the field.", "description": "Remove an application's image and clear the field.\n\n**Auth:** permission:applications.edit\n\n**Params:** path: app_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/applications/1/image -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "core-applications" ], "summary": "Upload (or replace) an application's image.", "description": "Upload (or replace) an application's image.\n\n**Auth:** permission:applications.edit\n\n**Params:** path: app_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/applications/1/image -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: app_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/applications/{app_id}/installed": { "get": { "tags": [ "core-applications" ], "summary": "List all computers that have this application installed.", "description": "List all computers that have this application installed.\n\n**Auth:** permission:applications.view\n\n**Params:** path: app_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/applications/1/installed -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/applications/{app_id}/package": { "delete": { "tags": [ "core-applications" ], "summary": "Remove an uploaded installer and clear the path it set.", "description": "Remove an uploaded installer and clear the path it set.\n\n**Auth:** permission:applications.edit\n\n**Params:** path: app_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/applications/1/package -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "core-applications" ], "summary": "Upload (or replace) the installer for an application.", "description": "Upload (or replace) the installer for an application.\n\n**Auth:** permission:applications.edit\n\n**Params:** path: app_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/applications/1/package -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: app_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/applications/{app_id}/revert": { "post": { "tags": [ "core-applications" ], "summary": "Strip an application back to a catalogue record.", "description": "Strip an application back to a catalogue record.\n\n**Auth:** permission:applications.edit\n\n**Params:** path: app_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/applications/1/revert -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: app_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/applications/{app_id}/versions": { "get": { "tags": [ "core-applications" ], "summary": "List all versions for an application.", "description": "List all versions for an application.\n\n**Auth:** permission:applications.view\n\n**Params:** path: app_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/applications/1/versions -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "core-applications" ], "summary": "Create a new version for an application.", "description": "Create a new version for an application.\n\n**Auth:** permission:applications.create\n\n**Params:** path: app_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/applications/1/versions -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: app_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/applications/image/{filename}": { "get": { "tags": [ "core-applications" ], "summary": "Serve an uploaded application image.", "description": "Serve an uploaded application image.\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** path: filename (path)\n\n**Example:**\n```\ncurl http://localhost:5001/api/applications/image/example.png\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "filename", "in": "path", "required": true, "schema": { "type": "string", "description": "may contain slashes" } } ] } }, "/api/applications/machines/{machine_id}": { "get": { "tags": [ "core-applications" ], "summary": "List all applications installed on a computer.", "description": "List all applications installed on a computer.\n\n**Auth:** permission:applications.view\n\n**Params:** path: machine_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/applications/machines/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "machine_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "core-applications" ], "summary": "Install an application on a computer.", "description": "Install an application on a computer.\n\n**Auth:** permission:applications.create\n\n**Params:** path: machine_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/applications/machines/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "machine_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: machine_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/applications/machines/{machine_id}/{app_id}": { "delete": { "tags": [ "core-applications" ], "summary": "Uninstall an application from a computer.", "description": "Uninstall an application from a computer.\n\n**Auth:** permission:applications.delete\n\n**Params:** path: machine_id (int), app_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/applications/machines/1/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "machine_id", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-applications" ], "summary": "Update installed application (e.g., change version).", "description": "Update installed application (e.g., change version).\n\n**Auth:** permission:applications.edit\n\n**Params:** path: machine_id (int), app_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/applications/machines/1/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "machine_id", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: machine_id (int), app_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/applications/package/{filename}": { "get": { "tags": [ "core-applications" ], "summary": "Download an uploaded installer.", "description": "Download an uploaded installer.\n\n**Auth:** permission:applications.download\n\n**Params:** path: filename (path)\n\n**Example:**\n```\ncurl http://localhost:5001/api/applications/package/example.png -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "filename", "in": "path", "required": true, "schema": { "type": "string", "description": "may contain slashes" } } ] } }, "/api/assets": { "get": { "tags": [ "core-assets" ], "summary": "List all assets with filtering and pagination.", "description": "List all assets with filtering and pagination.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/assets -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-assets" ], "summary": "Create a new asset.", "description": "Create a new asset.\n\n**Auth:** permission:assets.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/assets -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/assets/{asset_id}": { "delete": { "tags": [ "core-assets" ], "summary": "Delete (soft delete) an asset.", "description": "Delete (soft delete) an asset.\n\n**Auth:** permission:assets.delete\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/assets/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-assets" ], "summary": "Get a single asset with full details.", "description": "Get a single asset with full details.\n\n**Auth:** permission:assets.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/assets/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-assets" ], "summary": "Update an asset.", "description": "Update an asset.\n\n**Auth:** permission:assets.edit\n\n**Params:** path: asset_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/assets/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: asset_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/assets/{asset_id}/communications": { "get": { "tags": [ "core-assets" ], "summary": "Get all communications for an asset.", "description": "Get all communications for an asset.\n\n**Auth:** permission:assets.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/assets/1/communications -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/assets/{asset_id}/relationships": { "get": { "tags": [ "core-assets" ], "summary": "Get all relationships for an asset.", "description": "Get all relationships for an asset.\n\n**Auth:** permission:assets.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/assets/1/relationships -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/assets/lookup/{assetnumber}": { "get": { "tags": [ "core-assets" ], "summary": "Look up an asset by its asset number.", "description": "Look up an asset by its asset number.\n\n**Auth:** permission:assets.view\n\n**Params:** path: assetnumber (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/assets/lookup/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "assetnumber", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/assets/map": { "get": { "tags": [ "core-assets" ], "summary": "Get all assets with map positions for unified floor map display.", "description": "Get all assets with map positions for unified floor map display.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/assets/map -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/assets/relationships": { "post": { "tags": [ "core-assets" ], "summary": "Create a relationship between two assets.", "description": "Create a relationship between two assets.\n\n**Auth:** permission:assets.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/assets/relationships -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/assets/relationships/{rel_id}": { "delete": { "tags": [ "core-assets" ], "summary": "Delete an asset relationship.", "description": "Delete an asset relationship.\n\n**Auth:** permission:assets.delete\n\n**Params:** path: rel_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/assets/relationships/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "rel_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/assets/relationshiptypes": { "get": { "tags": [ "core-assets" ], "summary": "List all asset relationship types.", "description": "List all asset relationship types.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/assets/relationshiptypes -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-assets" ], "summary": "Create a new asset relationship type.", "description": "Create a new asset relationship type.\n\n**Auth:** permission:assets.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/assets/relationshiptypes -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/assets/relationshiptypes/{type_id}": { "delete": { "tags": [ "core-assets" ], "summary": "Delete a relationship type. Refused if any relationship still uses it.", "description": "Delete a relationship type. Refused if any relationship still uses it.\n\n**Auth:** permission:assets.delete\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/assets/relationshiptypes/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-assets" ], "summary": "Update a relationship type.", "description": "Update a relationship type.\n\n**Auth:** permission:assets.edit\n\n**Params:** path: type_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/assets/relationshiptypes/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: type_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/assets/statuses": { "get": { "tags": [ "core-assets" ], "summary": "List all asset statuses.", "description": "List all asset statuses.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/assets/statuses -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-assets" ], "summary": "Create a new asset status.", "description": "Create a new asset status.\n\n**Auth:** permission:assets.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/assets/statuses -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/assets/statuses/{status_id}": { "delete": { "tags": [ "core-assets" ], "summary": "Delete an asset status. Refused if any asset still uses it.", "description": "Delete an asset status. Refused if any asset still uses it.\n\n**Auth:** permission:assets.delete\n\n**Params:** path: status_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/assets/statuses/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "status_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-assets" ], "summary": "Get a single asset status.", "description": "Get a single asset status.\n\n**Auth:** permission:assets.view\n\n**Params:** path: status_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/assets/statuses/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "status_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-assets" ], "summary": "Update an asset status.", "description": "Update an asset status.\n\n**Auth:** permission:assets.edit\n\n**Params:** path: status_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/assets/statuses/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "status_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: status_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/assets/types": { "get": { "tags": [ "core-assets" ], "summary": "List all asset types.", "description": "List all asset types.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/assets/types -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-assets" ], "summary": "Create a new asset type.", "description": "Create a new asset type.\n\n**Auth:** permission:assets.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/assets/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/assets/types/{type_id}": { "get": { "tags": [ "core-assets" ], "summary": "Get a single asset type.", "description": "Get a single asset type.\n\n**Auth:** permission:assets.view\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/assets/types/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-assets" ], "summary": "Update an asset type's display fields (color/icon/description). The name, plugin, and table are structural and not...", "description": "Update an asset type's display fields (color/icon/description). The name, plugin, and table are structural and not editable here.\n\n**Auth:** permission:assets.edit\n\n**Params:** path: type_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/assets/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: type_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/auditlogs": { "get": { "tags": [ "core-auditlogs" ], "summary": "List audit logs with filtering and pagination.", "description": "List audit logs with filtering and pagination.\n\n**Auth:** permission:audit.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/auditlogs -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/auditlogs/entity/{entitytype}/{entityid}": { "get": { "tags": [ "core-auditlogs" ], "summary": "Get audit history for a specific entity.", "description": "Get audit history for a specific entity.\n\n**Auth:** permission:audit.view\n\n**Params:** path: entitytype (string), entityid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/auditlogs/entity/x/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "entitytype", "in": "path", "required": true, "schema": { "type": "string" } }, { "name": "entityid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/auditlogs/purge": { "post": { "tags": [ "core-auditlogs" ], "summary": "Delete entries older than the retention window.", "description": "Delete entries older than the retention window.\n\n**Auth:** permission:audit.purge\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/auditlogs/purge -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/auditlogs/retention": { "get": { "tags": [ "core-auditlogs" ], "summary": "Size of the log and what the configured retention would remove.", "description": "Size of the log and what the configured retention would remove.\n\n**Auth:** permission:audit.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/auditlogs/retention -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/auditlogs/stats": { "get": { "tags": [ "core-auditlogs" ], "summary": "Get audit log statistics.", "description": "Get audit log statistics.\n\n**Auth:** permission:audit.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/auditlogs/stats -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/auth/change-password": { "post": { "tags": [ "core-auth" ], "summary": "Change the authenticated user's own password.", "description": "Change the authenticated user's own password.\n\n**Auth:** jwt\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/auth/change-password -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/auth/login": { "post": { "tags": [ "core-auth" ], "summary": "Authenticate user and return JWT tokens.", "description": "Authenticate user and return JWT tokens.\n\n**Auth:** none (the login surface itself; rate limited, 5-strike lockout)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/auth/login -H 'Content-Type: application/json' -d '{}'\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/auth/logout": { "post": { "tags": [ "core-auth" ], "summary": "Logout user (for frontend token cleanup).", "description": "Logout user (for frontend token cleanup).\n\n**Auth:** jwt\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/auth/logout -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/auth/me": { "get": { "tags": [ "core-auth" ], "summary": "Get current authenticated user info.", "description": "Get current authenticated user info.\n\n**Auth:** jwt\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/auth/me -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/auth/refresh": { "post": { "tags": [ "core-auth" ], "summary": "Refresh access token using refresh token.", "description": "Refresh access token using refresh token.\n\n**Auth:** jwt (refresh token)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/auth/refresh -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/businessunits": { "get": { "tags": [ "core-businessunits" ], "summary": "List all business units.", "description": "List all business units.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/businessunits -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } }, "post": { "tags": [ "core-businessunits" ], "summary": "Create a new business unit.", "description": "Create a new business unit.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/businessunits -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/businessunits/{bu_id}": { "delete": { "tags": [ "core-businessunits" ], "summary": "Delete (deactivate) a business unit.", "description": "Delete (deactivate) a business unit.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: bu_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/businessunits/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "bu_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-businessunits" ], "summary": "Get a single business unit.", "description": "Get a single business unit.\n\n**Auth:** permission:assets.view\n\n**Params:** path: bu_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/businessunits/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "bu_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-businessunits" ], "summary": "Update a business unit.", "description": "Update a business unit.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: bu_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/businessunits/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "bu_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: bu_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/collector/{pluginname}": { "post": { "tags": [ "core-collector" ], "summary": "Generic collector ingest for any plugin (ADR-006).", "description": "Generic collector ingest for any plugin (ADR-006).\n\n**Auth:** api-key (per-plugin collector token)\n\n**Params:** path: pluginname (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/collector/x -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "pluginname", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: pluginname (string); body: JSON (fields not yet documented)" } } } } } }, "/api/collector/_schemas": { "get": { "tags": [ "core-collector" ], "summary": "List collector schemas for all enabled plugins (JWT-protected).", "description": "List collector schemas for all enabled plugins (JWT-protected).\n\n**Auth:** jwt\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/collector/_schemas -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/collector/apps": { "post": { "tags": [ "core-collector" ], "summary": "Update installed applications for a PC (matched by hostname).", "description": "Update installed applications for a PC (matched by hostname).\n\n**Auth:** api-key (collector token, legacy shared key)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/collector/apps -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/collector/bulk": { "post": { "tags": [ "core-collector" ], "summary": "Bulk update multiple PCs at once.", "description": "Bulk update multiple PCs at once.\n\n**Auth:** api-key (collector token, legacy shared key)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/collector/bulk -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/collector/heartbeat": { "post": { "tags": [ "core-collector" ], "summary": "Record PC online status / heartbeat (single or batch).", "description": "Record PC online status / heartbeat (single or batch).\n\n**Auth:** api-key (collector token, legacy shared key)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/collector/heartbeat -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/collector/pc": { "post": { "tags": [ "core-collector" ], "summary": "Update one PC from the collection script (matched by hostname).", "description": "Update one PC from the collection script (matched by hostname).\n\n**Auth:** api-key (collector token, legacy shared key)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/collector/pc -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/collector/status": { "get": { "tags": [ "core-collector" ], "summary": "Check collector API status.", "description": "Check collector API status.\n\n**Auth:** api-key (per-plugin collector token)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/collector/status -H \"X-API-Key: $KEY\"\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/customfields": { "get": { "tags": [ "core-customfields" ], "summary": "List custom-field definitions. Filter by ?assettypeid=. ?active=false includes inactive ones.", "description": "List custom-field definitions. Filter by ?assettypeid=. ?active=false includes inactive ones.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/customfields -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-customfields" ], "summary": "UNDOCUMENTED: customfields.create_field has no docstring.", "description": "UNDOCUMENTED: customfields.create_field has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/customfields -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/customfields/{fieldid}": { "delete": { "tags": [ "core-customfields" ], "summary": "UNDOCUMENTED: customfields.delete_field has no docstring.", "description": "UNDOCUMENTED: customfields.delete_field has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: fieldid (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/customfields/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "fieldid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-customfields" ], "summary": "UNDOCUMENTED: customfields.update_field has no docstring.", "description": "UNDOCUMENTED: customfields.update_field has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: fieldid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/customfields/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "fieldid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: fieldid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/customfields/asset/{assetid}": { "get": { "tags": [ "core-customfields" ], "summary": "Active custom fields for an asset's type, merged with its values.", "description": "Active custom fields for an asset's type, merged with its values.\n\n**Auth:** permission:assets.view\n\n**Params:** path: assetid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/customfields/asset/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "assetid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-customfields" ], "summary": "Upsert values for an asset. Body: {values: {fieldid: value, ...}}.", "description": "Upsert values for an asset. Body: {values: {fieldid: value, ...}}.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: assetid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/customfields/asset/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "assetid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: assetid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/dashboard": { "get": { "tags": [ "core-dashboard" ], "summary": "Get dashboard summary data (asset-based).", "description": "Get dashboard summary data (asset-based).\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/dashboard -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/dashboard/capabilities": { "get": { "tags": [ "core-dashboard" ], "summary": "What THIS caller can reach, for chrome that would otherwise only 401.", "description": "What THIS caller can reach, for chrome that would otherwise only 401.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/dashboard/capabilities -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/dashboard/health": { "get": { "tags": [ "core-dashboard" ], "summary": "Health check endpoint (no auth required).", "description": "Health check endpoint (no auth required).\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/dashboard/health\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/dashboard/navigation": { "get": { "tags": [ "core-dashboard" ], "summary": "Get navigation items from all loaded plugins.", "description": "Get navigation items from all loaded plugins.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/dashboard/navigation -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/dashboard/stats": { "get": { "tags": [ "core-dashboard" ], "summary": "Get detailed statistics by asset type.", "description": "Get detailed statistics by asset type.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/dashboard/stats -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/dashboard/summary": { "get": { "tags": [ "core-dashboard" ], "summary": "Get dashboard summary data (asset-based).", "description": "Get dashboard summary data (asset-based).\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/dashboard/summary -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/dashboard/widgets": { "get": { "tags": [ "core-dashboard" ], "summary": "Aggregate dashboard widget definitions from all enabled plugins.", "description": "Aggregate dashboard widget definitions from all enabled plugins.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/dashboard/widgets -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/dashboarddefaults": { "get": { "tags": [ "core-dashboarddefaults" ], "summary": "List all visitor-IP -> business-unit mappings.", "description": "List all visitor-IP -> business-unit mappings.\n\n**Auth:** permission:settings.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/dashboarddefaults -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-dashboarddefaults" ], "summary": "Create a visitor-IP -> business-unit mapping.", "description": "Create a visitor-IP -> business-unit mapping.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/dashboarddefaults -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/dashboarddefaults/{default_id}": { "delete": { "tags": [ "core-dashboarddefaults" ], "summary": "Delete (deactivate) a mapping.", "description": "Delete (deactivate) a mapping.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: default_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/dashboarddefaults/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "default_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-dashboarddefaults" ], "summary": "Update a mapping.", "description": "Update a mapping.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: default_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/dashboarddefaults/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "default_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: default_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/dashboarddefaults/display-role": { "get": { "tags": [ "core-dashboarddefaults" ], "summary": "Resolve what a single 'display' PC should show, from its own IP.", "description": "Resolve what a single 'display' PC should show, from its own IP.\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/dashboarddefaults/display-role\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/dashboarddefaults/visitor-location": { "get": { "tags": [ "core-dashboarddefaults" ], "summary": "Resolve the business unit for the calling display by its IP.", "description": "Resolve the business unit for the calling display by its IP.\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/dashboarddefaults/visitor-location\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/docs": { "get": { "tags": [ "core-docs" ], "summary": "Redoc page. url_for keeps the asset URLs correct under any mount.", "description": "Redoc page. url_for keeps the asset URLs correct under any mount.\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/docs/\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/docs/llms.txt": { "get": { "tags": [ "core-docs" ], "summary": "Concise LLM-oriented API guide.", "description": "Concise LLM-oriented API guide.\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/docs/llms.txt\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/docs/openapi.json": { "get": { "tags": [ "core-docs" ], "summary": "The generated OpenAPI 3.1 spec (machine + LLM readable).", "description": "The generated OpenAPI 3.1 spec (machine + LLM readable).\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/docs/openapi.json\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/docs/redoc.standalone.js": { "get": { "tags": [ "core-docs" ], "summary": "Vendored Redoc bundle (offline).", "description": "Vendored Redoc bundle (offline).\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/docs/redoc.standalone.js\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/locations": { "get": { "tags": [ "core-locations" ], "summary": "List all locations.", "description": "List all locations.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/locations -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-locations" ], "summary": "Create a new location.", "description": "Create a new location.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/locations -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/locations/{location_id}": { "delete": { "tags": [ "core-locations" ], "summary": "Delete (deactivate) a location.", "description": "Delete (deactivate) a location.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: location_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/locations/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "location_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-locations" ], "summary": "Get a single location.", "description": "Get a single location.\n\n**Auth:** permission:assets.view\n\n**Params:** path: location_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/locations/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "location_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-locations" ], "summary": "Update a location.", "description": "Update a location.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: location_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/locations/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "location_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: location_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/locations/types": { "get": { "tags": [ "core-locations" ], "summary": "List location types. ?active=false includes inactive ones.", "description": "List location types. ?active=false includes inactive ones.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/locations/types -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-locations" ], "summary": "UNDOCUMENTED: locations.create_location_type has no docstring.", "description": "UNDOCUMENTED: locations.create_location_type has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/locations/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/locations/types/{type_id}": { "delete": { "tags": [ "core-locations" ], "summary": "UNDOCUMENTED: locations.delete_location_type has no docstring.", "description": "UNDOCUMENTED: locations.delete_location_type has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/locations/types/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-locations" ], "summary": "UNDOCUMENTED: locations.update_location_type has no docstring.", "description": "UNDOCUMENTED: locations.update_location_type has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: type_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/locations/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: type_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/maplevels": { "get": { "tags": [ "core-maplevels" ], "summary": "Every active level, grouped by building, in display order.", "description": "Every active level, grouped by building, in display order.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/maplevels -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } }, "post": { "tags": [ "core-maplevels" ], "summary": "UNDOCUMENTED: maplevels.create_level has no docstring.", "description": "UNDOCUMENTED: maplevels.create_level has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/maplevels -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/maplevels/{levelid}": { "delete": { "tags": [ "core-maplevels" ], "summary": "Deactivate a level, refusing while assets are still placed on it.", "description": "Deactivate a level, refusing while assets are still placed on it.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: levelid (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/maplevels/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "levelid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-maplevels" ], "summary": "UNDOCUMENTED: maplevels.get_level has no docstring.", "description": "UNDOCUMENTED: maplevels.get_level has no docstring.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** path: levelid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/maplevels/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "levelid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "patch": { "tags": [ "core-maplevels" ], "summary": "UNDOCUMENTED: maplevels.update_level has no docstring.", "description": "UNDOCUMENTED: maplevels.update_level has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: levelid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PATCH http://localhost:5001/api/maplevels/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "levelid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: levelid (int); body: JSON (fields not yet documented)" } } } } }, "put": { "tags": [ "core-maplevels" ], "summary": "UNDOCUMENTED: maplevels.update_level has no docstring.", "description": "UNDOCUMENTED: maplevels.update_level has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: levelid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PATCH http://localhost:5001/api/maplevels/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "levelid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: levelid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/maplevels/{levelid}/blueprint": { "post": { "tags": [ "core-maplevels" ], "summary": "Upload this level's blueprint for one theme.", "description": "Upload this level's blueprint for one theme.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: levelid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/maplevels/1/blueprint -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "levelid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: levelid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/maplevels/{levelid}/blueprint/{filename}": { "get": { "tags": [ "core-maplevels" ], "summary": "Serve a level's blueprint image. Public, for the same reason as above.", "description": "Serve a level's blueprint image. Public, for the same reason as above.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** path: levelid (int), filename (path)\n\n**Example:**\n```\ncurl http://localhost:5001/api/maplevels/1/blueprint/example.png -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "levelid", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "filename", "in": "path", "required": true, "schema": { "type": "string", "description": "may contain slashes" } } ] } }, "/api/maplevels/buildings": { "post": { "tags": [ "core-maplevels" ], "summary": "UNDOCUMENTED: maplevels.create_building has no docstring.", "description": "UNDOCUMENTED: maplevels.create_building has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/maplevels/buildings -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/maplevels/buildings/{buildingid}": { "patch": { "tags": [ "core-maplevels" ], "summary": "Rename or reorder a building. Levels move with it; nothing repositions.", "description": "Rename or reorder a building. Levels move with it; nothing repositions.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: buildingid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PATCH http://localhost:5001/api/maplevels/buildings/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "buildingid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: buildingid (int); body: JSON (fields not yet documented)" } } } } }, "put": { "tags": [ "core-maplevels" ], "summary": "Rename or reorder a building. Levels move with it; nothing repositions.", "description": "Rename or reorder a building. Levels move with it; nothing repositions.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: buildingid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PATCH http://localhost:5001/api/maplevels/buildings/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "buildingid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: buildingid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/mappositions/positions": { "post": { "tags": [ "core-mappositions" ], "summary": "Set positions for many assets at once.", "description": "Set positions for many assets at once.\n\n**Auth:** permission:assets.edit\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/mappositions/positions -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/mappositions/snapshots": { "get": { "tags": [ "core-mappositions" ], "summary": "Snapshots, newest first. Metadata only - the positions are large.", "description": "Snapshots, newest first. Metadata only - the positions are large.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/mappositions/snapshots -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/mappositions/snapshots/{snapshotid}/restore": { "post": { "tags": [ "core-mappositions" ], "summary": "Put the positions in this snapshot back.", "description": "Put the positions in this snapshot back.\n\n**Auth:** permission:assets.edit\n\n**Params:** path: snapshotid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/mappositions/snapshots/1/restore -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "snapshotid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: snapshotid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/mappositions/transform": { "post": { "tags": [ "core-mappositions" ], "summary": "Move every placed marker on a level by a transform read off landmarks.", "description": "Move every placed marker on a level by a transform read off landmarks.\n\n**Auth:** permission:assets.edit\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/mappositions/transform -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/mappositions/verify": { "post": { "tags": [ "core-mappositions" ], "summary": "Mark markers as reviewed against the current drawing without moving them.", "description": "Mark markers as reviewed against the current drawing without moving them.\n\n**Auth:** permission:assets.edit\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/mappositions/verify -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/models": { "get": { "tags": [ "core-models" ], "summary": "List all vendor catalog models.", "description": "List all vendor catalog models.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/models -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-models" ], "summary": "Create a new model.", "description": "Create a new model.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/models -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/models/{model_id}": { "delete": { "tags": [ "core-models" ], "summary": "Delete (deactivate) a model.", "description": "Delete (deactivate) a model.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: model_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/models/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "model_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-models" ], "summary": "Get a single model.", "description": "Get a single model.\n\n**Auth:** permission:assets.view\n\n**Params:** path: model_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/models/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "model_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-models" ], "summary": "Update a model.", "description": "Update a model.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: model_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/models/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "model_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: model_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/models/{model_id}/image": { "delete": { "tags": [ "core-models" ], "summary": "Clear a model image and delete the uploaded file if we own it.", "description": "Clear a model image and delete the uploaded file if we own it.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: model_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/models/1/image -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "model_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "core-models" ], "summary": "Upload (or replace) the photo for a model.", "description": "Upload (or replace) the photo for a model.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: model_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/models/1/image -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "model_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: model_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/models/image/{filename}": { "get": { "tags": [ "core-models" ], "summary": "Serve an uploaded model image (public - asset detail pages read it).", "description": "Serve an uploaded model image (public - asset detail pages read it).\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** path: filename (path)\n\n**Example:**\n```\ncurl http://localhost:5001/api/models/image/example.png\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "filename", "in": "path", "required": true, "schema": { "type": "string", "description": "may contain slashes" } } ] } }, "/api/modeltypes": { "get": { "tags": [ "core-modeltypes" ], "summary": "List all model types with optional filtering.", "description": "List all model types with optional filtering.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/modeltypes -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-modeltypes" ], "summary": "Create a new model type.", "description": "Create a new model type.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/modeltypes -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/modeltypes/{type_id}": { "delete": { "tags": [ "core-modeltypes" ], "summary": "Delete (deactivate) a model type.", "description": "Delete (deactivate) a model type.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/modeltypes/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-modeltypes" ], "summary": "Get a single model type.", "description": "Get a single model type.\n\n**Auth:** permission:assets.view\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/modeltypes/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-modeltypes" ], "summary": "Update a model type.", "description": "Update a model type.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: type_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/modeltypes/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: type_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/operatingsystems": { "get": { "tags": [ "core-operatingsystems" ], "summary": "List all operating systems.", "description": "List all operating systems.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/operatingsystems -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-operatingsystems" ], "summary": "Create a new operating system.", "description": "Create a new operating system.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/operatingsystems -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/operatingsystems/{os_id}": { "delete": { "tags": [ "core-operatingsystems" ], "summary": "Delete (deactivate) an operating system.", "description": "Delete (deactivate) an operating system.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: os_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/operatingsystems/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "os_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-operatingsystems" ], "summary": "Get a single operating system.", "description": "Get a single operating system.\n\n**Auth:** permission:assets.view\n\n**Params:** path: os_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/operatingsystems/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "os_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-operatingsystems" ], "summary": "Update an operating system.", "description": "Update an operating system.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: os_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/operatingsystems/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "os_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: os_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/plugins": { "get": { "tags": [ "core-plugins" ], "summary": "List all discovered plugins (enabled or not) with their metadata and the framework contract version.", "description": "List all discovered plugins (enabled or not) with their metadata and the framework contract version.\n\n**Auth:** permission:settings.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/plugins -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/plugins/{name}": { "put": { "tags": [ "core-plugins" ], "summary": "Enable or disable a plugin. Takes effect on the next app restart for route/navigation changes.", "description": "Enable or disable a plugin. Takes effect on the next app restart for route/navigation changes.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: name (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/plugins/x -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "name", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: name (string); body: JSON (fields not yet documented)" } } } } } }, "/api/plugins/enabled": { "get": { "tags": [ "core-plugins" ], "summary": "Return just the names of enabled plugins as a flat array.", "description": "Return just the names of enabled plugins as a flat array.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/plugins/enabled -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/plugins/settings-routes": { "get": { "tags": [ "core-plugins" ], "summary": "Return settings routes contributed by all enabled plugins.", "description": "Return settings routes contributed by all enabled plugins.\n\n**Auth:** permission:settings.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/plugins/settings-routes -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/pluginui/asset-panels": { "get": { "tags": [ "core-pluginui" ], "summary": "Return the asset-detail panels matching one asset's type (get_asset_panels).", "description": "Return the asset-detail panels matching one asset's type (get_asset_panels).\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/pluginui/asset-panels -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/pluginui/asset-presentation": { "get": { "tags": [ "core-pluginui" ], "summary": "Merge enabled plugins' asset-type presentation entries (hook).", "description": "Merge enabled plugins' asset-type presentation entries (hook).\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/pluginui/asset-presentation -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/pluginui/asset-type-descriptors": { "get": { "tags": [ "core-pluginui" ], "summary": "Merge enabled plugins' asset-type subtype descriptors.", "description": "Merge enabled plugins' asset-type subtype descriptors.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/pluginui/asset-type-descriptors -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/pluginui/core-type-descriptors": { "get": { "tags": [ "core-pluginui" ], "summary": "Return type descriptors for core-owned non-asset types.", "description": "Return type descriptors for core-owned non-asset types.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/pluginui/core-type-descriptors -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/pluginui/map-overlays": { "get": { "tags": [ "core-pluginui" ], "summary": "Merge enabled plugins' map overlay declarations (get_map_overlays hook).", "description": "Merge enabled plugins' map overlay declarations (get_map_overlays hook).\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/pluginui/map-overlays -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/pluginui/settings-cards": { "get": { "tags": [ "core-pluginui" ], "summary": "Merge enabled plugins' settings-catalog cards (get_settings_cards hook).", "description": "Merge enabled plugins' settings-catalog cards (get_settings_cards hook).\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/pluginui/settings-cards -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/reports": { "get": { "tags": [ "core-reports" ], "summary": "List all available reports.", "description": "List all available reports.\n\n**Auth:** permission:reports.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/reports -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/reports/asset-inventory": { "get": { "tags": [ "core-reports" ], "summary": "Report: Complete asset inventory summary.", "description": "Report: Complete asset inventory summary.\n\n**Auth:** permission:reports.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/reports/asset-inventory -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/reports/assets-by-status": { "get": { "tags": [ "core-reports" ], "summary": "Report: Asset count grouped by status.", "description": "Report: Asset count grouped by status.\n\n**Auth:** permission:reports.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/reports/assets-by-status -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/reports/email": { "post": { "tags": [ "core-reports" ], "summary": "Email a report's data as an HTML table (on-demand delivery).", "description": "Email a report's data as an HTML table (on-demand delivery).\n\n**Auth:** permission:reports.export\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/reports/email -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/reports/kb-popularity": { "get": { "tags": [ "core-reports" ], "summary": "Report: Most clicked knowledge base articles.", "description": "Report: Most clicked knowledge base articles.\n\n**Auth:** permission:reports.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/reports/kb-popularity -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/reports/machines-by-type": { "get": { "tags": [ "core-reports" ], "summary": "Report: Machine count grouped by machine type.", "description": "Report: Machine count grouped by machine type.\n\n**Auth:** permission:reports.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/reports/machines-by-type -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/reports/pc-relationships": { "get": { "tags": [ "core-reports" ], "summary": "Report: PCs with relationships to shop floor machines.", "description": "Report: PCs with relationships to shop floor machines.\n\n**Auth:** permission:reports.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/reports/pc-relationships -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/reports/software-compliance": { "get": { "tags": [ "core-reports" ], "summary": "Report: Required applications vs installed (per PC).", "description": "Report: Required applications vs installed (per PC).\n\n**Auth:** permission:reports.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/reports/software-compliance -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/scripts": { "get": { "tags": [ "core-scripts" ], "summary": "List scripts (active by default).", "description": "List scripts (active by default).\n\n**Auth:** permission:endpoints.runscript\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/scripts -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-scripts" ], "summary": "Create a script catalog entry (body uploaded separately).", "description": "Create a script catalog entry (body uploaded separately).\n\n**Auth:** permission:endpoints.runscript\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/scripts -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/scripts/{script_id}": { "delete": { "tags": [ "core-scripts" ], "summary": "UNDOCUMENTED: scripts.delete_script has no docstring.", "description": "UNDOCUMENTED: scripts.delete_script has no docstring.\n\n**Auth:** permission:endpoints.runscript\n\n**Params:** path: script_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/scripts/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "script_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-scripts" ], "summary": "UNDOCUMENTED: scripts.get_script has no docstring.", "description": "UNDOCUMENTED: scripts.get_script has no docstring.\n\n**Auth:** permission:endpoints.runscript\n\n**Params:** path: script_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/scripts/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "script_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-scripts" ], "summary": "UNDOCUMENTED: scripts.update_script has no docstring.", "description": "UNDOCUMENTED: scripts.update_script has no docstring.\n\n**Auth:** permission:endpoints.runscript\n\n**Params:** path: script_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/scripts/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "script_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: script_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/scripts/{script_id}/body": { "post": { "tags": [ "core-scripts" ], "summary": "Upload (or replace) the .ps1 body for a script.", "description": "Upload (or replace) the .ps1 body for a script.\n\n**Auth:** permission:endpoints.runscript\n\n**Params:** path: script_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/scripts/1/body -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "script_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: script_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/scripts/body/{filename}": { "get": { "tags": [ "core-scripts" ], "summary": "Operator-facing script body download (JWT/RBAC).", "description": "Operator-facing script body download (JWT/RBAC).\n\n**Auth:** permission:endpoints.runscript\n\n**Params:** path: filename (path)\n\n**Example:**\n```\ncurl http://localhost:5001/api/scripts/body/example.png -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "filename", "in": "path", "required": true, "schema": { "type": "string", "description": "may contain slashes" } } ] } }, "/api/search": { "get": { "tags": [ "core-search" ], "summary": "Global search across multiple entity types.", "description": "Global search across multiple entity types.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/search -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/search/suggest": { "get": { "tags": [ "core-search" ], "summary": "A better spelling for a query that found nothing, or null.", "description": "A better spelling for a query that found nothing, or null.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/search/suggest -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/settings": { "get": { "tags": [ "core-settings" ], "summary": "List all settings, optionally filtered by category.", "description": "List all settings, optionally filtered by category.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/settings -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } }, "post": { "tags": [ "core-settings" ], "summary": "Create a new setting (admin only).", "description": "Create a new setting (admin only).\n\n**Auth:** permission:settings.edit\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/settings -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/settings/{key}": { "get": { "tags": [ "core-settings" ], "summary": "Get a single setting by key.", "description": "Get a single setting by key.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** path: key (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/settings/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "key", "in": "path", "required": true, "schema": { "type": "string" } } ] }, "put": { "tags": [ "core-settings" ], "summary": "Update a setting value.", "description": "Update a setting value.\n\n**Auth:** permission:settings.edit\n\n**Params:** path: key (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/settings/x -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "key", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: key (string); body: JSON (fields not yet documented)" } } } } } }, "/api/settings/asset-import/import": { "post": { "tags": [ "core-settings" ], "summary": "Validate uploaded CSVs and, when commit=true, load them.", "description": "Validate uploaded CSVs and, when commit=true, load them.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/settings/asset-import/import -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/settings/asset-import/script": { "get": { "tags": [ "core-settings" ], "summary": "Download Collect-ShopDB.ps1 with this site's CSV path embedded.", "description": "Download Collect-ShopDB.ps1 with this site's CSV path embedded.\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/settings/asset-import/script -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/settings/asset-import/templates": { "get": { "tags": [ "core-settings" ], "summary": "List the importable CSV tables in the order they must be uploaded.", "description": "List the importable CSV tables in the order they must be uploaded.\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/settings/asset-import/templates -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/settings/asset-import/templates/{tablename}": { "get": { "tags": [ "core-settings" ], "summary": "Download a generated CSV template for a single importable table.", "description": "Download a generated CSV template for a single importable table.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: tablename (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/settings/asset-import/templates/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "tablename", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/settings/asset-import/winc/batches": { "get": { "tags": [ "core-settings" ], "summary": "List applied/undone WINC import batches, newest first (for the undo UI).", "description": "List applied/undone WINC import batches, newest first (for the undo UI).\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/settings/asset-import/winc/batches -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/settings/asset-import/winc/commit": { "post": { "tags": [ "core-settings" ], "summary": "Apply a WINC plan reversibly. Requires acknowledgment for needs-create.", "description": "Apply a WINC plan reversibly. Requires acknowledgment for needs-create.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/settings/asset-import/winc/commit -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/settings/asset-import/winc/preview": { "post": { "tags": [ "core-settings" ], "summary": "Read-only WINC analysis: report what a commit would do. Writes nothing.", "description": "Read-only WINC analysis: report what a commit would do. Writes nothing.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/settings/asset-import/winc/preview -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/settings/asset-import/winc/undo": { "post": { "tags": [ "core-settings" ], "summary": "Reverse an applied WINC import batch by id. Conservative and reversible.", "description": "Reverse an applied WINC import batch by id. Conservative and reversible.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/settings/asset-import/winc/undo -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/settings/branding-logo": { "post": { "tags": [ "core-settings" ], "summary": "Upload a branding logo image and point the matching setting at it.", "description": "Upload a branding logo image and point the matching setting at it.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/settings/branding-logo -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/settings/branding/{filename}": { "get": { "tags": [ "core-settings" ], "summary": "Serve an uploaded branding logo (public - kiosks/print pages read it).", "description": "Serve an uploaded branding logo (public - kiosks/print pages read it).\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** path: filename (path)\n\n**Example:**\n```\ncurl http://localhost:5001/api/settings/branding/example.png\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "filename", "in": "path", "required": true, "schema": { "type": "string", "description": "may contain slashes" } } ] } }, "/api/settings/map-blueprint": { "post": { "tags": [ "core-settings" ], "summary": "Upload a floor-map blueprint image and point the setting at it.", "description": "Upload a floor-map blueprint image and point the setting at it.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/settings/map-blueprint -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/settings/map-blueprint/{filename}": { "get": { "tags": [ "core-settings" ], "summary": "Serve an uploaded blueprint image (public - kiosks read it).", "description": "Serve an uploaded blueprint image (public - kiosks read it).\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** path: filename (path)\n\n**Example:**\n```\ncurl http://localhost:5001/api/settings/map-blueprint/example.png\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "filename", "in": "path", "required": true, "schema": { "type": "string", "description": "may contain slashes" } } ] } }, "/api/settings/seed": { "post": { "tags": [ "core-settings" ], "summary": "Seed default settings if they don't exist.", "description": "Seed default settings if they don't exist.\n\n**Auth:** permission:settings.edit\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/settings/seed -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/settings/test-email": { "post": { "tags": [ "core-settings" ], "summary": "Send a test email to verify SMTP configuration.", "description": "Send a test email to verify SMTP configuration.\n\n**Auth:** permission:settings.edit\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/settings/test-email -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/setup/complete": { "post": { "tags": [ "core-setup" ], "summary": "Flag the first-run setup as finished.", "description": "Flag the first-run setup as finished.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/setup/complete -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/setup/create-admin": { "post": { "tags": [ "core-setup" ], "summary": "Create the first admin. Only works while there are zero users, setup has not been marked complete, and the caller...", "description": "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).\n\n**Auth:** none (first run only: refused once an admin exists)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/setup/create-admin -H 'Content-Type: application/json' -d '{}'\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/setup/needs-admin": { "get": { "tags": [ "core-setup" ], "summary": "True when no users exist yet - the app's very first run. Public so the login screen can offer to create the first admin.", "description": "True when no users exist yet - the app's very first run. Public so the login screen can offer to create the first admin.\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/setup/needs-admin\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/setup/seed-reference": { "post": { "tags": [ "core-setup" ], "summary": "Seed core reference data + permissions + default settings. Idempotent - reuses the same routines as the `flask seed...", "description": "Seed core reference data + permissions + default settings. Idempotent - reuses the same routines as the `flask seed ...` CLI commands.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/setup/seed-reference -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/setup/seed-starter": { "post": { "tags": [ "core-setup" ], "summary": "Add common vendors that are not already present. Idempotent.", "description": "Add common vendors that are not already present. Idempotent.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/setup/seed-starter -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/shopdbbackups": { "get": { "tags": [ "core-shopdbbackups" ], "summary": "List every retained backup set, newest first, with a compatibility flag.", "description": "List every retained backup set, newest first, with a compatibility flag.\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/shopdbbackups -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-shopdbbackups" ], "summary": "Kick off an on-demand backup run.", "description": "Kick off an on-demand backup run.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/shopdbbackups -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/shopdbbackups/{snapshotid}": { "get": { "tags": [ "core-shopdbbackups" ], "summary": "Return one set's full manifest plus a resolved compatibility verdict.", "description": "Return one set's full manifest plus a resolved compatibility verdict.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: snapshotid (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/shopdbbackups/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "snapshotid", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/shopdbbackups/{snapshotid}/restore": { "post": { "tags": [ "core-shopdbbackups" ], "summary": "Queue a restore of a set, gated on schema compatibility.", "description": "Queue a restore of a set, gated on schema compatibility.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: snapshotid (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/shopdbbackups/x/restore -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "snapshotid", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: snapshotid (string); body: JSON (fields not yet documented)" } } } } } }, "/api/shopdbbackups/finalize-restore": { "post": { "tags": [ "core-shopdbbackups" ], "summary": "Run the post-restore schema upgrade in the app context.", "description": "Run the post-restore schema upgrade in the app context.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/shopdbbackups/finalize-restore -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/shopdbbackups/history": { "get": { "tags": [ "core-shopdbbackups" ], "summary": "Return the recorded history of backup and restore runs, newest first.", "description": "Return the recorded history of backup and restore runs, newest first.\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/shopdbbackups/history -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/shopdbbackups/settings": { "get": { "tags": [ "core-shopdbbackups" ], "summary": "Return destination + retention config for the settings pane.", "description": "Return destination + retention config for the settings pane.\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/shopdbbackups/settings -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "put": { "tags": [ "core-shopdbbackups" ], "summary": "Persist the backup destination kind and its credential/config fields.", "description": "Persist the backup destination kind and its credential/config fields.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/shopdbbackups/settings -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/shopdbbackups/status": { "get": { "tags": [ "core-shopdbbackups" ], "summary": "Return the live status of the most recent backup and restore runs.", "description": "Return the live status of the most recent backup and restore runs.\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/shopdbbackups/status -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/supportteams": { "get": { "tags": [ "core-supportteams" ], "summary": "List support teams (with contacts). ?active and ?teamname filters.", "description": "List support teams (with contacts). ?active and ?teamname filters.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/supportteams -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-supportteams" ], "summary": "Create a new support team.", "description": "Create a new support team.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/supportteams -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/supportteams/{team_id}": { "delete": { "tags": [ "core-supportteams" ], "summary": "Delete a support team; 409 while any application references it.", "description": "Delete a support team; 409 while any application references it.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: team_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/supportteams/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "team_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-supportteams" ], "summary": "Get a single support team with its contacts.", "description": "Get a single support team with its contacts.\n\n**Auth:** permission:assets.view\n\n**Params:** path: team_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/supportteams/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "team_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-supportteams" ], "summary": "Update a support team.", "description": "Update a support team.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: team_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/supportteams/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "team_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: team_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/supportteams/{team_id}/contacts": { "post": { "tags": [ "core-supportteams" ], "summary": "Add a contact to a support team.", "description": "Add a contact to a support team.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: team_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/supportteams/1/contacts -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "team_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: team_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/supportteams/{team_id}/contacts/{contact_id}": { "delete": { "tags": [ "core-supportteams" ], "summary": "Delete a support-team contact.", "description": "Delete a support-team contact.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: team_id (int), contact_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/supportteams/1/contacts/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "team_id", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "contact_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-supportteams" ], "summary": "Update a support-team contact.", "description": "Update a support-team contact.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: team_id (int), contact_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/supportteams/1/contacts/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "team_id", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "contact_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: team_id (int), contact_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/users": { "get": { "tags": [ "core-users" ], "summary": "List all users.", "description": "List all users.\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/users -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-users" ], "summary": "Create a new user.", "description": "Create a new user.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/users -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/users/{userid}": { "delete": { "tags": [ "core-users" ], "summary": "Delete a user.", "description": "Delete a user.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: userid (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/users/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "userid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-users" ], "summary": "Get a single user.", "description": "Get a single user.\n\n**Auth:** jwt\n\n**Params:** path: userid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/users/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "userid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-users" ], "summary": "Update a user.", "description": "Update a user.\n\n**Auth:** jwt\n\n**Params:** path: userid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/users/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "userid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: userid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/users/permissions": { "get": { "tags": [ "core-users" ], "summary": "List assignable permissions grouped by category.", "description": "List assignable permissions grouped by category.\n\n**Auth:** jwt\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/users/permissions -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/users/roles": { "get": { "tags": [ "core-users" ], "summary": "List all roles with their permissions.", "description": "List all roles with their permissions.\n\n**Auth:** jwt\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/users/roles -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-users" ], "summary": "Create a new role.", "description": "Create a new role.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/users/roles -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/users/roles/{roleid}": { "delete": { "tags": [ "core-users" ], "summary": "Delete a role.", "description": "Delete a role.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: roleid (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/users/roles/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "roleid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-users" ], "summary": "Update a role.", "description": "Update a role.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: roleid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/users/roles/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "roleid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: roleid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/vendors": { "get": { "tags": [ "core-vendors" ], "summary": "List all vendors.", "description": "List all vendors.\n\n**Auth:** permission:assets.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/vendors -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "core-vendors" ], "summary": "Create a new vendor.", "description": "Create a new vendor.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/vendors -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/vendors/{vendor_id}": { "delete": { "tags": [ "core-vendors" ], "summary": "Delete (deactivate) a vendor.", "description": "Delete (deactivate) a vendor.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: vendor_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/vendors/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "vendor_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "core-vendors" ], "summary": "Get a single vendor.", "description": "Get a single vendor.\n\n**Auth:** permission:assets.view\n\n**Params:** path: vendor_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/vendors/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "vendor_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "core-vendors" ], "summary": "Update a vendor.", "description": "Update a vendor.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: vendor_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/vendors/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "vendor_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: vendor_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/backups/asset/{assetid}": { "get": { "tags": [ "plugin-backups" ], "summary": "Revision history for one asset, newest first.", "description": "Revision history for one asset, newest first.\n\n**Auth:** permission:backups.view\n\n**Params:** path: assetid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/backups/asset/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "assetid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/backups/asset/{assetid}/info": { "get": { "tags": [ "plugin-backups" ], "summary": "A kind's 'at a glance' card, built from its LATEST revision.", "description": "A kind's 'at a glance' card, built from its LATEST revision.\n\n**Auth:** permission:backups.view\n\n**Params:** path: assetid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/backups/asset/1/info -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "assetid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/backups/dashboard/stale": { "get": { "tags": [ "plugin-backups" ], "summary": "Chains whose backup has stopped running.", "description": "Chains whose backup has stopped running.\n\n**Auth:** permission:backups.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/backups/dashboard/stale -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/backups/kinds": { "get": { "tags": [ "plugin-backups" ], "summary": "Registered backup kinds, for UI that needs to enumerate them.", "description": "Registered backup kinds, for UI that needs to enumerate them.\n\n**Auth:** permission:backups.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/backups/kinds -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/backups/revisions/{backuprevisionid}": { "get": { "tags": [ "plugin-backups" ], "summary": "One revision, including its parsed payload where there is one.", "description": "One revision, including its parsed payload where there is one.\n\n**Auth:** permission:backups.view\n\n**Params:** path: backuprevisionid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/backups/revisions/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "backuprevisionid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/backups/revisions/{backuprevisionid}/diff": { "get": { "tags": [ "plugin-backups" ], "summary": "Diff two revisions of the same asset+kind.", "description": "Diff two revisions of the same asset+kind.\n\n**Auth:** permission:backups.view\n\n**Params:** path: backuprevisionid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/backups/revisions/1/diff -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "backuprevisionid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/backups/revisions/{backuprevisionid}/download": { "get": { "tags": [ "plugin-backups" ], "summary": "Render a revision back to its native file format.", "description": "Render a revision back to its native file format.\n\n**Auth:** permission:backups.download\n\n**Params:** path: backuprevisionid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/backups/revisions/1/download -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "backuprevisionid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/computers": { "get": { "tags": [ "plugin-computers" ], "summary": "List all computers with filtering and pagination.", "description": "List all computers with filtering and pagination.\n\n**Auth:** permission:computers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-computers" ], "summary": "Create new computer (creates both Asset and Computer records).", "description": "Create new computer (creates both Asset and Computer records).\n\n**Auth:** permission:computers.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/computers -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/computers/{computer_id}": { "delete": { "tags": [ "plugin-computers" ], "summary": "Delete (soft delete) computer.", "description": "Delete (soft delete) computer.\n\n**Auth:** permission:computers.delete\n\n**Params:** path: computer_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/computers/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "computer_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-computers" ], "summary": "Get a single computer with full details.", "description": "Get a single computer with full details.\n\n**Auth:** permission:computers.view\n\n**Params:** path: computer_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "computer_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-computers" ], "summary": "Update computer (both Asset and Computer records).", "description": "Update computer (both Asset and Computer records).\n\n**Auth:** permission:computers.edit\n\n**Params:** path: computer_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/computers/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "computer_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: computer_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/computers/{computer_id}/apps": { "get": { "tags": [ "plugin-computers" ], "summary": "Get all installed applications for a computer.", "description": "Get all installed applications for a computer.\n\n**Auth:** permission:computers.view\n\n**Params:** path: computer_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/1/apps -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "computer_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "plugin-computers" ], "summary": "Add an installed application to a computer.", "description": "Add an installed application to a computer.\n\n**Auth:** permission:computers.create\n\n**Params:** path: computer_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/computers/1/apps -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "computer_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: computer_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/computers/{computer_id}/apps/{app_id}": { "delete": { "tags": [ "plugin-computers" ], "summary": "Remove an installed application from a computer.", "description": "Remove an installed application from a computer.\n\n**Auth:** permission:computers.delete\n\n**Params:** path: computer_id (int), app_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/computers/1/apps/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "computer_id", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/computers/{computer_id}/report": { "post": { "tags": [ "plugin-computers" ], "summary": "Report computer status (for agent-based reporting).", "description": "Report computer status (for agent-based reporting).\n\n**Auth:** permission:computers.create\n\n**Params:** path: computer_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/computers/1/report -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "computer_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: computer_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/computers/asset/{asset_id}/policypanel": { "get": { "tags": [ "plugin-computers" ], "summary": "Keyvalue panel: which policy governs this endpoint, and what it allows.", "description": "Keyvalue panel: which policy governs this endpoint, and what it allows.\n\n**Auth:** permission:computers.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/asset/1/policypanel -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/computers/by-asset/{asset_id}": { "get": { "tags": [ "plugin-computers" ], "summary": "Get computer data by asset ID.", "description": "Get computer data by asset ID.\n\n**Auth:** permission:computers.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/by-asset/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/computers/by-hostname/{hostname}": { "get": { "tags": [ "plugin-computers" ], "summary": "Get computer by hostname.", "description": "Get computer by hostname.\n\n**Auth:** permission:computers.view\n\n**Params:** path: hostname (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/by-hostname/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "hostname", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/computers/client-script": { "get": { "tags": [ "plugin-computers" ], "summary": "The collector reporter, stamped with THIS site's values.", "description": "The collector reporter, stamped with THIS site's values.\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/client-script -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/computers/dashboard/quiet": { "get": { "tags": [ "plugin-computers" ], "summary": "PCs that WERE reporting, have stopped, and are still meant to be in use.", "description": "PCs that WERE reporting, have stopped, and are still meant to be in use.\n\n**Auth:** permission:computers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/dashboard/quiet -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/computers/dashboard/sharedmachines": { "get": { "tags": [ "plugin-computers" ], "summary": "Machine numbers claimed by more than one PC, with nothing filed under them.", "description": "Machine numbers claimed by more than one PC, with nothing filed under them.\n\n**Auth:** permission:computers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/dashboard/sharedmachines -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/computers/dashboard/summary": { "get": { "tags": [ "plugin-computers" ], "summary": "Get computer dashboard summary data.", "description": "Get computer dashboard summary data.\n\n**Auth:** permission:computers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/dashboard/summary -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/computers/display-kiosks": { "get": { "tags": [ "plugin-computers" ], "summary": "Reporting display kiosks, for the Dashboard Defaults picker.", "description": "Reporting display kiosks, for the Dashboard Defaults picker.\n\n**Auth:** permission:computers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/display-kiosks -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/computers/policies/actions": { "get": { "tags": [ "plugin-computers" ], "summary": "The allowlisted action names + labels a policy may reference.", "description": "The allowlisted action names + labels a policy may reference.\n\n**Auth:** permission:computers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/policies/actions -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/computers/policies/business": { "get": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.list_business_policies has no docstring.", "description": "UNDOCUMENTED: computers.list_business_policies has no docstring.\n\n**Auth:** permission:computers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/policies/business -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.create_business_policy has no docstring.", "description": "UNDOCUMENTED: computers.create_business_policy has no docstring.\n\n**Auth:** permission:computers.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/computers/policies/business -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/computers/policies/business/{policy_id}": { "delete": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.delete_business_policy has no docstring.", "description": "UNDOCUMENTED: computers.delete_business_policy has no docstring.\n\n**Auth:** permission:computers.delete\n\n**Params:** path: policy_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/computers/policies/business/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "policy_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.get_business_policy has no docstring.", "description": "UNDOCUMENTED: computers.get_business_policy has no docstring.\n\n**Auth:** permission:computers.view\n\n**Params:** path: policy_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/policies/business/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "policy_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.update_business_policy has no docstring.", "description": "UNDOCUMENTED: computers.update_business_policy has no docstring.\n\n**Auth:** permission:computers.edit\n\n**Params:** path: policy_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/computers/policies/business/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "policy_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: policy_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/computers/policies/configuration": { "get": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.list_configuration_policies has no docstring.", "description": "UNDOCUMENTED: computers.list_configuration_policies has no docstring.\n\n**Auth:** permission:computers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/policies/configuration -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.create_configuration_policy has no docstring.", "description": "UNDOCUMENTED: computers.create_configuration_policy has no docstring.\n\n**Auth:** permission:computers.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/computers/policies/configuration -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/computers/policies/configuration/{policy_id}": { "delete": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.delete_configuration_policy has no docstring.", "description": "UNDOCUMENTED: computers.delete_configuration_policy has no docstring.\n\n**Auth:** permission:computers.delete\n\n**Params:** path: policy_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/computers/policies/configuration/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "policy_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.get_configuration_policy has no docstring.", "description": "UNDOCUMENTED: computers.get_configuration_policy has no docstring.\n\n**Auth:** permission:computers.view\n\n**Params:** path: policy_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/policies/configuration/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "policy_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.update_configuration_policy has no docstring.", "description": "UNDOCUMENTED: computers.update_configuration_policy has no docstring.\n\n**Auth:** permission:computers.edit\n\n**Params:** path: policy_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/computers/policies/configuration/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "policy_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: policy_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/computers/policies/effective/{asset_id}": { "get": { "tags": [ "plugin-computers" ], "summary": "Preview the resolved effective policy for one endpoint (debug/UI).", "description": "Preview the resolved effective policy for one endpoint (debug/UI).\n\n**Auth:** permission:computers.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/policies/effective/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/computers/protocols": { "get": { "tags": [ "plugin-computers" ], "summary": "List access protocols. ?active=false includes disabled ones.", "description": "List access protocols. ?active=false includes disabled ones.\n\n**Auth:** permission:computers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/protocols -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.create_protocol has no docstring.", "description": "UNDOCUMENTED: computers.create_protocol has no docstring.\n\n**Auth:** permission:computers.edit\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/computers/protocols -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/computers/protocols/{protocol_id}": { "delete": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.delete_protocol has no docstring.", "description": "UNDOCUMENTED: computers.delete_protocol has no docstring.\n\n**Auth:** permission:computers.edit\n\n**Params:** path: protocol_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/computers/protocols/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "protocol_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "patch": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.update_protocol has no docstring.", "description": "UNDOCUMENTED: computers.update_protocol has no docstring.\n\n**Auth:** permission:computers.edit\n\n**Params:** path: protocol_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PATCH http://localhost:5001/api/computers/protocols/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "protocol_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: protocol_id (int); body: JSON (fields not yet documented)" } } } } }, "put": { "tags": [ "plugin-computers" ], "summary": "UNDOCUMENTED: computers.update_protocol has no docstring.", "description": "UNDOCUMENTED: computers.update_protocol has no docstring.\n\n**Auth:** permission:computers.edit\n\n**Params:** path: protocol_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PATCH http://localhost:5001/api/computers/protocols/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "protocol_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: protocol_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/computers/types": { "get": { "tags": [ "plugin-computers" ], "summary": "List all computer types.", "description": "List all computer types.\n\n**Auth:** permission:computers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/types -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-computers" ], "summary": "Create a new computer type.", "description": "Create a new computer type.\n\n**Auth:** permission:computers.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/computers/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/computers/types/{type_id}": { "delete": { "tags": [ "plugin-computers" ], "summary": "Delete a computer type. Refused if any PC still uses it.", "description": "Delete a computer type. Refused if any PC still uses it.\n\n**Auth:** permission:computers.delete\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/computers/types/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-computers" ], "summary": "Get a single computer type.", "description": "Get a single computer type.\n\n**Auth:** permission:computers.view\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/computers/types/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-computers" ], "summary": "Update a computer type.", "description": "Update a computer type.\n\n**Auth:** permission:computers.edit\n\n**Params:** path: type_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/computers/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: type_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/employees/{sso}/photo": { "delete": { "tags": [ "plugin-employees" ], "summary": "Clear an employee photo and delete the uploaded file. External mode 409s.", "description": "Clear an employee photo and delete the uploaded file. External mode 409s.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: sso (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/employees/1/photo -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "sso", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "plugin-employees" ], "summary": "Upload (or replace) the photo for a self-hosted directory employee.", "description": "Upload (or replace) the photo for a self-hosted directory employee.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: sso (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/employees/1/photo -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "sso", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: sso (int); body: JSON (fields not yet documented)" } } } } } }, "/api/employees/directory": { "get": { "tags": [ "plugin-employees" ], "summary": "Full self-hosted directory (for the management page).", "description": "Full self-hosted directory (for the management page).\n\n**Auth:** permission:employees.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/employees/directory -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-employees" ], "summary": "UNDOCUMENTED: employees.create_directory_employee has no docstring.", "description": "UNDOCUMENTED: employees.create_directory_employee has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/employees/directory -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/employees/directory/{sso}": { "delete": { "tags": [ "plugin-employees" ], "summary": "UNDOCUMENTED: employees.delete_directory_employee has no docstring.", "description": "UNDOCUMENTED: employees.delete_directory_employee has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: sso (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/employees/directory/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "sso", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-employees" ], "summary": "UNDOCUMENTED: employees.update_directory_employee has no docstring.", "description": "UNDOCUMENTED: employees.update_directory_employee has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: sso (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/employees/directory/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "sso", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: sso (int); body: JSON (fields not yet documented)" } } } } } }, "/api/employees/directory/import": { "post": { "tags": [ "plugin-employees" ], "summary": "Bulk upsert from CSV. Accepts headers SSO,First_Name,Last_Name,Team,Role, Picture (case-insensitive; sso/firstname...", "description": "Bulk upsert from CSV. Accepts headers SSO,First_Name,Last_Name,Team,Role, Picture (case-insensitive; sso/firstname/... also accepted).\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/employees/directory/import -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/employees/lookup": { "get": { "tags": [ "plugin-employees" ], "summary": "Look up multiple employees by SSO list.", "description": "Look up multiple employees by SSO list.\n\n**Auth:** permission:employees.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/employees/lookup -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/employees/lookup/{sso}": { "get": { "tags": [ "plugin-employees" ], "summary": "Look up a single employee by SSO.", "description": "Look up a single employee by SSO.\n\n**Auth:** permission:employees.view\n\n**Params:** path: sso (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/employees/lookup/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "sso", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/employees/photo/{filename}": { "get": { "tags": [ "plugin-employees" ], "summary": "Serve an uploaded employee photo (public - kiosk cards read it).", "description": "Serve an uploaded employee photo (public - kiosk cards read it).\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** path: filename (path)\n\n**Example:**\n```\ncurl http://localhost:5001/api/employees/photo/example.png\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "filename", "in": "path", "required": true, "schema": { "type": "string", "description": "may contain slashes" } } ] } }, "/api/employees/resolve/{sso}": { "get": { "tags": [ "plugin-employees" ], "summary": "Resolve one SSO to a name and photo, and say HOW.", "description": "Resolve one SSO to a name and photo, and say HOW.\n\n**Auth:** permission:employees.view\n\n**Params:** path: sso (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/employees/resolve/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "sso", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/employees/search": { "get": { "tags": [ "plugin-employees" ], "summary": "Search employees by name.", "description": "Search employees by name.\n\n**Auth:** permission:employees.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/employees/search -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints": { "get": { "tags": [ "plugin-endpoints" ], "summary": "List reported endpoint states.", "description": "List reported endpoint states.\n\n**Auth:** permission:endpoints.fleet\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/ -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/{asset_id}": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Get the current state for one endpoint by asset id.", "description": "Get the current state for one endpoint by asset id.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/{asset_id}/agentupgrade": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Push the published agent build to one endpoint.", "description": "Push the published agent build to one endpoint.\n\n**Auth:** permission:endpoints.agentupdate\n\n**Params:** path: asset_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/1/agentupgrade -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: asset_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/{asset_id}/commands": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Recent commands for one endpoint, newest first (operator view).", "description": "Recent commands for one endpoint, newest first (operator view).\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/1/commands -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "plugin-endpoints" ], "summary": "Queue an allowlisted command for one endpoint.", "description": "Queue an allowlisted command for one endpoint.\n\n**Auth:** permission:endpoints.command\n\n**Params:** path: asset_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/1/commands -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: asset_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/{asset_id}/events": { "get": { "tags": [ "plugin-endpoints" ], "summary": "List curated Windows events for one endpoint, newest first.", "description": "List curated Windows events for one endpoint, newest first.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/1/events -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/{asset_id}/holdableactions": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Desired-mode actions on this endpoint, with current hold state.", "description": "Desired-mode actions on this endpoint, with current hold state.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/1/holdableactions -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/{asset_id}/lock": { "delete": { "tags": [ "plugin-endpoints" ], "summary": "Lift the quarantine on this endpoint.", "description": "Lift the quarantine on this endpoint.\n\n**Auth:** permission:endpoints.command\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/endpoints/1/lock -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-endpoints" ], "summary": "The endpoint lock standing on this endpoint, or null.", "description": "The endpoint lock standing on this endpoint, or null.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/1/lock -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "plugin-endpoints" ], "summary": "Quarantine this endpoint against non-admin commands.", "description": "Quarantine this endpoint against non-admin commands.\n\n**Auth:** permission:endpoints.command\n\n**Params:** path: asset_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/1/lock -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: asset_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/{asset_id}/logcollections": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Collected-log history for one endpoint, newest first.", "description": "Collected-log history for one endpoint, newest first.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/1/logcollections -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/{asset_id}/policyholds": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Active break-glass holds for one endpoint.", "description": "Active break-glass holds for one endpoint.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/1/policyholds -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "plugin-endpoints" ], "summary": "Deliberately suspend desired-state reconciliation for one or more actions.", "description": "Deliberately suspend desired-state reconciliation for one or more actions.\n\n**Auth:** permission:endpoints.command\n\n**Params:** path: asset_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/1/policyholds -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: asset_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/{asset_id}/policyholds/{action}": { "delete": { "tags": [ "plugin-endpoints" ], "summary": "End a hold early, resuming reconciliation of one action.", "description": "End a hold early, resuming reconciliation of one action.\n\n**Auth:** permission:endpoints.command\n\n**Params:** path: asset_id (int), action (string)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/endpoints/1/policyholds/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "action", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/endpoints/{asset_id}/scriptruns": { "get": { "tags": [ "plugin-endpoints" ], "summary": "The last few run_script commands for one endpoint, newest first.", "description": "The last few run_script commands for one endpoint, newest first.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/1/scriptruns -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/adoptiontool/package": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Bundle the adoption tool as a downloadable ZIP.", "description": "Bundle the adoption tool as a downloadable ZIP.\n\n**Auth:** permission:endpoints.agentpackage\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/adoptiontool/package -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/agentkey": { "delete": { "tags": [ "plugin-endpoints" ], "summary": "Revoke the endpoint agent key: stop all managed-token endpoint traffic.", "description": "Revoke the endpoint agent key: stop all managed-token endpoint traffic.\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/endpoints/agentkey -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "get": { "tags": [ "plugin-endpoints" ], "summary": "Report the endpoint agent key state (no secret).", "description": "Report the endpoint agent key state (no secret).\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/agentkey -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/agentkey/regenerate": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Mint a fresh endpoint agent key, revoking any previous one.", "description": "Mint a fresh endpoint agent key, revoking any previous one.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/agentkey/regenerate -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/alerts": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Fleet alerts for one endpoint by hostname (collector-token auth).", "description": "Fleet alerts for one endpoint by hostname (collector-token auth).\n\n**Auth:** api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/alerts -H \"X-API-Key: $KEY\"\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/alerts/{notification_id}/acknowledge": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Agent acknowledges a fleet alert (collector-token auth).", "description": "Agent acknowledges a fleet alert (collector-token auth).\n\n**Auth:** api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)\n\n**Params:** path: notification_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/alerts/1/acknowledge -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "notification_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: notification_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/apppackage/{appversionid}": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Agent-facing installer download (collector-token auth).", "description": "Agent-facing installer download (collector-token auth).\n\n**Auth:** api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)\n\n**Params:** path: appversionid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/apppackage/1 -H \"X-API-Key: $KEY\"\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "appversionid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/apppackage/app/{app_id}": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Agent-facing installer download by APP (collector-token auth).", "description": "Agent-facing installer download by APP (collector-token auth).\n\n**Auth:** api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)\n\n**Params:** path: app_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/apppackage/app/1 -H \"X-API-Key: $KEY\"\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/apppackage/app/{app_id}/{filename}": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Agent-facing installer download by APP (collector-token auth).", "description": "Agent-facing installer download by APP (collector-token auth).\n\n**Auth:** api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)\n\n**Params:** path: app_id (int), filename (path)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/apppackage/app/1/example.png -H \"X-API-Key: $KEY\"\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "app_id", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "filename", "in": "path", "required": true, "schema": { "type": "string", "description": "may contain slashes" } } ] } }, "/api/endpoints/asset/{asset_id}/activity": { "get": { "tags": [ "plugin-endpoints" ], "summary": "List panel: one chronological feed of what happened to this endpoint.", "description": "List panel: one chronological feed of what happened to this endpoint.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/activity -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/applications": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Table panel: the installed-software (SBOM) snapshot for this endpoint.", "description": "Table panel: the installed-software (SBOM) snapshot for this endpoint.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/applications -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/diskhealth": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Physical drive health rows.", "description": "Physical drive health rows.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/diskhealth -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/hardware": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Keyvalue panel: processor, memory and system chassis inventory.", "description": "Keyvalue panel: processor, memory and system chassis inventory.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/hardware -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/interfaces": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Table panel: every hardware NIC the agent last reported.", "description": "Table panel: every hardware NIC the agent last reported.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/interfaces -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/iphistory": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Table panel: every address this asset has held, newest change first.", "description": "Table panel: every address this asset has held, newest change first.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/iphistory -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/listeners": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Table panel: TCP sockets in LISTEN, with the owning process.", "description": "Table panel: TCP sockets in LISTEN, with the owning process.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/listeners -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/mappeddrives": { "get": { "tags": [ "plugin-endpoints" ], "summary": "List panel: mapped network drives with a health badge each.", "description": "List panel: mapped network drives with a health badge each.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/mappeddrives -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/osinfo": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Keyvalue panel: operating system, firmware and domain membership.", "description": "Keyvalue panel: operating system, firmware and domain membership.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/osinfo -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/recentevents": { "get": { "tags": [ "plugin-endpoints" ], "summary": "List panel: the endpoint's most recent curated events, newest first.", "description": "List panel: the endpoint's most recent curated events, newest first.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/recentevents -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/services": { "get": { "tags": [ "plugin-endpoints" ], "summary": "List panel: monitored services/processes with a run-state badge per row.", "description": "List panel: monitored services/processes with a run-state badge per row.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/services -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/status": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Keyvalue panel: the endpoint's current status snapshot.", "description": "Keyvalue panel: the endpoint's current status snapshot.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/status -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/storage": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Tabs panel: volume capacity and physical drive health as two sections.", "description": "Tabs panel: volume capacity and physical drive health as two sections.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/storage -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/telemetrymeta": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Lightweight freshness probe for the panels.", "description": "Lightweight freshness probe for the panels.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/telemetrymeta -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/asset/{asset_id}/usercontext": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Keyvalue panel: session-scoped data from the interactive user probe.", "description": "Keyvalue panel: session-scoped data from the interactive user probe.\n\n**Auth:** permission:endpoints.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/asset/1/usercontext -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/collect": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Agent telemetry ingest. Same handler as POST /api/collector/endpoints.", "description": "Agent telemetry ingest. Same handler as POST /api/collector/endpoints.\n\n**Auth:** api-key (endpoints collector token)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/collect -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/commands/{command_id}/result": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Agent reports a claimed command's outcome (collector-token auth).", "description": "Agent reports a claimed command's outcome (collector-token auth).\n\n**Auth:** api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)\n\n**Params:** path: command_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/commands/1/result -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "command_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: command_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/commands/next": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Agent long-poll: claim the next pending command for a hostname.", "description": "Agent long-poll: claim the next pending command for a hostname.\n\n**Auth:** api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/commands/next -H \"X-API-Key: $KEY\"\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/dashboard/enrollmentpending": { "get": { "tags": [ "plugin-endpoints" ], "summary": "One queue row while enroll requests wait for an admin, else nothing.", "description": "One queue row while enroll requests wait for an admin, else nothing.\n\n**Auth:** permission:endpoints.fleet\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/dashboard/enrollmentpending -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/dashboard/quiet": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Endpoints that reported before, then went quiet past the window.", "description": "Endpoints that reported before, then went quiet past the window.\n\n**Auth:** permission:endpoints.fleet\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/dashboard/quiet -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/dashboard/reenrollblocked": { "get": { "tags": [ "plugin-endpoints" ], "summary": "PCs kept from re-enrolling for more than 7 days.", "description": "PCs kept from re-enrolling for more than 7 days.\n\n**Auth:** permission:endpoints.fleet\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/dashboard/reenrollblocked -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/dashboard/stability": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Endpoints with recent crash/shutdown/corruption events.", "description": "Endpoints with recent crash/shutdown/corruption events.\n\n**Auth:** permission:endpoints.fleet\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/dashboard/stability -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/dashboard/summary": { "get": { "tags": [ "plugin-endpoints" ], "summary": "High-level fleet counts for the endpoints dashboard.", "description": "High-level fleet counts for the endpoints dashboard.\n\n**Auth:** permission:endpoints.fleet\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/dashboard/summary -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/enroll": { "post": { "tags": [ "plugin-endpoints" ], "summary": "A PC asks for its own credential.", "description": "A PC asks for its own credential.\n\n**Auth:** none (per-IP rate limited and capped; a valid fleet key only decides auto-enroll)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/enroll -H 'Content-Type: application/json' -d '{}'\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/enrollment": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Credential state of every computer, plus pending and recent requests.", "description": "Credential state of every computer, plus pending and recent requests.\n\n**Auth:** permission:endpoints.fleet\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/enrollment -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/enrollment/assets/{assetid}/allow-reenroll": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Lift a re-enrollment block. The PC enrolls on its next attempt.", "description": "Lift a re-enrollment block. The PC enrolls on its next attempt.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: assetid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/enrollment/assets/1/allow-reenroll -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "assetid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: assetid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/enrollment/assets/{assetid}/revoke": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Un-enroll a PC. Its agent gets CREDENTIAL_INVALID and enrolls again.", "description": "Un-enroll a PC. Its agent gets CREDENTIAL_INVALID and enrolls again.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: assetid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/enrollment/assets/1/revoke -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "assetid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: assetid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/enrollment/migration": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Per-computer readiness to move onto per-PC credentials, plus waves.", "description": "Per-computer readiness to move onto per-PC credentials, plus waves.\n\n**Auth:** permission:endpoints.fleet\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/enrollment/migration -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/enrollment/migration/wave": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Push the agent upgrade to a batch of READY PCs.", "description": "Push the agent upgrade to a batch of READY PCs.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/enrollment/migration/wave -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/enrollment/requests/{requestid}/approve": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Bind a pending request to the asset the admin picked.", "description": "Bind a pending request to the asset the admin picked.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: requestid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/enrollment/requests/1/approve -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "requestid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: requestid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/enrollment/requests/{requestid}/reject": { "post": { "tags": [ "plugin-endpoints" ], "summary": "UNDOCUMENTED: endpoints.reject_enroll_request has no docstring.", "description": "UNDOCUMENTED: endpoints.reject_enroll_request has no docstring.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: requestid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/enrollment/requests/1/reject -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "requestid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: requestid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/enrollment/settings": { "put": { "tags": [ "plugin-endpoints" ], "summary": "Change the enrollment settings.", "description": "Change the enrollment settings.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/endpoints/enrollment/settings -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/logcollections/{collection_id}": { "get": { "tags": [ "plugin-endpoints" ], "summary": "One collected log including its content, for the scrollable pane.", "description": "One collected log including its content, for the scrollable pane.\n\n**Auth:** permission:endpoints.updateapp\n\n**Params:** path: collection_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/logcollections/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "collection_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/logcollections/{collection_id}/download": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Serve a collected log as a file attachment.", "description": "Serve a collected log as a file attachment.\n\n**Auth:** permission:endpoints.updateapp\n\n**Params:** path: collection_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/logcollections/1/download -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "collection_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/monitors": { "get": { "tags": [ "plugin-endpoints" ], "summary": "List monitor definitions (shipped and local).", "description": "List monitor definitions (shipped and local).\n\n**Auth:** permission:endpoints.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/monitors -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-endpoints" ], "summary": "Create a user-defined (local) monitor definition.", "description": "Create a user-defined (local) monitor definition.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/monitors -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/monitors/{monitor_id}": { "delete": { "tags": [ "plugin-endpoints" ], "summary": "Delete a local monitor definition. Shipped rows are protected.", "description": "Delete a local monitor definition. Shipped rows are protected.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: monitor_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/endpoints/monitors/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "monitor_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-endpoints" ], "summary": "Update a local monitor definition. Shipped rows are read-only.", "description": "Update a local monitor definition. Shipped rows are read-only.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: monitor_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/endpoints/monitors/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "monitor_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: monitor_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/monitors/resolve": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Resolve the monitor set for a PC type (agent runtime fetch).", "description": "Resolve the monitor set for a PC type (agent runtime fetch).\n\n**Auth:** permission:endpoints.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/monitors/resolve -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/monitors/resolved": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Agent watch list: the monitors this endpoint should report on.", "description": "Agent watch list: the monitors this endpoint should report on.\n\n**Auth:** api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/monitors/resolved -H \"X-API-Key: $KEY\"\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/operatorreports": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Agent uploads one operator issue report (collector-token auth).", "description": "Agent uploads one operator issue report (collector-token auth).\n\n**Auth:** api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/operatorreports -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/operatorreports/{operatorreportid}/image": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Serve one operator report's screenshot.", "description": "Serve one operator report's screenshot.\n\n**Auth:** permission:endpoints.operatorreports\n\n**Params:** path: operatorreportid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/operatorreports/1/image -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "operatorreportid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/panel/{asset_id}/operatorreports": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Operator Reports panel: this PC's recent operator issue reports.", "description": "Operator Reports panel: this PC's recent operator issue reports.\n\n**Auth:** permission:endpoints.operatorreports\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/panel/1/operatorreports -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/scriptbody/{script_id}": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Agent-facing script body download (collector-token auth).", "description": "Agent-facing script body download (collector-token auth).\n\n**Auth:** api-key (endpoint agent credential, or the fleet key while sharedkeyallowed is on)\n\n**Params:** path: script_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/scriptbody/1 -H \"X-API-Key: $KEY\"\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "script_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/endpoints/settings/server-cert": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Get details about the current server certificate.", "description": "Get details about the current server certificate.\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/settings/server-cert -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/settings/server-cert/download": { "get": { "tags": [ "plugin-endpoints" ], "summary": "The PUBLIC server certificate as a DER .cer file, never the key.", "description": "The PUBLIC server certificate as a DER .cer file, never the key.\n\n**Auth:** permission:endpoints.fleet\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/settings/server-cert/download -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/settings/server-cert/generate": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Generate a new self-signed server certificate.", "description": "Generate a new self-signed server certificate.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/settings/server-cert/generate -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/settings/server-cert/live": { "get": { "tags": [ "plugin-endpoints" ], "summary": "The certificate PCs actually receive from this site's public address.", "description": "The certificate PCs actually receive from this site's public address.\n\n**Auth:** permission:endpoints.fleet\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/settings/server-cert/live -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/settings/server-cert/upload": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Upload a new server certificate and private key.", "description": "Upload a new server certificate and private key.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/settings/server-cert/upload -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/siteagent": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Report whether the site agent build has a prebuilt binary staged.", "description": "Report whether the site agent build has a prebuilt binary staged.\n\n**Auth:** permission:endpoints.agentpackage\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/siteagent -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/siteagent/binaries/{binkey}": { "get": { "tags": [ "plugin-endpoints" ], "summary": "List staged versions for a binary (agent or tray), newest first.", "description": "List staged versions for a binary (agent or tray), newest first.\n\n**Auth:** permission:endpoints.agentpackage\n\n**Params:** path: binkey (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/siteagent/binaries/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "binkey", "in": "path", "required": true, "schema": { "type": "string" } } ] }, "post": { "tags": [ "plugin-endpoints" ], "summary": "Stage an uploaded binary as a new version.", "description": "Stage an uploaded binary as a new version.\n\n**Auth:** permission:endpoints.agentpackage\n\n**Params:** path: binkey (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/siteagent/binaries/x -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "binkey", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: binkey (string); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/siteagent/binaries/{binkey}/adopt": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Adopt the unmanaged legacy flat file into the version store.", "description": "Adopt the unmanaged legacy flat file into the version store.\n\n**Auth:** permission:endpoints.agentpackage\n\n**Params:** path: binkey (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/siteagent/binaries/x/adopt -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "binkey", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: binkey (string); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/siteagent/binaries/{binkey}/current": { "put": { "tags": [ "plugin-endpoints" ], "summary": "Point 'current' at an already-staged version (roll back or forward).", "description": "Point 'current' at an already-staged version (roll back or forward).\n\n**Auth:** permission:endpoints.agentpackage\n\n**Params:** path: binkey (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/endpoints/siteagent/binaries/x/current -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "binkey", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: binkey (string); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/siteagent/binaries/{binkey}/detect": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Read the PE file version of an uploaded EXE without staging it.", "description": "Read the PE file version of an uploaded EXE without staging it.\n\n**Auth:** permission:endpoints.agentpackage\n\n**Params:** path: binkey (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/siteagent/binaries/x/detect -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "binkey", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: binkey (string); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/siteagent/bootstrap.ps1": { "get": { "tags": [ "plugin-endpoints" ], "summary": "The PowerShell the one-line command downloads, runs and deletes.", "description": "The PowerShell the one-line command downloads, runs and deletes.\n\n**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)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/siteagent/bootstrap.ps1\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/siteagent/bootstrap/package": { "get": { "tags": [ "plugin-endpoints" ], "summary": "The keyless agent package the bootstrap script installs.", "description": "The keyless agent package the bootstrap script installs.\n\n**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)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/siteagent/bootstrap/package\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/endpoints/siteagent/bootstrap/tokens": { "get": { "tags": [ "plugin-endpoints" ], "summary": "Every bootstrap token, newest first. Never a secret.", "description": "Every bootstrap token, newest first. Never a secret.\n\n**Auth:** jwt + role:admin\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/endpoints/siteagent/bootstrap/tokens -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-endpoints" ], "summary": "Mint one short-lived bootstrap token. The secret is returned ONCE.", "description": "Mint one short-lived bootstrap token. The secret is returned ONCE.\n\n**Auth:** jwt + role:admin\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/siteagent/bootstrap/tokens -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/siteagent/bootstrap/tokens/{tokenid}/revoke": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Kill a bootstrap token now. Already-revoked is a no-op, not an error.", "description": "Kill a bootstrap token now. Already-revoked is a no-op, not an error.\n\n**Auth:** jwt + role:admin\n\n**Params:** path: tokenid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/siteagent/bootstrap/tokens/1/revoke -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "tokenid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: tokenid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/endpoints/siteagent/package": { "post": { "tags": [ "plugin-endpoints" ], "summary": "Bundle the site agent as a downloadable ZIP.", "description": "Bundle the site agent as a downloadable ZIP.\n\n**Auth:** permission:endpoints.agentpackage\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/endpoints/siteagent/package -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/geenforce/applications": { "get": { "tags": [ "plugin-geenforce" ], "summary": "The core Applications catalog (id + name) for the curated entry->app link picker in the entry editor.", "description": "The core Applications catalog (id + name) for the curated entry->app link picker in the entry editor.\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/applications -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/geenforce/config": { "get": { "tags": [ "plugin-geenforce" ], "summary": "Plugin config: the on-share export root + the client IP allowlist.", "description": "Plugin config: the on-share export root + the client IP allowlist.\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/config -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "put": { "tags": [ "plugin-geenforce" ], "summary": "UNDOCUMENTED: geenforce.put_config has no docstring.", "description": "UNDOCUMENTED: geenforce.put_config has no docstring.\n\n**Auth:** permission:geenforce.publish\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/geenforce/config -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/geenforce/dashboard/failures": { "get": { "tags": [ "plugin-geenforce" ], "summary": "Entries that FAILED on their PC's most recent enforcement cycle.", "description": "Entries that FAILED on their PC's most recent enforcement cycle.\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/dashboard/failures -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/geenforce/entries/{entryid}": { "delete": { "tags": [ "plugin-geenforce" ], "summary": "UNDOCUMENTED: geenforce.delete_entry has no docstring.", "description": "UNDOCUMENTED: geenforce.delete_entry has no docstring.\n\n**Auth:** permission:geenforce.manage\n\n**Params:** path: entryid (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/geenforce/entries/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "entryid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-geenforce" ], "summary": "UNDOCUMENTED: geenforce.update_entry has no docstring.", "description": "UNDOCUMENTED: geenforce.update_entry has no docstring.\n\n**Auth:** permission:geenforce.manage\n\n**Params:** path: entryid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/geenforce/entries/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "entryid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: entryid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/geenforce/entries/{entryid}/payload": { "get": { "tags": [ "plugin-geenforce" ], "summary": "Return the stored inline payload bytes for an entry (404 if none).", "description": "Return the stored inline payload bytes for an entry (404 if none).\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** path: entryid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/entries/1/payload -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "entryid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "plugin-geenforce" ], "summary": "Store an inline payload (<= 1 MB) for an entry and point the entry at it.", "description": "Store an inline payload (<= 1 MB) for an entry and point the entry at it.\n\n**Auth:** permission:geenforce.publish\n\n**Params:** path: entryid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/geenforce/entries/1/payload -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "entryid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: entryid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/geenforce/manifest": { "get": { "tags": [ "plugin-geenforce" ], "summary": "Serve the current published manifest for a scope (fat-client: full scope).", "description": "Serve the current published manifest for a scope (fat-client: full scope).\n\n**Auth:** api-key (geenforce fetch token, or the IP allowlist)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/manifest -H \"X-API-Key: $KEY\"\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/geenforce/payload/{sha256}": { "get": { "tags": [ "plugin-geenforce" ], "summary": "Serve a payload blob by content hash over HTTPS.", "description": "Serve a payload blob by content hash over HTTPS.\n\n**Auth:** api-key (geenforce fetch token, or the IP allowlist)\n\n**Params:** path: sha256 (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/payload/x -H \"X-API-Key: $KEY\"\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "sha256", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/geenforce/report": { "post": { "tags": [ "plugin-geenforce" ], "summary": "Record one PC's enforcement cycle: applied version (did it receive the update?) + per-entry self-heal outcomes...", "description": "Record one PC's enforcement cycle: applied version (did it receive the update?) + per-entry self-heal outcomes (installed/skipped/failed).\n\n**Auth:** api-key (geenforce report token)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/geenforce/report -H \"X-API-Key: $KEY\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/geenforce/reports": { "get": { "tags": [ "plugin-geenforce" ], "summary": "Latest enforcement report per PC (fleet compliance view).", "description": "Latest enforcement report per PC (fleet compliance view).\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/reports -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/geenforce/reports/{reportid}": { "get": { "tags": [ "plugin-geenforce" ], "summary": "One report with per-entry outcomes (self-heal / failure detail).", "description": "One report with per-entry outcomes (self-heal / failure detail).\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** path: reportid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/reports/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "reportid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/geenforce/scopes": { "get": { "tags": [ "plugin-geenforce" ], "summary": "List imaging PC-type scopes with entry + published-version counts.", "description": "List imaging PC-type scopes with entry + published-version counts.\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/scopes -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-geenforce" ], "summary": "UNDOCUMENTED: geenforce.create_scope has no docstring.", "description": "UNDOCUMENTED: geenforce.create_scope has no docstring.\n\n**Auth:** permission:geenforce.manage\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/geenforce/scopes -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/geenforce/scopes/{scopeid}": { "delete": { "tags": [ "plugin-geenforce" ], "summary": "UNDOCUMENTED: geenforce.delete_scope has no docstring.", "description": "UNDOCUMENTED: geenforce.delete_scope has no docstring.\n\n**Auth:** permission:geenforce.manage\n\n**Params:** path: scopeid (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/geenforce/scopes/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-geenforce" ], "summary": "UNDOCUMENTED: geenforce.get_scope has no docstring.", "description": "UNDOCUMENTED: geenforce.get_scope has no docstring.\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** path: scopeid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/scopes/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-geenforce" ], "summary": "UNDOCUMENTED: geenforce.update_scope has no docstring.", "description": "UNDOCUMENTED: geenforce.update_scope has no docstring.\n\n**Auth:** permission:geenforce.manage\n\n**Params:** path: scopeid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/geenforce/scopes/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: scopeid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/geenforce/scopes/{scopeid}/compliance": { "get": { "tags": [ "plugin-geenforce" ], "summary": "Fleet-install coverage per app-linked entry (from collected PC data).", "description": "Fleet-install coverage per app-linked entry (from collected PC data).\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** path: scopeid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/scopes/1/compliance -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/geenforce/scopes/{scopeid}/entries": { "post": { "tags": [ "plugin-geenforce" ], "summary": "UNDOCUMENTED: geenforce.create_entry has no docstring.", "description": "UNDOCUMENTED: geenforce.create_entry has no docstring.\n\n**Auth:** permission:geenforce.manage\n\n**Params:** path: scopeid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/geenforce/scopes/1/entries -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: scopeid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/geenforce/scopes/{scopeid}/entries/reorder": { "put": { "tags": [ "plugin-geenforce" ], "summary": "Set entry order from a list of entryids (the ordering contract).", "description": "Set entry order from a list of entryids (the ordering contract).\n\n**Auth:** permission:geenforce.manage\n\n**Params:** path: scopeid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/geenforce/scopes/1/entries/reorder -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: scopeid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/geenforce/scopes/{scopeid}/export-share": { "post": { "tags": [ "plugin-geenforce" ], "summary": "Write the scope's current published JSON to the configured share root (backing up the old file to _meta/history first).", "description": "Write the scope's current published JSON to the configured share root (backing up the old file to _meta/history first).\n\n**Auth:** permission:geenforce.publish\n\n**Params:** path: scopeid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/geenforce/scopes/1/export-share -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: scopeid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/geenforce/scopes/{scopeid}/preview": { "get": { "tags": [ "plugin-geenforce" ], "summary": "Render the DRAFT manifest JSON a publish would freeze (review before ship).", "description": "Render the DRAFT manifest JSON a publish would freeze (review before ship).\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** path: scopeid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/scopes/1/preview -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/geenforce/scopes/{scopeid}/publish": { "post": { "tags": [ "plugin-geenforce" ], "summary": "UNDOCUMENTED: geenforce.publish_scope_route has no docstring.", "description": "UNDOCUMENTED: geenforce.publish_scope_route has no docstring.\n\n**Auth:** permission:geenforce.publish\n\n**Params:** path: scopeid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/geenforce/scopes/1/publish -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: scopeid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/geenforce/scopes/{scopeid}/publish-preflight": { "get": { "tags": [ "plugin-geenforce" ], "summary": "Would publishing this scope outrun the fleet's enforcer lib?", "description": "Would publishing this scope outrun the fleet's enforcer lib?\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** path: scopeid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/scopes/1/publish-preflight -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/geenforce/scopes/{scopeid}/rollback": { "post": { "tags": [ "plugin-geenforce" ], "summary": "UNDOCUMENTED: geenforce.rollback_scope_route has no docstring.", "description": "UNDOCUMENTED: geenforce.rollback_scope_route has no docstring.\n\n**Auth:** permission:geenforce.publish\n\n**Params:** path: scopeid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/geenforce/scopes/1/rollback -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: scopeid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/geenforce/scopes/{scopeid}/simulate": { "get": { "tags": [ "plugin-geenforce" ], "summary": "Which draft entries apply to a given machine profile, and why the rest are filtered out (reuses the engine-mirror...", "description": "Which draft entries apply to a given machine profile, and why the rest are filtered out (reuses the engine-mirror filters).\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** path: scopeid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/scopes/1/simulate -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/geenforce/scopes/{scopeid}/versions": { "get": { "tags": [ "plugin-geenforce" ], "summary": "UNDOCUMENTED: geenforce.list_versions has no docstring.", "description": "UNDOCUMENTED: geenforce.list_versions has no docstring.\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** path: scopeid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/scopes/1/versions -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/geenforce/scopes/{scopeid}/versions/{versionnumber}": { "get": { "tags": [ "plugin-geenforce" ], "summary": "UNDOCUMENTED: geenforce.get_version has no docstring.", "description": "UNDOCUMENTED: geenforce.get_version has no docstring.\n\n**Auth:** permission:geenforce.view or geenforce.manage\n\n**Params:** path: scopeid (int), versionnumber (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/geenforce/scopes/1/versions/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "scopeid", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "versionnumber", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/guides": { "get": { "tags": [ "plugin-guides" ], "summary": "Published guides, plus the caller's own drafts if they can author.", "description": "Published guides, plus the caller's own drafts if they can author.\n\n**Auth:** permission:guides.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/guides -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-guides" ], "summary": "UNDOCUMENTED: guides.create_guide has no docstring.", "description": "UNDOCUMENTED: guides.create_guide has no docstring.\n\n**Auth:** permission:guides.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/guides -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/guides/{guideid}": { "delete": { "tags": [ "plugin-guides" ], "summary": "UNDOCUMENTED: guides.delete_guide has no docstring.", "description": "UNDOCUMENTED: guides.delete_guide has no docstring.\n\n**Auth:** permission:guides.delete\n\n**Params:** path: guideid (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/guides/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "guideid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-guides" ], "summary": "UNDOCUMENTED: guides.update_guide has no docstring.", "description": "UNDOCUMENTED: guides.update_guide has no docstring.\n\n**Auth:** permission:guides.view\n\n**Params:** path: guideid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/guides/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "guideid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: guideid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/guides/{guideid}/publish": { "post": { "tags": [ "plugin-guides" ], "summary": "UNDOCUMENTED: guides.publish_guide has no docstring.", "description": "UNDOCUMENTED: guides.publish_guide has no docstring.\n\n**Auth:** permission:guides.publish\n\n**Params:** path: guideid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/guides/1/publish -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "guideid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: guideid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/guides/{guideid}/restore/{revisionid}": { "post": { "tags": [ "plugin-guides" ], "summary": "UNDOCUMENTED: guides.restore_revision has no docstring.", "description": "UNDOCUMENTED: guides.restore_revision has no docstring.\n\n**Auth:** permission:guides.view\n\n**Params:** path: guideid (int), revisionid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/guides/1/restore/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "guideid", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "revisionid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: guideid (int), revisionid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/guides/{guideid}/revisions": { "get": { "tags": [ "plugin-guides" ], "summary": "UNDOCUMENTED: guides.list_revisions has no docstring.", "description": "UNDOCUMENTED: guides.list_revisions has no docstring.\n\n**Auth:** permission:guides.view\n\n**Params:** path: guideid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/guides/1/revisions -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "guideid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/guides/{guideid}/unpublish": { "post": { "tags": [ "plugin-guides" ], "summary": "UNDOCUMENTED: guides.unpublish_guide has no docstring.", "description": "UNDOCUMENTED: guides.unpublish_guide has no docstring.\n\n**Auth:** permission:guides.publish\n\n**Params:** path: guideid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/guides/1/unpublish -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "guideid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: guideid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/guides/{guideid}/working": { "get": { "tags": [ "plugin-guides" ], "summary": "The working copy, for the editor.", "description": "The working copy, for the editor.\n\n**Auth:** permission:guides.view\n\n**Params:** path: guideid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/guides/1/working -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "guideid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/guides/{slug}": { "get": { "tags": [ "plugin-guides" ], "summary": "What a reader gets: the published revision.", "description": "What a reader gets: the published revision.\n\n**Auth:** permission:guides.view\n\n**Params:** path: slug (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/guides/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/guides/images": { "post": { "tags": [ "plugin-guides" ], "summary": "Take a pasted or dropped image.", "description": "Take a pasted or dropped image.\n\n**Auth:** permission:guides.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/guides/images -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/guides/images/{imageid}": { "get": { "tags": [ "plugin-guides" ], "summary": "The image itself, under the same rule as the guide that holds it.", "description": "The image itself, under the same rule as the guide that holds it.\n\n**Auth:** permission:guides.view\n\n**Params:** path: imageid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/guides/images/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "imageid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/guides/revisions/{revisionid}": { "get": { "tags": [ "plugin-guides" ], "summary": "One revision by id.", "description": "One revision by id.\n\n**Auth:** permission:guides.view\n\n**Params:** path: revisionid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/guides/revisions/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "revisionid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/guides/tags": { "get": { "tags": [ "plugin-guides" ], "summary": "Every tag in use, with a count, for the filter chips.", "description": "Every tag in use, with a count, for the filter chips.\n\n**Auth:** permission:guides.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/guides/tags -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/knowledgebase": { "get": { "tags": [ "plugin-knowledgebase" ], "summary": "List all knowledge base articles.", "description": "List all knowledge base articles.\n\n**Auth:** permission:kb.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/knowledgebase -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-knowledgebase" ], "summary": "Create a new knowledge base article.", "description": "Create a new knowledge base article.\n\n**Auth:** permission:kb.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/knowledgebase -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/knowledgebase/{link_id}": { "delete": { "tags": [ "plugin-knowledgebase" ], "summary": "Delete (deactivate) a knowledge base article.", "description": "Delete (deactivate) a knowledge base article.\n\n**Auth:** permission:kb.delete\n\n**Params:** path: link_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/knowledgebase/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "link_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-knowledgebase" ], "summary": "Get a single knowledge base article.", "description": "Get a single knowledge base article.\n\n**Auth:** permission:kb.view\n\n**Params:** path: link_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/knowledgebase/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "link_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-knowledgebase" ], "summary": "Update a knowledge base article.", "description": "Update a knowledge base article.\n\n**Auth:** permission:kb.edit\n\n**Params:** path: link_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/knowledgebase/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "link_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: link_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/knowledgebase/{link_id}/click": { "post": { "tags": [ "plugin-knowledgebase" ], "summary": "Increment the click counter for an article the caller is allowed to read.", "description": "Increment the click counter for an article the caller is allowed to read.\n\n**Auth:** permission:kb.view\n\n**Params:** path: link_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/knowledgebase/1/click -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "link_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: link_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/knowledgebase/stats": { "get": { "tags": [ "plugin-knowledgebase" ], "summary": "Get knowledge base statistics.", "description": "Get knowledge base statistics.\n\n**Auth:** permission:kb.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/knowledgebase/stats -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/machines": { "get": { "tags": [ "plugin-machines" ], "summary": "List all machines with filtering and pagination.", "description": "List all machines with filtering and pagination.\n\n**Auth:** permission:machines.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/machines -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-machines" ], "summary": "Create new machine (creates both Asset and Machine records).", "description": "Create new machine (creates both Asset and Machine records).\n\n**Auth:** permission:machines.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/machines -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/machines/{machine_id}": { "delete": { "tags": [ "plugin-machines" ], "summary": "Delete (soft delete) machine.", "description": "Delete (soft delete) machine.\n\n**Auth:** permission:machines.delete\n\n**Params:** path: machine_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/machines/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "machine_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-machines" ], "summary": "Get a single machine item with full details.", "description": "Get a single machine item with full details.\n\n**Auth:** permission:machines.view\n\n**Params:** path: machine_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/machines/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "machine_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-machines" ], "summary": "Update machine (both Asset and Machine records).", "description": "Update machine (both Asset and Machine records).\n\n**Auth:** permission:machines.edit\n\n**Params:** path: machine_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/machines/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "machine_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: machine_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/machines/by-asset/{asset_id}": { "get": { "tags": [ "plugin-machines" ], "summary": "Get machine data by asset ID.", "description": "Get machine data by asset ID.\n\n**Auth:** permission:machines.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/machines/by-asset/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/machines/dashboard/outofservice": { "get": { "tags": [ "plugin-machines" ], "summary": "Machines whose status says they are not running.", "description": "Machines whose status says they are not running.\n\n**Auth:** permission:machines.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/machines/dashboard/outofservice -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/machines/dashboard/summary": { "get": { "tags": [ "plugin-machines" ], "summary": "Get machine dashboard summary data.", "description": "Get machine dashboard summary data.\n\n**Auth:** permission:machines.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/machines/dashboard/summary -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/machines/types": { "get": { "tags": [ "plugin-machines" ], "summary": "List all machine types.", "description": "List all machine types.\n\n**Auth:** permission:machines.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/machines/types -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-machines" ], "summary": "Create a new machine type.", "description": "Create a new machine type.\n\n**Auth:** permission:machines.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/machines/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/machines/types/{type_id}": { "delete": { "tags": [ "plugin-machines" ], "summary": "Delete a machine type. Refused if any asset still uses it.", "description": "Delete a machine type. Refused if any asset still uses it.\n\n**Auth:** permission:machines.delete\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/machines/types/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-machines" ], "summary": "Get a single machine type.", "description": "Get a single machine type.\n\n**Auth:** permission:machines.view\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/machines/types/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-machines" ], "summary": "Update a machine type.", "description": "Update a machine type.\n\n**Auth:** permission:machines.edit\n\n**Params:** path: type_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/machines/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: type_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/measuringtools": { "get": { "tags": [ "plugin-measuringtools" ], "summary": "List measuring tools with filters + pagination.", "description": "List measuring tools with filters + pagination.\n\n**Auth:** permission:measuringtools.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/measuringtools -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-measuringtools" ], "summary": "Create a measuring tool: one Asset core row + one extension row.", "description": "Create a measuring tool: one Asset core row + one extension row.\n\n**Auth:** permission:measuringtools.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/measuringtools -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/measuringtools/{tool_id}": { "delete": { "tags": [ "plugin-measuringtools" ], "summary": "Soft delete a measuring tool (deactivates its asset).", "description": "Soft delete a measuring tool (deactivates its asset).\n\n**Auth:** permission:measuringtools.delete\n\n**Params:** path: tool_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/measuringtools/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "tool_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-measuringtools" ], "summary": "Get one measuring tool (asset core merged with the extension).", "description": "Get one measuring tool (asset core merged with the extension).\n\n**Auth:** permission:measuringtools.view\n\n**Params:** path: tool_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/measuringtools/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "tool_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-measuringtools" ], "summary": "Update a measuring tool (asset core fields + extension in one payload).", "description": "Update a measuring tool (asset core fields + extension in one payload).\n\n**Auth:** permission:measuringtools.edit\n\n**Params:** path: tool_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/measuringtools/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "tool_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: tool_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/measuringtools/by-asset/{asset_id}": { "get": { "tags": [ "plugin-measuringtools" ], "summary": "Get a measuring tool by its core asset id.", "description": "Get a measuring tool by its core asset id.\n\n**Auth:** permission:measuringtools.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/measuringtools/by-asset/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/measuringtools/map-overlay": { "get": { "tags": [ "plugin-measuringtools" ], "summary": "Calibration-status overlay for active measuring tools.", "description": "Calibration-status overlay for active measuring tools.\n\n**Auth:** permission:measuringtools.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/measuringtools/map-overlay -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/measuringtools/report/calibration": { "get": { "tags": [ "plugin-measuringtools" ], "summary": "Counts + lists bucketed by derived calibration status.", "description": "Counts + lists bucketed by derived calibration status.\n\n**Auth:** permission:measuringtools.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/measuringtools/report/calibration -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/measuringtools/types": { "get": { "tags": [ "plugin-measuringtools" ], "summary": "List measuring-tool types.", "description": "List measuring-tool types.\n\n**Auth:** permission:measuringtools.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/measuringtools/types -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-measuringtools" ], "summary": "Create a measuring-tool type (reactivates a soft-deleted same-named one).", "description": "Create a measuring-tool type (reactivates a soft-deleted same-named one).\n\n**Auth:** permission:measuringtools.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/measuringtools/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/measuringtools/types/{type_id}": { "delete": { "tags": [ "plugin-measuringtools" ], "summary": "Delete a measuring-tool type. Refused if any tool still uses it.", "description": "Delete a measuring-tool type. Refused if any tool still uses it.\n\n**Auth:** permission:measuringtools.delete\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/measuringtools/types/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-measuringtools" ], "summary": "Get one measuring-tool type.", "description": "Get one measuring-tool type.\n\n**Auth:** permission:measuringtools.view\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/measuringtools/types/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-measuringtools" ], "summary": "Update a measuring-tool type.", "description": "Update a measuring-tool type.\n\n**Auth:** permission:measuringtools.edit\n\n**Params:** path: type_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/measuringtools/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: type_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/network": { "get": { "tags": [ "plugin-network" ], "summary": "List all network devices with filtering and pagination.", "description": "List all network devices with filtering and pagination.\n\n**Auth:** permission:network.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/network -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-network" ], "summary": "Create new network device (creates both Asset and NetworkDevice records).", "description": "Create new network device (creates both Asset and NetworkDevice records).\n\n**Auth:** permission:network.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/network -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/network/{device_id}": { "delete": { "tags": [ "plugin-network" ], "summary": "Delete (soft delete) network device.", "description": "Delete (soft delete) network device.\n\n**Auth:** permission:network.delete\n\n**Params:** path: device_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/network/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-network" ], "summary": "Get a single network device with full details.", "description": "Get a single network device with full details.\n\n**Auth:** permission:network.view\n\n**Params:** path: device_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/network/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-network" ], "summary": "Update network device (both Asset and NetworkDevice records).", "description": "Update network device (both Asset and NetworkDevice records).\n\n**Auth:** permission:network.edit\n\n**Params:** path: device_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/network/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: device_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/network/by-asset/{asset_id}": { "get": { "tags": [ "plugin-network" ], "summary": "Get network device data by asset ID.", "description": "Get network device data by asset ID.\n\n**Auth:** permission:network.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/network/by-asset/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/network/by-hostname/{hostname}": { "get": { "tags": [ "plugin-network" ], "summary": "Get network device by hostname.", "description": "Get network device by hostname.\n\n**Auth:** permission:network.view\n\n**Params:** path: hostname (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/network/by-hostname/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "hostname", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/network/dashboard/summary": { "get": { "tags": [ "plugin-network" ], "summary": "Get network device dashboard summary data.", "description": "Get network device dashboard summary data.\n\n**Auth:** permission:network.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/network/dashboard/summary -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/network/subnets": { "get": { "tags": [ "plugin-network" ], "summary": "List all subnets with filtering and pagination.", "description": "List all subnets with filtering and pagination.\n\n**Auth:** permission:network.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/network/subnets -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-network" ], "summary": "Create a new subnet.", "description": "Create a new subnet.\n\n**Auth:** permission:network.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/network/subnets -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/network/subnets/{subnet_id}": { "delete": { "tags": [ "plugin-network" ], "summary": "Delete (soft delete) a subnet.", "description": "Delete (soft delete) a subnet.\n\n**Auth:** permission:network.delete\n\n**Params:** path: subnet_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/network/subnets/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "subnet_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-network" ], "summary": "Get a single subnet plus the network devices whose primary IP falls in its CIDR range.", "description": "Get a single subnet plus the network devices whose primary IP falls in its CIDR range.\n\n**Auth:** permission:network.view\n\n**Params:** path: subnet_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/network/subnets/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "subnet_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-network" ], "summary": "Update a subnet.", "description": "Update a subnet.\n\n**Auth:** permission:network.edit\n\n**Params:** path: subnet_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/network/subnets/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "subnet_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: subnet_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/network/types": { "get": { "tags": [ "plugin-network" ], "summary": "List all network device types.", "description": "List all network device types.\n\n**Auth:** permission:network.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/network/types -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-network" ], "summary": "Create a new network device type.", "description": "Create a new network device type.\n\n**Auth:** permission:network.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/network/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/network/types/{type_id}": { "delete": { "tags": [ "plugin-network" ], "summary": "Delete a network device type. Refused if any device still uses it.", "description": "Delete a network device type. Refused if any device still uses it.\n\n**Auth:** permission:network.delete\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/network/types/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-network" ], "summary": "Get a single network device type.", "description": "Get a single network device type.\n\n**Auth:** permission:network.view\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/network/types/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-network" ], "summary": "Update a network device type.", "description": "Update a network device type.\n\n**Auth:** permission:network.edit\n\n**Params:** path: type_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/network/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: type_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/network/vlans": { "get": { "tags": [ "plugin-network" ], "summary": "List all VLANs with filtering and pagination.", "description": "List all VLANs with filtering and pagination.\n\n**Auth:** permission:network.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/network/vlans -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-network" ], "summary": "Create a new VLAN.", "description": "Create a new VLAN.\n\n**Auth:** permission:network.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/network/vlans -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/network/vlans/{vlan_id}": { "delete": { "tags": [ "plugin-network" ], "summary": "Delete (soft delete) a VLAN.", "description": "Delete (soft delete) a VLAN.\n\n**Auth:** permission:network.delete\n\n**Params:** path: vlan_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/network/vlans/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "vlan_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-network" ], "summary": "Get a single VLAN with its subnets.", "description": "Get a single VLAN with its subnets.\n\n**Auth:** permission:network.view\n\n**Params:** path: vlan_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/network/vlans/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "vlan_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-network" ], "summary": "Update a VLAN.", "description": "Update a VLAN.\n\n**Auth:** permission:network.edit\n\n**Params:** path: vlan_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/network/vlans/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "vlan_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: vlan_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/notifications": { "get": { "tags": [ "plugin-notifications" ], "summary": "List all notifications with filtering and pagination.", "description": "List all notifications with filtering and pagination.\n\n**Auth:** permission:notifications.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/notifications -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-notifications" ], "summary": "Create a new notification.", "description": "Create a new notification.\n\n**Auth:** permission:notifications.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/notifications -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/notifications/{notification_id}": { "delete": { "tags": [ "plugin-notifications" ], "summary": "Delete (soft delete) a notification.", "description": "Delete (soft delete) a notification.\n\n**Auth:** permission:notifications.delete\n\n**Params:** path: notification_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/notifications/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "notification_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-notifications" ], "summary": "Get a single notification.", "description": "Get a single notification.\n\n**Auth:** permission:notifications.view\n\n**Params:** path: notification_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/notifications/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "notification_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-notifications" ], "summary": "Update a notification.", "description": "Update a notification.\n\n**Auth:** permission:notifications.edit\n\n**Params:** path: notification_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/notifications/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "notification_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: notification_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/notifications/active": { "get": { "tags": [ "plugin-notifications" ], "summary": "Get currently active notifications for display.", "description": "Get currently active notifications for display.\n\n**Auth:** permission:notifications.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/notifications/active -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/notifications/calendar": { "get": { "tags": [ "plugin-notifications" ], "summary": "Get notifications in FullCalendar event format.", "description": "Get notifications in FullCalendar event format.\n\n**Auth:** permission:notifications.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/notifications/calendar -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/notifications/dashboard/active": { "get": { "tags": [ "plugin-notifications" ], "summary": "Notifications currently showing on the floor.", "description": "Notifications currently showing on the floor.\n\n**Auth:** permission:notifications.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/notifications/dashboard/active -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/notifications/dashboard/summary": { "get": { "tags": [ "plugin-notifications" ], "summary": "Get notifications dashboard summary.", "description": "Get notifications dashboard summary.\n\n**Auth:** permission:notifications.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/notifications/dashboard/summary -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/notifications/employee/{sso}": { "get": { "tags": [ "plugin-notifications" ], "summary": "Get recognitions for a specific employee by SSO.", "description": "Get recognitions for a specific employee by SSO.\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** path: sso (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/notifications/employee/x\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "sso", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/notifications/shopfloor": { "get": { "tags": [ "plugin-notifications" ], "summary": "Get notifications for shopfloor TV dashboard.", "description": "Get notifications for shopfloor TV dashboard.\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/notifications/shopfloor\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/notifications/types": { "get": { "tags": [ "plugin-notifications" ], "summary": "List all notification types.", "description": "List all notification types.\n\n**Auth:** permission:notifications.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/notifications/types -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-notifications" ], "summary": "Create a new notification type.", "description": "Create a new notification type.\n\n**Auth:** permission:notifications.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/notifications/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/notifications/types/{type_id}": { "patch": { "tags": [ "plugin-notifications" ], "summary": "Update a notification type, including its auto-expiry rule.", "description": "Update a notification type, including its auto-expiry rule.\n\n**Auth:** permission:notifications.create\n\n**Params:** path: type_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PATCH http://localhost:5001/api/notifications/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: type_id (int); body: JSON (fields not yet documented)" } } } } }, "put": { "tags": [ "plugin-notifications" ], "summary": "Update a notification type, including its auto-expiry rule.", "description": "Update a notification type, including its auto-expiry rule.\n\n**Auth:** permission:notifications.create\n\n**Params:** path: type_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PATCH http://localhost:5001/api/notifications/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: type_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printedparts/files/{file_id}": { "delete": { "tags": [ "plugin-printedparts" ], "summary": "Remove a bad revision (wrong file uploaded). History otherwise stays.", "description": "Remove a bad revision (wrong file uploaded). History otherwise stays.\n\n**Auth:** permission:printedparts.delete\n\n**Params:** path: file_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/printedparts/files/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "file_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/printedparts/files/{file_id}/download": { "get": { "tags": [ "plugin-printedparts" ], "summary": "Download a revision under its original filename.", "description": "Download a revision under its original filename.\n\n**Auth:** permission:printedparts.view\n\n**Params:** path: file_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printedparts/files/1/download -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "file_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/printedparts/image/{filename}": { "get": { "tags": [ "plugin-printedparts" ], "summary": "Serve an uploaded item image (public - kiosk and list read it).", "description": "Serve an uploaded item image (public - kiosk and list read it).\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** path: filename (path)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printedparts/image/example.png\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "filename", "in": "path", "required": true, "schema": { "type": "string", "description": "may contain slashes" } } ] } }, "/api/printedparts/items": { "get": { "tags": [ "plugin-printedparts" ], "summary": "List printed items, paginated; search + low-stock filter.", "description": "List printed items, paginated; search + low-stock filter.\n\n**Auth:** permission:printedparts.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printedparts/items -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-printedparts" ], "summary": "Create a printed item.", "description": "Create a printed item.\n\n**Auth:** permission:printedparts.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printedparts/items -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/printedparts/items/{item_id}": { "delete": { "tags": [ "plugin-printedparts" ], "summary": "Soft-retire an item; its ledger history stays.", "description": "Soft-retire an item; its ledger history stays.\n\n**Auth:** permission:printedparts.delete\n\n**Params:** path: item_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/printedparts/items/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "item_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-printedparts" ], "summary": "Get one printed item with its recent transactions.", "description": "Get one printed item with its recent transactions.\n\n**Auth:** permission:printedparts.view\n\n**Params:** path: item_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printedparts/items/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "item_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-printedparts" ], "summary": "Update catalog fields. Quantity moves ONLY through the ledger.", "description": "Update catalog fields. Quantity moves ONLY through the ledger.\n\n**Auth:** permission:printedparts.edit\n\n**Params:** path: item_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/printedparts/items/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "item_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: item_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printedparts/items/{item_id}/adjust": { "post": { "tags": [ "plugin-printedparts" ], "summary": "Correct the count (damage, recount). Body: {quantitychange, reason, badge}.", "description": "Correct the count (damage, recount). Body: {quantitychange, reason, badge}.\n\n**Auth:** permission:printedparts.restock\n\n**Params:** path: item_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printedparts/items/1/adjust -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "item_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: item_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printedparts/items/{item_id}/files": { "get": { "tags": [ "plugin-printedparts" ], "summary": "Revision history, newest first.", "description": "Revision history, newest first.\n\n**Auth:** permission:printedparts.view\n\n**Params:** path: item_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printedparts/items/1/files -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "item_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "plugin-printedparts" ], "summary": "Upload the next revision of the item's print file.", "description": "Upload the next revision of the item's print file.\n\n**Auth:** permission:printedparts.edit\n\n**Params:** path: item_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printedparts/items/1/files -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "item_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: item_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printedparts/items/{item_id}/image": { "delete": { "tags": [ "plugin-printedparts" ], "summary": "Clear an item image; delete the file only if this plugin owns it.", "description": "Clear an item image; delete the file only if this plugin owns it.\n\n**Auth:** permission:printedparts.delete\n\n**Params:** path: item_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/printedparts/items/1/image -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "item_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "plugin-printedparts" ], "summary": "Upload (or replace) the photo for an item (multipart file=).", "description": "Upload (or replace) the photo for an item (multipart file=).\n\n**Auth:** permission:printedparts.edit\n\n**Params:** path: item_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printedparts/items/1/image -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "item_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: item_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printedparts/items/{item_id}/restock": { "post": { "tags": [ "plugin-printedparts" ], "summary": "Add freshly printed stock. Body: {quantity, badge}.", "description": "Add freshly printed stock. Body: {quantity, badge}.\n\n**Auth:** permission:printedparts.restock\n\n**Params:** path: item_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printedparts/items/1/restock -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "item_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: item_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printedparts/items/{item_id}/restore": { "post": { "tags": [ "plugin-printedparts" ], "summary": "Bring a retired item back; code, photo, and history are intact.", "description": "Bring a retired item back; code, photo, and history are intact.\n\n**Auth:** permission:printedparts.delete\n\n**Params:** path: item_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printedparts/items/1/restore -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "item_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: item_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printedparts/kiosk/item/{itemcode}": { "get": { "tags": [ "plugin-printedparts" ], "summary": "Item summary for a scanned bin barcode. Kiosk-token gated.", "description": "Item summary for a scanned bin barcode. Kiosk-token gated.\n\n**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)\n\n**Params:** path: itemcode (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printedparts/kiosk/item/x\n```", "security": [ { "apiKeyAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "itemcode", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/printedparts/kiosk/provisioning-link": { "get": { "tags": [ "plugin-printedparts" ], "summary": "The URL that provisions a screen, token included, for an administrator.", "description": "The URL that provisions a screen, token included, for an administrator.\n\n**Auth:** permission:settings.edit\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printedparts/kiosk/provisioning-link -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/printedparts/kiosk/take": { "post": { "tags": [ "plugin-printedparts" ], "summary": "Take parts from a bin. Body: {itemcode, badge, quantity}.", "description": "Take parts from a bin. Body: {itemcode, badge, quantity}.\n\n**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)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printedparts/kiosk/take -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/printedparts/reports/by-person": { "get": { "tags": [ "plugin-printedparts" ], "summary": "Takes grouped by employee, optionally bounded by ?days= (default 30).", "description": "Takes grouped by employee, optionally bounded by ?days= (default 30).\n\n**Auth:** permission:printedparts.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printedparts/reports/by-person -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/printedparts/reports/consumption": { "get": { "tags": [ "plugin-printedparts" ], "summary": "Takes per item, optionally bounded by ?days= (default 30).", "description": "Takes per item, optionally bounded by ?days= (default 30).\n\n**Auth:** permission:printedparts.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printedparts/reports/consumption -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/printedparts/reports/stock": { "get": { "tags": [ "plugin-printedparts" ], "summary": "Stock levels with low-stock flags and the cache-vs-ledger reconcile.", "description": "Stock levels with low-stock flags and the cache-vs-ledger reconcile.\n\n**Auth:** permission:printedparts.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printedparts/reports/stock -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/printers": { "get": { "tags": [ "plugin-printers" ], "summary": "List all printers with filtering and pagination.", "description": "List all printers with filtering and pagination.\n\n**Auth:** permission:printers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-printers" ], "summary": "Create new printer (creates both Asset and Printer records).", "description": "Create new printer (creates both Asset and Printer records).\n\n**Auth:** permission:printers.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printers -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/printers/{printer_id}": { "delete": { "tags": [ "plugin-printers" ], "summary": "Delete (soft delete) printer.", "description": "Delete (soft delete) printer.\n\n**Auth:** permission:printers.delete\n\n**Params:** path: printer_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/printers/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "printer_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-printers" ], "summary": "Get a single printer with full details.", "description": "Get a single printer with full details.\n\n**Auth:** permission:printers.view\n\n**Params:** path: printer_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "printer_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-printers" ], "summary": "Update printer (both Asset and Printer records).", "description": "Update printer (both Asset and Printer records).\n\n**Auth:** permission:printers.edit\n\n**Params:** path: printer_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/printers/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "printer_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: printer_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printers/{printer_id}/supplies": { "get": { "tags": [ "plugin-printers" ], "summary": "Get supply levels from Zabbix (real-time lookup).", "description": "Get supply levels from Zabbix (real-time lookup).\n\n**Auth:** permission:printers.view\n\n**Params:** path: printer_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/1/supplies -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "printer_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/printers/assignments/for-asset/{asset_id}": { "get": { "tags": [ "plugin-printers" ], "summary": "What THIS asset is assigned, without inheritance.", "description": "What THIS asset is assigned, without inheritance.\n\n**Auth:** permission:printers.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/assignments/for-asset/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-printers" ], "summary": "Reconcile one asset's whole printer assignment in a single call.", "description": "Reconcile one asset's whole printer assignment in a single call.\n\n**Auth:** permission:printers.edit\n\n**Params:** path: asset_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/printers/assignments/for-asset/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: asset_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printers/assignments/seed-from-observed/{asset_id}": { "post": { "tags": [ "plugin-printers" ], "summary": "Write what a PC observed as the assignment of the asset in the path.", "description": "Write what a PC observed as the assignment of the asset in the path.\n\n**Auth:** permission:printers.edit\n\n**Params:** path: asset_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printers/assignments/seed-from-observed/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: asset_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printers/by-asset/{asset_id}": { "get": { "tags": [ "plugin-printers" ], "summary": "Get printer data by asset ID.", "description": "Get printer data by asset ID.\n\n**Auth:** permission:printers.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/by-asset/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/printers/dashboard/summary": { "get": { "tags": [ "plugin-printers" ], "summary": "Get printer dashboard summary data.", "description": "Get printer dashboard summary data.\n\n**Auth:** permission:printers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/dashboard/summary -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/printers/dashboard/supplies": { "get": { "tags": [ "plugin-printers" ], "summary": "Printers needing a cartridge, flattened to one row per printer.", "description": "Printers needing a cartridge, flattened to one row per printer.\n\n**Auth:** permission:printers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/dashboard/supplies -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/printers/drivers": { "get": { "tags": [ "plugin-printers" ], "summary": "List printer drivers. ?active=false includes inactive ones.", "description": "List printer drivers. ?active=false includes inactive ones.\n\n**Auth:** permission:printers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/drivers -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-printers" ], "summary": "UNDOCUMENTED: printers_asset.create_driver has no docstring.", "description": "UNDOCUMENTED: printers_asset.create_driver has no docstring.\n\n**Auth:** permission:printers.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printers/drivers -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/printers/drivers/{driver_id}": { "delete": { "tags": [ "plugin-printers" ], "summary": "UNDOCUMENTED: printers_asset.delete_driver has no docstring.", "description": "UNDOCUMENTED: printers_asset.delete_driver has no docstring.\n\n**Auth:** permission:printers.delete\n\n**Params:** path: driver_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/printers/drivers/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "driver_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-printers" ], "summary": "UNDOCUMENTED: printers_asset.update_driver has no docstring.", "description": "UNDOCUMENTED: printers_asset.update_driver has no docstring.\n\n**Auth:** permission:printers.edit\n\n**Params:** path: driver_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/printers/drivers/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "driver_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: driver_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printers/for-host/{hostname}": { "get": { "tags": [ "plugin-printers" ], "summary": "Printers assigned to a PC, by hostname, with what it takes to install one.", "description": "Printers assigned to a PC, by hostname, with what it takes to install one.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** path: hostname (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/for-host/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "hostname", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/printers/install-batch": { "get": { "tags": [ "plugin-printers" ], "summary": "Generate a Windows .bat that installs the selected printers.", "description": "Generate a Windows .bat that installs the selected printers.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/install-batch -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/printers/install-list": { "get": { "tags": [ "plugin-printers" ], "summary": "Flat, unpaginated list of network printers for the printer installer.", "description": "Flat, unpaginated list of network printers for the printer installer.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/install-list -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/printers/lookup": { "get": { "tags": [ "plugin-printers" ], "summary": "Find a printer by IP or FQDN. Parity with the classic printerlookup.asp.", "description": "Find a printer by IP or FQDN. Parity with the classic printerlookup.asp.\n\n**Auth:** permission:printers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/lookup -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/printers/lowsupplies": { "get": { "tags": [ "plugin-printers" ], "summary": "Get printers with low or critical supply levels.", "description": "Get printers with low or critical supply levels.\n\n**Auth:** permission:printers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/lowsupplies -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/printers/models": { "get": { "tags": [ "plugin-printers" ], "summary": "List models with a supply count, for the supply-management picker.", "description": "List models with a supply count, for the supply-management picker.\n\n**Auth:** permission:printers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/models -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/printers/models/{modelnumberid}/supplies": { "get": { "tags": [ "plugin-printers" ], "summary": "List all supplies mapped to a model.", "description": "List all supplies mapped to a model.\n\n**Auth:** permission:printers.view\n\n**Params:** path: modelnumberid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/models/1/supplies -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "modelnumberid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "plugin-printers" ], "summary": "Add a supply to a model.", "description": "Add a supply to a model.\n\n**Auth:** permission:printers.create\n\n**Params:** path: modelnumberid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printers/models/1/supplies -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "modelnumberid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: modelnumberid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printers/observed/{hostname}": { "get": { "tags": [ "plugin-printers" ], "summary": "What a host last reported, each queue judged against what it is assigned.", "description": "What a host last reported, each queue judged against what it is assigned.\n\n**Auth:** permission:printers.view\n\n**Params:** path: hostname (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/observed/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "hostname", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/printers/observed/for-asset/{asset_id}": { "get": { "tags": [ "plugin-printers" ], "summary": "The same comparison, reached from an asset page: one block per host.", "description": "The same comparison, reached from an asset page: one block per host.\n\n**Auth:** permission:printers.view\n\n**Params:** path: asset_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/observed/for-asset/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "asset_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/printers/pc-default": { "get": { "tags": [ "plugin-printers" ], "summary": "Default printer for a PC, by machine (asset) number.", "description": "Default printer for a PC, by machine (asset) number.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/pc-default -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/printers/supplies/{modelsupplyid}": { "delete": { "tags": [ "plugin-printers" ], "summary": "Delete a model supply.", "description": "Delete a model supply.\n\n**Auth:** permission:printers.delete\n\n**Params:** path: modelsupplyid (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/printers/supplies/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "modelsupplyid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-printers" ], "summary": "Update a model supply.", "description": "Update a model supply.\n\n**Auth:** permission:printers.edit\n\n**Params:** path: modelsupplyid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/printers/supplies/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "modelsupplyid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: modelsupplyid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/printers/supplies/forecast": { "get": { "tags": [ "plugin-printers" ], "summary": "Days-to-empty and replacement counts per printer.", "description": "Days-to-empty and replacement counts per printer.\n\n**Auth:** permission:printers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/supplies/forecast -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/printers/supplies/meta": { "get": { "tags": [ "plugin-printers" ], "summary": "Allowed values for supply type, color, and capacity tier (for the UI).", "description": "Allowed values for supply type, color, and capacity tier (for the UI).\n\n**Auth:** permission:printers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/supplies/meta -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/printers/supplies/refresh": { "post": { "tags": [ "plugin-printers" ], "summary": "Clear cached Zabbix supply data so the next read pulls fresh values.", "description": "Clear cached Zabbix supply data so the next read pulls fresh values.\n\n**Auth:** permission:printers.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printers/supplies/refresh -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/printers/types": { "get": { "tags": [ "plugin-printers" ], "summary": "List all printer types.", "description": "List all printer types.\n\n**Auth:** permission:printers.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/types -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-printers" ], "summary": "Create a new printer type.", "description": "Create a new printer type.\n\n**Auth:** permission:printers.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/printers/types -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/printers/types/{type_id}": { "delete": { "tags": [ "plugin-printers" ], "summary": "Delete a printer type. Refused if any printer still uses it.", "description": "Delete a printer type. Refused if any printer still uses it.\n\n**Auth:** permission:printers.delete\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/printers/types/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-printers" ], "summary": "Get a single printer type.", "description": "Get a single printer type.\n\n**Auth:** permission:printers.view\n\n**Params:** path: type_id (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/printers/types/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-printers" ], "summary": "Update a printer type.", "description": "Update a printer type.\n\n**Auth:** permission:printers.edit\n\n**Params:** path: type_id (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/printers/types/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "type_id", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: type_id (int); body: JSON (fields not yet documented)" } } } } } }, "/api/slides/{surface}": { "get": { "tags": [ "plugin-slides" ], "summary": "UNDOCUMENTED: slides.list_slides has no docstring.", "description": "UNDOCUMENTED: slides.list_slides has no docstring.\n\n**Auth:** permission:slides.view or slides.manage\n\n**Params:** path: surface (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/slides/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "surface", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/slides/{surface}/{slideid}": { "patch": { "tags": [ "plugin-slides" ], "summary": "UNDOCUMENTED: slides.update_slide has no docstring.", "description": "UNDOCUMENTED: slides.update_slide has no docstring.\n\n**Auth:** permission:slides.manage\n\n**Params:** path: surface (string), slideid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PATCH http://localhost:5001/api/slides/x/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "surface", "in": "path", "required": true, "schema": { "type": "string" } }, { "name": "slideid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: surface (string), slideid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/slides/{surface}/delete": { "post": { "tags": [ "plugin-slides" ], "summary": "UNDOCUMENTED: slides.delete_slides has no docstring.", "description": "UNDOCUMENTED: slides.delete_slides has no docstring.\n\n**Auth:** permission:slides.manage\n\n**Params:** path: surface (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/slides/x/delete -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "surface", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: surface (string); body: JSON (fields not yet documented)" } } } } } }, "/api/slides/{surface}/order": { "post": { "tags": [ "plugin-slides" ], "summary": "UNDOCUMENTED: slides.reorder_slides has no docstring.", "description": "UNDOCUMENTED: slides.reorder_slides has no docstring.\n\n**Auth:** permission:slides.manage\n\n**Params:** path: surface (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/slides/x/order -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "surface", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: surface (string); body: JSON (fields not yet documented)" } } } } } }, "/api/slides/{surface}/upload": { "post": { "tags": [ "plugin-slides" ], "summary": "UNDOCUMENTED: slides.upload_slides has no docstring.", "description": "UNDOCUMENTED: slides.upload_slides has no docstring.\n\n**Auth:** permission:slides.manage\n\n**Params:** path: surface (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/slides/x/upload -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "surface", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: surface (string); body: JSON (fields not yet documented)" } } } } } }, "/api/slides/feed": { "get": { "tags": [ "plugin-slides" ], "summary": "Flat playlist for a surface. NOT wrapped in the success_response envelope so the screensaver's existing parser needs no...", "description": "Flat playlist for a surface. NOT wrapped in the success_response envelope so the screensaver's existing parser needs no change.\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/slides/feed\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } } } }, "/api/slides/img/{surface}/{filename}": { "get": { "tags": [ "plugin-slides" ], "summary": "Serve a slide image with a path-traversal guard.", "description": "Serve a slide image with a path-traversal guard.\n\n**Auth:** none (reviewed: named in the public-read or mutation sweep)\n\n**Params:** path: surface (string), filename (path)\n\n**Example:**\n```\ncurl http://localhost:5001/api/slides/img/x/example.png\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "surface", "in": "path", "required": true, "schema": { "type": "string" } }, { "name": "filename", "in": "path", "required": true, "schema": { "type": "string", "description": "may contain slashes" } } ] } }, "/api/tools/secrets": { "post": { "tags": [ "plugin-tools" ], "summary": "Store an already-encrypted secret and return its token.", "description": "Store an already-encrypted secret and return its token.\n\n**Auth:** jwt-optional (works signed out; the handler decides what shows)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/tools/secrets -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/tools/secrets/{token}": { "get": { "tags": [ "plugin-tools" ], "summary": "Whether a link is still live, WITHOUT spending it.", "description": "Whether a link is still live, WITHOUT spending it.\n\n**Auth:** none (the unguessable token in the path is the authorisation)\n\n**Params:** path: token (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/tools/secrets/x\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "token", "in": "path", "required": true, "schema": { "type": "string" } } ] }, "post": { "tags": [ "plugin-tools" ], "summary": "Hand over the ciphertext once, then spend the view.", "description": "Hand over the ciphertext once, then spend the view.\n\n**Auth:** none (the unguessable token in the path is the authorisation; redeeming spends the secret)\n\n**Params:** path: token (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/tools/secrets/x -H 'Content-Type: application/json' -d '{}'\n```", "security": [], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "token", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: token (string); body: JSON (fields not yet documented)" } } } } } }, "/api/usb": { "get": { "tags": [ "plugin-usb" ], "summary": "List USB devices with checkout status.", "description": "List USB devices with checkout status.\n\n**Auth:** permission:usb.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/usb -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-usb" ], "summary": "Add a device (starts checked-in).", "description": "Add a device (starts checked-in).\n\n**Auth:** permission:usb.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/usb -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/usb/{device_id}": { "get": { "tags": [ "plugin-usb" ], "summary": "Get a single device plus its last 20 check-in/out log rows.", "description": "Get a single device plus its last 20 check-in/out log rows.\n\n**Auth:** permission:usb.view\n\n**Params:** path: device_id (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/usb/x -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "string" } } ] }, "put": { "tags": [ "plugin-usb" ], "summary": "Edit device_desc / device_owner / locker_location / status.", "description": "Edit device_desc / device_owner / locker_location / status.\n\n**Auth:** permission:usb.edit\n\n**Params:** path: device_id (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/usb/x -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: device_id (string); body: JSON (fields not yet documented)" } } } } } }, "/api/usb/{device_id}/checkin": { "post": { "tags": [ "plugin-usb" ], "summary": "Check a device back in from a badge.", "description": "Check a device back in from a badge.\n\n**Auth:** permission:usb.create\n\n**Params:** path: device_id (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/usb/x/checkin -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: device_id (string); body: JSON (fields not yet documented)" } } } } } }, "/api/usb/{device_id}/checkout": { "post": { "tags": [ "plugin-usb" ], "summary": "Check a device out to a badge.", "description": "Check a device out to a badge.\n\n**Auth:** permission:usb.create\n\n**Params:** path: device_id (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/usb/x/checkout -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: device_id (string); body: JSON (fields not yet documented)" } } } } } }, "/api/usb/{device_id}/history": { "get": { "tags": [ "plugin-usb" ], "summary": "Paginated check-in/out log for one device.", "description": "Paginated check-in/out log for one device.\n\n**Auth:** permission:usb.view\n\n**Params:** path: device_id (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/usb/x/history -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/usb/{device_id}/retire": { "post": { "tags": [ "plugin-usb" ], "summary": "Retire a device (status -> retired).", "description": "Retire a device (status -> retired).\n\n**Auth:** permission:usb.edit\n\n**Params:** path: device_id (string); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/usb/x/retire -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "string" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: device_id (string); body: JSON (fields not yet documented)" } } } } } }, "/api/usb/checkouts": { "get": { "tags": [ "plugin-usb" ], "summary": "List check-out log rows.", "description": "List check-out log rows.\n\n**Auth:** permission:usb.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/usb/checkouts -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/usb/checkouts/active": { "get": { "tags": [ "plugin-usb" ], "summary": "List the latest check-out log row for every currently checked-out device.", "description": "List the latest check-out log row for every currently checked-out device.\n\n**Auth:** permission:usb.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/usb/checkouts/active -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/usb/kiosk/checkin": { "post": { "tags": [ "plugin-usb" ], "summary": "Check a device in at the kiosk. Body: {device_id, badge, forsomeoneelse}.", "description": "Check a device in at the kiosk. Body: {device_id, badge, forsomeoneelse}.\n\n**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)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/usb/kiosk/checkin -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/usb/kiosk/checkout": { "post": { "tags": [ "plugin-usb" ], "summary": "Check a device out at the kiosk. Body: {device_id, badge}.", "description": "Check a device out at the kiosk. Body: {device_id, badge}.\n\n**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)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/usb/kiosk/checkout -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/usb/kiosk/device/{device_id}": { "get": { "tags": [ "plugin-usb" ], "summary": "What the kiosk shows after a device is scanned.", "description": "What the kiosk shows after a device is scanned.\n\n**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)\n\n**Params:** path: device_id (string)\n\n**Example:**\n```\ncurl http://localhost:5001/api/usb/kiosk/device/x\n```", "security": [ { "apiKeyAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "404": { "description": "No such record." } }, "parameters": [ { "name": "device_id", "in": "path", "required": true, "schema": { "type": "string" } } ] } }, "/api/usb/kiosk/others": { "post": { "tags": [ "plugin-usb" ], "summary": "Drives checked out to OTHER people, with holder names. Body: {badge}.", "description": "Drives checked out to OTHER people, with holder names. Body: {badge}.\n\n**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)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/usb/kiosk/others -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/usb/kiosk/provisioning-link": { "get": { "tags": [ "plugin-usb" ], "summary": "The URL that provisions a screen, token included, for an administrator.", "description": "The URL that provisions a screen, token included, for an administrator.\n\n**Auth:** permission:settings.edit\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/usb/kiosk/provisioning-link -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/usb/kiosk/session": { "post": { "tags": [ "plugin-usb" ], "summary": "What one badge may do right now. Body: {badge}.", "description": "What one badge may do right now. Body: {badge}.\n\n**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)\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/usb/kiosk/session -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "apiKeyAuth": [] }, {} ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/usb/kiosk/setup": { "get": { "tags": [ "plugin-usb" ], "summary": "Trade a setup code for this browser's kiosk cookie, then open the kiosk.", "description": "Trade a setup code for this browser's kiosk cookie, then open the kiosk.\n\n**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)\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/usb/kiosk/setup\n```", "security": [ { "setupCodeAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/usb/reports/audit": { "get": { "tags": [ "plugin-usb" ], "summary": "Every check-out and check-in in the window, newest first.", "description": "Every check-out and check-in in the window, newest first.\n\n**Auth:** permission:usb.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/usb/reports/audit -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/warranty": { "get": { "tags": [ "plugin-warranty" ], "summary": "List warranties. Filters: ?status=, ?assetid=, ?active=false.", "description": "List warranties. Filters: ?status=, ?assetid=, ?active=false.\n\n**Auth:** permission:warranty.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/warranty -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } }, "post": { "tags": [ "plugin-warranty" ], "summary": "UNDOCUMENTED: warranty.create_warranty has no docstring.", "description": "UNDOCUMENTED: warranty.create_warranty has no docstring.\n\n**Auth:** permission:warranty.create\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/warranty -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } }, "/api/warranty/{warrantyid}": { "delete": { "tags": [ "plugin-warranty" ], "summary": "UNDOCUMENTED: warranty.delete_warranty has no docstring.", "description": "UNDOCUMENTED: warranty.delete_warranty has no docstring.\n\n**Auth:** permission:warranty.delete\n\n**Params:** path: warrantyid (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/warranty/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "warrantyid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "get": { "tags": [ "plugin-warranty" ], "summary": "UNDOCUMENTED: warranty.get_warranty has no docstring.", "description": "UNDOCUMENTED: warranty.get_warranty has no docstring.\n\n**Auth:** permission:warranty.view\n\n**Params:** path: warrantyid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/warranty/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "warrantyid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "put": { "tags": [ "plugin-warranty" ], "summary": "UNDOCUMENTED: warranty.update_warranty has no docstring.", "description": "UNDOCUMENTED: warranty.update_warranty has no docstring.\n\n**Auth:** permission:warranty.edit\n\n**Params:** path: warrantyid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X PUT http://localhost:5001/api/warranty/1 -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "warrantyid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: warrantyid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/warranty/{warrantyid}/proof": { "delete": { "tags": [ "plugin-warranty" ], "summary": "Remove a warranty's proof document.", "description": "Remove a warranty's proof document.\n\n**Auth:** permission:warranty.edit\n\n**Params:** path: warrantyid (int)\n\n**Example:**\n```\ncurl -X DELETE http://localhost:5001/api/warranty/1/proof -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "warrantyid", "in": "path", "required": true, "schema": { "type": "integer" } } ] }, "post": { "tags": [ "plugin-warranty" ], "summary": "Upload (or replace) the proof-of-cover document for a warranty.", "description": "Upload (or replace) the proof-of-cover document for a warranty.\n\n**Auth:** permission:warranty.edit\n\n**Params:** path: warrantyid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/warranty/1/proof -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "warrantyid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: warrantyid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/warranty/{warrantyid}/refresh": { "post": { "tags": [ "plugin-warranty" ], "summary": "UNDOCUMENTED: warranty.refresh_warranty has no docstring.", "description": "UNDOCUMENTED: warranty.refresh_warranty has no docstring.\n\n**Auth:** permission:warranty.edit\n\n**Params:** path: warrantyid (int); body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/warranty/1/refresh -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "warrantyid", "in": "path", "required": true, "schema": { "type": "integer" } } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "path: warrantyid (int); body: JSON (fields not yet documented)" } } } } } }, "/api/warranty/asset/{assetid}": { "get": { "tags": [ "plugin-warranty" ], "summary": "Warranties covering one asset (for the asset-detail panel).", "description": "Warranties covering one asset (for the asset-detail panel).\n\n**Auth:** permission:warranty.view\n\n**Params:** path: assetid (int)\n\n**Example:**\n```\ncurl http://localhost:5001/api/warranty/asset/1 -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "assetid", "in": "path", "required": true, "schema": { "type": "integer" } } ] } }, "/api/warranty/dashboard/expiring": { "get": { "tags": [ "plugin-warranty" ], "summary": "Warranties running out, and ones that already have.", "description": "Warranties running out, and ones that already have.\n\n**Auth:** permission:warranty.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/warranty/dashboard/expiring -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/warranty/proof/{filename}": { "get": { "tags": [ "plugin-warranty" ], "summary": "Download a proof document.", "description": "Download a proof document.\n\n**Auth:** permission:warranty.view\n\n**Params:** path: filename (path)\n\n**Example:**\n```\ncurl http://localhost:5001/api/warranty/proof/example.png -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." }, "404": { "description": "No such record." } }, "parameters": [ { "name": "filename", "in": "path", "required": true, "schema": { "type": "string", "description": "may contain slashes" } } ] } }, "/api/warranty/report": { "get": { "tags": [ "plugin-warranty" ], "summary": "Counts + lists bucketed by derived status.", "description": "Counts + lists bucketed by derived status.\n\n**Auth:** permission:warranty.view\n\n**Params:** not documented\n\n**Example:**\n```\ncurl http://localhost:5001/api/warranty/report -H \"Authorization: Bearer $TOK\"\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } } } }, "/api/warranty/sync/dell": { "post": { "tags": [ "plugin-warranty" ], "summary": "Look up every asset serial (= Dell service tag) that has no warranty yet and create warranties for the ones Dell...", "description": "Look up every asset serial (= Dell service tag) that has no warranty yet and create warranties for the ones Dell recognizes.\n\n**Auth:** permission:warranty.edit\n\n**Params:** body: JSON (fields not yet documented)\n\n**Example:**\n```\ncurl -X POST http://localhost:5001/api/warranty/sync/dell -H \"Authorization: Bearer $TOK\" -H 'Content-Type: application/json' -d '{}'\n```", "security": [ { "bearerAuth": [] } ], "responses": { "200": { "description": "Success. Body is the success_response envelope: {status, data, meta}.", "content": { "application/json": { "$ref": "#/components/schemas/SuccessEnvelope" } } }, "default": { "description": "Error. Body is the error envelope; the code and message are nested under data.error.", "content": { "application/json": { "$ref": "#/components/schemas/ErrorEnvelope" } } }, "401": { "description": "Missing or invalid credentials." }, "403": { "description": "Authenticated, but not permitted." } }, "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true, "description": "body: JSON (fields not yet documented)" } } } } } } } }