{"info":{"_postman_id":"01266fca-c472-438f-9038-b5ad0efbbc96","name":"Homelab Manager API","description":"<html><head></head><body><p>A comprehensive REST API for managing homelab services with built-in security monitoring, vulnerability tracking, SSL certificate management, and maintenance logging.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"51755130","collectionId":"01266fca-c472-438f-9038-b5ad0efbbc96","publishedId":"2sBXcAJhzM","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-02-10T21:36:28.000Z"},"item":[{"name":"Authentication","item":[{"name":"Get authenticated user","event":[{"listen":"test","script":{"id":"2997bb5f-e06f-41c5-baf0-4a13695a7470","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"d259b9d6-6b91-4c1e-ba68-5dc5ffc958ae","request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"GET","header":[],"url":"http://localhost:3000/api/auth/me","description":"<p>Gets information about the authenticated user.</p>\n","urlObject":{"protocol":"http","port":"3000","path":["api","auth","me"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"29f0b080-f095-4cf6-b8d8-c0097fa31a4d","name":"Successful Response","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/auth/me"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"81"},{"key":"RateLimit-Reset","value":"139"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"343"},{"key":"ETag","value":"W/\"157-ypIF1GIdwxChl1o4eT6ws8KzlKY\""},{"key":"Date","value":"Tue, 10 Feb 2026 18:50:29 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Profile retrieved successfully\",\n    \"data\": {\n        \"id\": 1,\n        \"username\": \"johndoe\",\n        \"email\": \"john@example.com\",\n        \"role\": \"user\",\n        \"first_name\": \"John\",\n        \"last_name\": \"Doe\",\n        \"notification_preferences\": {\n            \"email\": true,\n            \"ssl_expiry\": true,\n            \"vulnerability_alerts\": true\n        },\n        \"created_at\": \"2026-02-10T18:38:21.209Z\",\n        \"updated_at\": \"2026-02-10T18:38:21.209Z\"\n    }\n}"},{"id":"f94e33ad-ab1a-413c-8cdc-9830563535c5","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/auth/me"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"94"},{"key":"RateLimit-Reset","value":"475"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"54"},{"key":"ETag","value":"W/\"36-XkHl1Guvb0KdrO6Rz4iFFxNNcL4\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:01:00 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Invalid or expired token\"\n}"}],"_postman_id":"d259b9d6-6b91-4c1e-ba68-5dc5ffc958ae"},{"name":"Register User","id":"79e46b69-b60f-4778-87b5-d765e46e0ba1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"username\": \"johndoe\",\r\n  \"email\": \"john@example.com\",\r\n  \"password\": \"Password123!\",\r\n  \"first_name\": \"John\",\r\n  \"last_name\": \"Doe\",\r\n  \"role\": \"user\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/auth/register","description":"<p>Creates a new user account and returns an initial access token and user profile.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"023b8f36-5ac4-494d-8bf3-ae5105d00dda","id":"023b8f36-5ac4-494d-8bf3-ae5105d00dda","name":"Authentication","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","auth","register"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"9b55d2e4-cbf1-4823-9e27-dbe3e2fe8cc0","name":"Successful Response","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"username\": \"johndoe\",\r\n  \"email\": \"john@example.com\",\r\n  \"password\": \"Password123!\",\r\n  \"first_name\": \"John\",\r\n  \"last_name\": \"Doe\",\r\n  \"role\": \"user\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/auth/register"},"status":"Created","code":201,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"5;w=900"},{"key":"RateLimit-Limit","value":"5"},{"key":"RateLimit-Remaining","value":"4"},{"key":"RateLimit-Reset","value":"900"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"545"},{"key":"ETag","value":"W/\"221-UQhDC0AvFNrNf2Hahm31RngmUgE\""},{"key":"Date","value":"Tue, 10 Feb 2026 18:38:21 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"User registered successfully\",\n    \"data\": {\n        \"user\": {\n            \"notification_preferences\": {\n                \"email\": true,\n                \"ssl_expiry\": true,\n                \"vulnerability_alerts\": true\n            },\n            \"id\": 1,\n            \"username\": \"johndoe\",\n            \"email\": \"john@example.com\",\n            \"first_name\": \"John\",\n            \"last_name\": \"Doe\",\n            \"role\": \"user\",\n            \"updated_at\": \"2026-02-10T18:38:21.209Z\",\n            \"created_at\": \"2026-02-10T18:38:21.209Z\"\n        },\n        \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJqb2huZG9lIiwicm9sZSI6InVzZXIiLCJpYXQiOjE3NzA3NDg3MDEsImV4cCI6MTc3MDgzNTEwMX0.Z4RGZyJ8zH_-MwR9YIVEqQ5-xdPx2UBpkcq36reINeo\"\n    }\n}"},{"id":"7707750d-83fd-4d62-b770-cf148285e7cd","name":"409 Conflict","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"username\": \"johndoe\",\r\n  \"email\": \"john@example.com\",\r\n  \"password\": \"Password123!\",\r\n  \"first_name\": \"John\",\r\n  \"last_name\": \"Doe\",\r\n  \"role\": \"user\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/auth/register"},"status":"Conflict","code":409,"_postman_previewlanguage":"json","header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"5;w=900"},{"key":"RateLimit-Limit","value":"5"},{"key":"RateLimit-Remaining","value":"4"},{"key":"RateLimit-Reset","value":"900"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"62"},{"key":"ETag","value":"W/\"3e-KxSg5m4Q6f7Yp4nDJWHbtU7V6NQ\""},{"key":"Date","value":"Tue, 10 Feb 2026 18:57:11 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Username or email already exists\"\n}"},{"id":"b411fbc6-5031-4da7-a58c-5b1422b1fdcd","name":"400 Bad Request","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"username\": \"alex\",\r\n  \"email\": \"alex@example.com\",\r\n  \"password\": \"password123\",\r\n  \"first_name\": \"Alex\",\r\n  \"last_name\": \"Joe\",\r\n  \"role\": \"user\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/auth/register"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"5;w=900"},{"key":"RateLimit-Limit","value":"5"},{"key":"RateLimit-Remaining","value":"2"},{"key":"RateLimit-Reset","value":"849"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-B/cJsn9vJjDqYNQ21s4OWJ5Uj6M\""},{"key":"Date","value":"Tue, 10 Feb 2026 18:58:02 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Validation failed\"\n}"},{"id":"bd844858-2b7a-4221-91d1-1558ebee15d7","name":"429 Too Many Requests","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"username\": \"johndoe\",\r\n  \"email\": \"john@example.com\",\r\n  \"password\": \"Password123!\",\r\n  \"first_name\": \"John\",\r\n  \"last_name\": \"Doe\",\r\n  \"role\": \"user\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/auth/register"},"status":"Too Many Requests","code":429,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"5;w=900"},{"key":"RateLimit-Limit","value":"5"},{"key":"RateLimit-Remaining","value":"0"},{"key":"RateLimit-Reset","value":"258"},{"key":"Retry-After","value":"258"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"86"},{"key":"ETag","value":"W/\"56-0MF0sHJPqAbmUDOpZGYRcjYLxSs\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:07:53 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Too many authentication attempts, please try again later\"\n}"}],"_postman_id":"79e46b69-b60f-4778-87b5-d765e46e0ba1"},{"name":"Login User","id":"f4bae7ee-5cd1-4247-afa7-ca1c64f06b04","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"identifier\": \"johndoe\",\r\n  \"password\": \"Password123!\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/auth/login","description":"<p>Validates user credentials and issues a JWT for authenticating subsequent requests.</p>\n","urlObject":{"protocol":"http","port":"3000","path":["api","auth","login"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"9cd7967c-18dd-4c90-a1a8-56d31eb337b8","name":"Successful Response","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"identifier\": \"johndoe\",\r\n  \"password\": \"Password123!\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/auth/login"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"5;w=900"},{"key":"RateLimit-Limit","value":"5"},{"key":"RateLimit-Remaining","value":"2"},{"key":"RateLimit-Reset","value":"698"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"533"},{"key":"ETag","value":"W/\"215-VzeL9BLQuJzxucRbld4trwuDdSM\""},{"key":"Date","value":"Tue, 10 Feb 2026 18:41:44 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Login successful\",\n    \"data\": {\n        \"user\": {\n            \"id\": 1,\n            \"username\": \"johndoe\",\n            \"email\": \"john@example.com\",\n            \"role\": \"user\",\n            \"first_name\": \"John\",\n            \"last_name\": \"Doe\",\n            \"notification_preferences\": {\n                \"email\": true,\n                \"ssl_expiry\": true,\n                \"vulnerability_alerts\": true\n            },\n            \"created_at\": \"2026-02-10T18:38:21.209Z\",\n            \"updated_at\": \"2026-02-10T18:38:21.209Z\"\n        },\n        \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJqb2huZG9lIiwicm9sZSI6InVzZXIiLCJpYXQiOjE3NzA3NDg5MDQsImV4cCI6MTc3MDgzNTMwNH0.s_VdmapRHnNqKqPEgbZCINY6_sYKB0U5fji4F8tMg4k\"\n    }\n}"},{"id":"6c9f34cc-fa86-4671-8234-3241f91f47f5","name":"401 Unauthorized","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"identifier\": \"johndoe\",\r\n  \"password\": \"Password12!\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/auth/login"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"json","header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"5;w=900"},{"key":"RateLimit-Limit","value":"5"},{"key":"RateLimit-Remaining","value":"0"},{"key":"RateLimit-Reset","value":"485"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"49"},{"key":"ETag","value":"W/\"31-VmptvJVCxgMiCaKMQdd9IkNBIdc\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:04:07 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Invalid credentials\"\n}"},{"id":"f9806219-6961-4be6-9c5e-29b31a75d3f1","name":"429 Too Many Requests","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"identifier\": \"johndoe\",\r\n  \"password\": \"Password123!\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/auth/login"},"status":"Too Many Requests","code":429,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"5;w=900"},{"key":"RateLimit-Limit","value":"5"},{"key":"RateLimit-Remaining","value":"0"},{"key":"RateLimit-Reset","value":"323"},{"key":"Retry-After","value":"323"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"86"},{"key":"ETag","value":"W/\"56-0MF0sHJPqAbmUDOpZGYRcjYLxSs\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:06:48 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Too many authentication attempts, please try again later\"\n}"}],"_postman_id":"f4bae7ee-5cd1-4247-afa7-ca1c64f06b04"},{"name":"Logout User","id":"886732fe-9645-429e-a68a-f3a438a5b86b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"http://localhost:3000/api/auth/logout","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"023b8f36-5ac4-494d-8bf3-ae5105d00dda","id":"023b8f36-5ac4-494d-8bf3-ae5105d00dda","name":"Authentication","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","auth","logout"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"1e5f4e47-ea2b-4ea7-ae25-c4f49a3cb3c2","name":"Successful Response","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"identifier\": \"johndoe\",\r\n  \"password\": \"Password123!\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/auth/logout"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"88"},{"key":"RateLimit-Reset","value":"18"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"58"},{"key":"ETag","value":"W/\"3a-kIyl+vW0tmSGZfZAOmXa0WW/lb4\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:08:37 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Logout successful\",\n    \"data\": null\n}"},{"id":"cbfee35a-170f-4310-9310-faa8d5ec267f","name":"401 Unauthorized","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"identifier\": \"johndoe\",\r\n  \"password\": \"Password123!\"\r\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/auth/logout"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"90"},{"key":"RateLimit-Reset","value":"95"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"54"},{"key":"ETag","value":"W/\"36-XkHl1Guvb0KdrO6Rz4iFFxNNcL4\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:07:20 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Invalid or expired token\"\n}"}],"_postman_id":"886732fe-9645-429e-a68a-f3a438a5b86b"}],"id":"023b8f36-5ac4-494d-8bf3-ae5105d00dda","description":"<p>The <code>/auth</code> endpoint lets you register, log-in, view information about logged-in user and log out.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"1f90f9aa-c4a4-4379-be65-d3c82ad4e3d4","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"be0b69d5-2964-4099-a671-2073673ed076","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"023b8f36-5ac4-494d-8bf3-ae5105d00dda"},{"name":"Services","item":[{"name":"Get all services","id":"cf92fbd3-6ed2-445d-ab33-ef795ac3a076","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"GET","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services","description":"<p>Retrieves all services with optional filtering by type, status, and public facing status</p>\n","urlObject":{"protocol":"http","port":"3000","path":["api","services"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"87dbce3c-755c-4232-b605-0fc8b8df57a5","name":"Successful Response","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJqb2huZG9lIiwicm9sZSI6InVzZXIiLCJpYXQiOjE3NzA3NTEwOTMsImV4cCI6MTc3MDgzNzQ5M30.RJNcG6cUnZUKGqrvD2oW7XrIaXMxkbuGG7uqJOHiXW8"}],"body":{"mode":"raw","raw":""},"url":"http://localhost:3000/api/services"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJqb2huZG9lIiwicm9sZSI6InVzZXIiLCJpYXQiOjE3NzA3NTEwOTMsImV4cCI6MTc3MDgzNzQ5M30.RJNcG6cUnZUKGqrvD2oW7XrIaXMxkbuGG7uqJOHiXW8","description":"","enabled":true}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"message\":\"Services retrieved successfully\",\"data\":[]}"},{"id":"63e4a033-9b93-4370-b02f-37acd7a76851","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"89"},{"key":"RateLimit-Reset","value":"216"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"54"},{"key":"ETag","value":"W/\"36-XkHl1Guvb0KdrO6Rz4iFFxNNcL4\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:29:37 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Invalid or expired token\"\n}"}],"_postman_id":"cf92fbd3-6ed2-445d-ab33-ef795ac3a076"},{"name":"Get service by ID","id":"fcc41c95-a3cb-49f4-b433-fce9168df631","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"GET","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services/:id","description":"<p>Retrieves full configuration details, resource allocation, and linked metadata for a specific service.</p>\n","urlObject":{"protocol":"http","port":"3000","path":["api","services",":id"],"host":["localhost"],"query":[],"variable":[{"type":"any","value":"","key":"id"}]}},"response":[{"id":"68226cc8-dbf4-445e-be3b-3d18f3828bc7","name":"Successful Response","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services/1"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"92"},{"key":"RateLimit-Reset","value":"421"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"721"},{"key":"ETag","value":"W/\"2d1-gwYJUzEkcOF/vgAAW6KJYdH+Cxg\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:26:12 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Service retrieved successfully\",\n    \"data\": {\n        \"id\": 1,\n        \"user_id\": 1,\n        \"service_name\": \"Nextcloud\",\n        \"service_type\": \"storage\",\n        \"description\": \"Self-hosted cloud storage\",\n        \"url\": \"https://cloud.homelab.local\",\n        \"port\": 443,\n        \"internal_ip\": \"192.168.1.100\",\n        \"docker_container_name\": \"nextcloud\",\n        \"docker_image\": \"nextcloud:latest\",\n        \"cores_allocated\": null,\n        \"ram_allocated\": 2048,\n        \"status\": \"running\",\n        \"uptime_percentage\": null,\n        \"last_health_check\": null,\n        \"public_facing\": true,\n        \"authentication_method\": \"LDAP\",\n        \"security_score\": 85,\n        \"created_at\": \"2026-02-10T19:25:16.570Z\",\n        \"updated_at\": \"2026-02-10T19:25:16.570Z\",\n        \"owner\": {\n            \"id\": 1,\n            \"username\": \"johndoe\",\n            \"email\": \"john@example.com\"\n        },\n        \"vulnerabilities\": [],\n        \"sslCertificates\": [],\n        \"maintenanceLogs\": []\n    }\n}"},{"id":"c5365cc5-30e6-4750-8c33-4e1c51b07fa9","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services/1"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"90"},{"key":"RateLimit-Reset","value":"281"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"54"},{"key":"ETag","value":"W/\"36-XkHl1Guvb0KdrO6Rz4iFFxNNcL4\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:28:32 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Invalid or expired token\"\n}"},{"id":"ef96d49b-6192-4cce-9d48-58de2acd1949","name":"404 Not Found","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services/9999"},"status":"Not Found","code":404,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"91"},{"key":"RateLimit-Reset","value":"374"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-+fJtozSbopR9LmOFeQqevi/1GzU\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:26:59 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Service not found\"\n}"}],"_postman_id":"fcc41c95-a3cb-49f4-b433-fce9168df631"},{"name":"Create a new service","id":"6e1152ee-0c15-4362-a9b1-7c2267caf516","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"POST","header":[{"key":"Authorization","value":"Bearer {{token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"service_name\": \"Nextcloud\",\n  \"service_type\": \"storage\",\n  \"description\": \"Self-hosted cloud storage\",\n  \"url\": \"https://cloud.homelab.local\",\n  \"port\": 443,\n  \"internal_ip\": \"192.168.1.100\",\n  \"docker_container_name\": \"nextcloud\",\n  \"docker_image\": \"nextcloud:latest\",\n  \"cpu_allocated\": 2.0,\n  \"ram_allocated\": 2048,\n  \"status\": \"running\",\n  \"public_facing\": true,\n  \"authentication_method\": \"LDAP\",\n  \"security_score\": 85\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/services","description":"<p>Registers a new service in the system with its technical specifications and initial status.</p>\n","urlObject":{"protocol":"http","port":"3000","path":["api","services"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"684eedc0-7a90-4844-b24e-c87c05cf6258","name":"Successful Response","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"service_name\": \"Nextcloud\",\n  \"service_type\": \"storage\",\n  \"description\": \"Self-hosted cloud storage\",\n  \"url\": \"https://cloud.homelab.local\",\n  \"port\": 443,\n  \"internal_ip\": \"192.168.1.100\",\n  \"docker_container_name\": \"nextcloud\",\n  \"docker_image\": \"nextcloud:latest\",\n  \"cpu_allocated\": 2.0,\n  \"ram_allocated\": 2048,\n  \"status\": \"running\",\n  \"public_facing\": true,\n  \"authentication_method\": \"LDAP\",\n  \"security_score\": 85\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/services"},"status":"Created","code":201,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"99"},{"key":"RateLimit-Reset","value":"900"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"591"},{"key":"ETag","value":"W/\"24f-uK6bXegHCt+y5a/gGRbmHnYliFM\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:33:14 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Service created successfully\",\n    \"data\": {\n        \"id\": 2,\n        \"service_name\": \"Nextcloud\",\n        \"service_type\": \"storage\",\n        \"description\": \"Self-hosted cloud storage\",\n        \"url\": \"https://cloud.homelab.local\",\n        \"port\": 443,\n        \"internal_ip\": \"192.168.1.100\",\n        \"docker_container_name\": \"nextcloud\",\n        \"docker_image\": \"nextcloud:latest\",\n        \"ram_allocated\": 2048,\n        \"status\": \"running\",\n        \"public_facing\": true,\n        \"authentication_method\": \"LDAP\",\n        \"security_score\": 85,\n        \"user_id\": 1,\n        \"updated_at\": \"2026-02-10T19:33:14.855Z\",\n        \"created_at\": \"2026-02-10T19:33:14.855Z\",\n        \"cores_allocated\": null,\n        \"uptime_percentage\": null,\n        \"last_health_check\": null\n    }\n}"},{"id":"3405c8b9-1358-4543-818d-81539a7f3827","name":"400 Bad Request","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"service_type\": \"storage\",\n  \"description\": \"Self-hosted cloud storage\",\n  \"url\": \"https://cloud.homelab.local\",\n  \"port\": 443,\n  \"internal_ip\": \"192.168.1.100\",\n  \"docker_container_name\": \"nextcloud\",\n  \"docker_image\": \"nextcloud:latest\",\n  \"cpu_allocated\": 2.0,\n  \"ram_allocated\": 2048,\n  \"status\": \"running\",\n  \"public_facing\": true,\n  \"authentication_method\": \"LDAP\",\n  \"security_score\": 85\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/services"},"status":"Bad Request","code":400,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"98"},{"key":"RateLimit-Reset","value":"827"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-B/cJsn9vJjDqYNQ21s4OWJ5Uj6M\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:34:28 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Validation failed\"\n}"},{"id":"d2e965db-e88e-4a60-bf24-00a5d26c4af9","name":"401 Unauthorized","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"service_type\": \"storage\",\n  \"description\": \"Self-hosted cloud storage\",\n  \"url\": \"https://cloud.homelab.local\",\n  \"port\": 443,\n  \"internal_ip\": \"192.168.1.100\",\n  \"docker_container_name\": \"nextcloud\",\n  \"docker_image\": \"nextcloud:latest\",\n  \"cpu_allocated\": 2.0,\n  \"ram_allocated\": 2048,\n  \"status\": \"running\",\n  \"public_facing\": true,\n  \"authentication_method\": \"LDAP\",\n  \"security_score\": 85\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/services"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"97"},{"key":"RateLimit-Reset","value":"792"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"54"},{"key":"ETag","value":"W/\"36-XkHl1Guvb0KdrO6Rz4iFFxNNcL4\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:35:03 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Invalid or expired token\"\n}"}],"_postman_id":"6e1152ee-0c15-4362-a9b1-7c2267caf516"},{"name":"Update a service","id":"04561ef9-61d3-45c7-aee5-389478420ed1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"status\": \"maintenance\",\n  \"security_score\": 90,\n  \"uptime_percentage\": 99.9\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/services/:id","description":"<p>Modifies specific fields of an existing service, such as status, security scores, or resource limits.</p>\n","urlObject":{"protocol":"http","port":"3000","path":["api","services",":id"],"host":["localhost"],"query":[],"variable":[{"type":"any","value":"","key":"id"}]}},"response":[{"id":"be916ba1-e072-45cc-afb4-44326ff7d064","name":"Successful Response","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"status\": \"maintenance\",\n  \"security_score\": 90,\n  \"uptime_percentage\": 99.9\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/services/3"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"92"},{"key":"RateLimit-Reset","value":"620"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"595"},{"key":"ETag","value":"W/\"253-kf6ftiQ1ahvG6ntlFNb3pWtV1Ik\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:37:55 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Service updated successfully\",\n    \"data\": {\n        \"id\": 3,\n        \"user_id\": 1,\n        \"service_name\": \"Nextcloud\",\n        \"service_type\": \"storage\",\n        \"description\": \"Self-hosted cloud storage\",\n        \"url\": \"https://cloud.homelab.local\",\n        \"port\": 443,\n        \"internal_ip\": \"192.168.1.100\",\n        \"docker_container_name\": \"nextcloud\",\n        \"docker_image\": \"nextcloud:latest\",\n        \"cores_allocated\": null,\n        \"ram_allocated\": 2048,\n        \"status\": \"maintenance\",\n        \"uptime_percentage\": 99.9,\n        \"last_health_check\": null,\n        \"public_facing\": true,\n        \"authentication_method\": \"LDAP\",\n        \"security_score\": 90,\n        \"created_at\": \"2026-02-10T19:37:30.527Z\",\n        \"updated_at\": \"2026-02-10T19:37:55.675Z\"\n    }\n}"},{"id":"a42abe80-42e4-4d21-b838-f912ff126cb3","name":"400 Bad Request","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    a\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/services/2"},"status":"Bad Request","code":400,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"69"},{"key":"RateLimit-Reset","value":"40"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"99"},{"key":"ETag","value":"W/\"63-yzOyRqKO1oPF8ahBAK/4xVeZD9I\""},{"key":"Date","value":"Tue, 10 Feb 2026 21:07:01 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Expected property name or '}' in JSON at position 6 (line 2 column 5)\"\n}"},{"id":"cee63359-7026-4fa5-82f5-d328738d4458","name":"401 Unauthorized","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"status\": \"maintenance\",\n  \"security_score\": 90,\n  \"uptime_percentage\": 99.9\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/services/3"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"91"},{"key":"RateLimit-Reset","value":"586"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"54"},{"key":"ETag","value":"W/\"36-XkHl1Guvb0KdrO6Rz4iFFxNNcL4\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:38:29 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Invalid or expired token\"\n}"},{"id":"27d1db1d-c67f-49a9-aaa4-683ece2d5329","name":"404 Not Found","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"status\": \"maintenance\",\n  \"security_score\": 90,\n  \"uptime_percentage\": 99.9\n}","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/api/services/9999"},"status":"Not Found","code":404,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"95"},{"key":"RateLimit-Reset","value":"708"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-+fJtozSbopR9LmOFeQqevi/1GzU\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:36:27 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Service not found\"\n}"}],"_postman_id":"04561ef9-61d3-45c7-aee5-389478420ed1"},{"name":"Delete a service","id":"de16787c-26d3-43bd-b32b-5a6307295ae6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services/:id","description":"<p>Permanently removes a service and its associated data from the management console.</p>\n","urlObject":{"protocol":"http","port":"3000","path":["api","services",":id"],"host":["localhost"],"query":[],"variable":[{"type":"any","value":"","key":"id"}]}},"response":[{"id":"b206baf3-739d-4d0c-81f7-45f79a3327f9","name":"Successful Response","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services/1"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"86"},{"key":"RateLimit-Reset","value":"94"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"69"},{"key":"ETag","value":"W/\"45-hq8m2AeVDIt9zVAuKbbFyg45/AI\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:31:40 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Service deleted successfully\",\n    \"data\": null\n}"},{"id":"d73fee6d-6005-4918-83a4-1233a4bf0263","name":"401 Unauthorized","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services/9999"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"90"},{"key":"RateLimit-Reset","value":"444"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"54"},{"key":"ETag","value":"W/\"36-XkHl1Guvb0KdrO6Rz4iFFxNNcL4\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:40:51 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Invalid or expired token\"\n}"},{"id":"4fb014e1-66e2-4ec2-98e3-682f3393a9ea","name":"404 Not Found","originalRequest":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services/9999"},"status":"Not Found","code":404,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"84"},{"key":"RateLimit-Reset","value":"36"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-+fJtozSbopR9LmOFeQqevi/1GzU\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:32:38 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Service not found\"\n}"}],"_postman_id":"de16787c-26d3-43bd-b32b-5a6307295ae6"},{"name":"Get service statistics","id":"08745118-fdf0-4d36-8ab3-9ec206d3e543","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services/stats","description":"<p>Returns an aggregated overview of the total service count categorized by status and visibility.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"b529f8a4-b083-4196-9edb-ab350c2d072d","id":"b529f8a4-b083-4196-9edb-ab350c2d072d","name":"Services","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","services","stats"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"e7820147-de96-49d6-ac32-93aaeff64b5b","name":"Successful Response","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services/stats"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"88"},{"key":"RateLimit-Reset","value":"345"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"183"},{"key":"ETag","value":"W/\"b7-7/9o1MP43at6yEY9iJSrklPv/JU\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:42:30 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Service statistics retrieved successfully\",\n    \"data\": {\n        \"total\": 2,\n        \"by_status\": {\n            \"running\": 1,\n            \"stopped\": 0,\n            \"error\": 0,\n            \"maintenance\": 1\n        },\n        \"public_facing\": 2,\n        \"private\": 0\n    }\n}"},{"id":"a95cc71b-0e4a-4f9c-bccb-09e6ae7455a7","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{token}}"}],"url":"http://localhost:3000/api/services/stats"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"87"},{"key":"RateLimit-Reset","value":"310"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"54"},{"key":"ETag","value":"W/\"36-XkHl1Guvb0KdrO6Rz4iFFxNNcL4\""},{"key":"Date","value":"Tue, 10 Feb 2026 19:43:04 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Invalid or expired token\"\n}"}],"_postman_id":"08745118-fdf0-4d36-8ab3-9ec206d3e543"}],"id":"b529f8a4-b083-4196-9edb-ab350c2d072d","description":"<p>The <code>/services</code> endpoint allows you to catalog and manage your homelab applications, track their operational status, monitor resource allocation, and view aggregated health statistics across your infrastructure.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"f50d6f84-8656-4ab8-91f6-8f0d1d5da9d9","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"8a6a959e-632b-4e82-be91-f9e6ea43bc2e","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"b529f8a4-b083-4196-9edb-ab350c2d072d"},{"name":"Maintenance","item":[{"name":"Get all maintenance logs","event":[{"listen":"test","script":{"id":"c2af7896-9b66-4fac-a014-6fa27502aaaf","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"d579fc09-bfd5-43bb-ae64-6d56f27ffebf","request":{"method":"GET","header":[],"url":"http://localhost:3000/api/maintenance-logs","description":"<p>Retrieves a history of maintenance activities with optional filtering by service, type, or success.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"883ad575-b983-4156-814c-274426927fe5","id":"883ad575-b983-4156-814c-274426927fe5","name":"Maintenance","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","maintenance-logs"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"554bef79-b690-4621-b8d6-65edb5730ea0","name":"Successful Response","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/maintenance-logs"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"94"},{"key":"RateLimit-Reset","value":"732"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"1045"},{"key":"ETag","value":"W/\"415-be4RASzI+dPMnO62omTi0iPuR4g\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:32:18 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Maintenance logs retrieved successfully\",\n    \"data\": [\n        {\n            \"id\": 1,\n            \"service_id\": 2,\n            \"performed_by_user_id\": 1,\n            \"maintenance_date\": \"2024-02-05T10:00:00.000Z\",\n            \"maintenance_type\": \"Security Patch\",\n            \"title\": \"Applied critical security update\",\n            \"description\": \"Updated service to patch CVE-2024-1234\",\n            \"downtime_minutes\": 10,\n            \"version_before\": \"1.0.0\",\n            \"version_after\": \"1.0.1\",\n            \"success\": true,\n            \"notes\": \"No issues during update\",\n            \"created_at\": \"2026-02-10T20:31:17.610Z\",\n            \"service\": {\n                \"id\": 2,\n                \"user_id\": 1,\n                \"service_name\": \"Nextcloud\",\n                \"service_type\": \"storage\",\n                \"description\": \"Self-hosted cloud storage\",\n                \"url\": \"https://cloud.homelab.local\",\n                \"port\": 443,\n                \"internal_ip\": \"192.168.1.100\",\n                \"docker_container_name\": \"nextcloud\",\n                \"docker_image\": \"nextcloud:latest\",\n                \"cores_allocated\": null,\n                \"ram_allocated\": 2048,\n                \"status\": \"running\",\n                \"uptime_percentage\": null,\n                \"last_health_check\": null,\n                \"public_facing\": true,\n                \"authentication_method\": \"LDAP\",\n                \"security_score\": 85,\n                \"created_at\": \"2026-02-10T19:33:14.855Z\",\n                \"updated_at\": \"2026-02-10T19:33:14.855Z\"\n            },\n            \"performer\": {\n                \"id\": 1,\n                \"username\": \"johndoe\"\n            }\n        }\n    ]\n}"},{"id":"d3f92f0e-da01-44fd-8e1b-7968ec05945f","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/maintenance-logs"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"85"},{"key":"RateLimit-Reset","value":"389"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:38:02 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"}],"_postman_id":"d579fc09-bfd5-43bb-ae64-6d56f27ffebf"},{"name":"Get maintenance log by ID","event":[{"listen":"test","script":{"id":"7609b224-c868-4652-84d6-843a4728b306","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"41011976-20ed-4777-8595-1c4644d5c6b6","request":{"method":"GET","header":[],"url":"http://localhost:3000/api/maintenance-logs/:id","description":"<p>Retrieves the full details of a specific maintenance event, including version changes and notes.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"883ad575-b983-4156-814c-274426927fe5","id":"883ad575-b983-4156-814c-274426927fe5","name":"Maintenance","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","maintenance-logs",":id"],"host":["localhost"],"query":[],"variable":[{"type":"any","value":"","key":"id"}]}},"response":[{"id":"f0ff9bdf-b500-48b8-be7c-7fe307450e95","name":"Successful Response","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/maintenance-logs/1"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"95"},{"key":"RateLimit-Reset","value":"769"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"1042"},{"key":"ETag","value":"W/\"412-sAQ/BQ6IkshO7Q7tx2uhH70RloM\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:31:41 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Maintenance log retrieved successfully\",\n    \"data\": {\n        \"id\": 1,\n        \"service_id\": 2,\n        \"performed_by_user_id\": 1,\n        \"maintenance_date\": \"2024-02-05T10:00:00.000Z\",\n        \"maintenance_type\": \"Security Patch\",\n        \"title\": \"Applied critical security update\",\n        \"description\": \"Updated service to patch CVE-2024-1234\",\n        \"downtime_minutes\": 10,\n        \"version_before\": \"1.0.0\",\n        \"version_after\": \"1.0.1\",\n        \"success\": true,\n        \"notes\": \"No issues during update\",\n        \"created_at\": \"2026-02-10T20:31:17.610Z\",\n        \"service\": {\n            \"id\": 2,\n            \"user_id\": 1,\n            \"service_name\": \"Nextcloud\",\n            \"service_type\": \"storage\",\n            \"description\": \"Self-hosted cloud storage\",\n            \"url\": \"https://cloud.homelab.local\",\n            \"port\": 443,\n            \"internal_ip\": \"192.168.1.100\",\n            \"docker_container_name\": \"nextcloud\",\n            \"docker_image\": \"nextcloud:latest\",\n            \"cores_allocated\": null,\n            \"ram_allocated\": 2048,\n            \"status\": \"running\",\n            \"uptime_percentage\": null,\n            \"last_health_check\": null,\n            \"public_facing\": true,\n            \"authentication_method\": \"LDAP\",\n            \"security_score\": 85,\n            \"created_at\": \"2026-02-10T19:33:14.855Z\",\n            \"updated_at\": \"2026-02-10T19:33:14.855Z\"\n        },\n        \"performer\": {\n            \"id\": 1,\n            \"username\": \"johndoe\"\n        }\n    }\n}"},{"id":"a8bc4de2-dd1b-456d-b72e-e03c951fd9ef","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/maintenance-logs/9999"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"86"},{"key":"RateLimit-Reset","value":"459"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:36:51 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"},{"id":"35b6dc6b-485c-44d2-8991-6c8caf9d123a","name":"404 Not Found","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/maintenance-logs/9999"},"status":"Not Found","code":404,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"87"},{"key":"RateLimit-Reset","value":"475"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"55"},{"key":"ETag","value":"W/\"37-w/X43DpK6fmwTYHiDfAbPh0hYtw\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:36:36 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Maintenance log not found\"\n}"}],"_postman_id":"41011976-20ed-4777-8595-1c4644d5c6b6"},{"name":"Create maintenace log","event":[{"listen":"test","script":{"id":"135355b9-fa5b-44dd-9fb6-82a2e0077b05","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"a75238c8-e030-4a12-8df2-f89f7edc18a9","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"service_id\": 2,\n  \"maintenance_date\": \"2024-02-05T10:00:00Z\",\n  \"maintenance_type\": \"Security Patch\",\n  \"title\": \"Applied critical security update\",\n  \"description\": \"Updated service to patch CVE-2024-1234\",\n  \"downtime_minutes\": 10,\n  \"version_before\": \"1.0.0\",\n  \"version_after\": \"1.0.1\",\n  \"success\": true,\n  \"notes\": \"No issues during update\"\n}"},"url":"http://localhost:3000/api/maintenance-logs","description":"<p>Records a new maintenance event to track updates, patches, or downtime for a specific service.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"883ad575-b983-4156-814c-274426927fe5","id":"883ad575-b983-4156-814c-274426927fe5","name":"Maintenance","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","maintenance-logs"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"d12a0814-a797-4687-9ebb-cd059e3a4cef","name":"Successful Response","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"service_id\": 2,\n  \"maintenance_date\": \"2024-02-05T10:00:00Z\",\n  \"maintenance_type\": \"Security Patch\",\n  \"title\": \"Applied critical security update\",\n  \"description\": \"Updated service to patch CVE-2024-1234\",\n  \"downtime_minutes\": 10,\n  \"version_before\": \"1.0.0\",\n  \"version_after\": \"1.0.1\",\n  \"success\": true,\n  \"notes\": \"No issues during update\"\n}"},"url":"http://localhost:3000/api/maintenance-logs"},"status":"Created","code":201,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"96"},{"key":"RateLimit-Reset","value":"794"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"998"},{"key":"ETag","value":"W/\"3e6-J79dJ1YdlO/dW77RIfLC2Cq4iyw\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:31:17 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Maintenance log created successfully\",\n    \"data\": {\n        \"id\": 1,\n        \"service_id\": 2,\n        \"performed_by_user_id\": 1,\n        \"maintenance_date\": \"2024-02-05T10:00:00.000Z\",\n        \"maintenance_type\": \"Security Patch\",\n        \"title\": \"Applied critical security update\",\n        \"description\": \"Updated service to patch CVE-2024-1234\",\n        \"downtime_minutes\": 10,\n        \"version_before\": \"1.0.0\",\n        \"version_after\": \"1.0.1\",\n        \"success\": true,\n        \"notes\": \"No issues during update\",\n        \"created_at\": \"2026-02-10T20:31:17.610Z\",\n        \"service\": {\n            \"id\": 2,\n            \"user_id\": 1,\n            \"service_name\": \"Nextcloud\",\n            \"service_type\": \"storage\",\n            \"description\": \"Self-hosted cloud storage\",\n            \"url\": \"https://cloud.homelab.local\",\n            \"port\": 443,\n            \"internal_ip\": \"192.168.1.100\",\n            \"docker_container_name\": \"nextcloud\",\n            \"docker_image\": \"nextcloud:latest\",\n            \"cores_allocated\": null,\n            \"ram_allocated\": 2048,\n            \"status\": \"running\",\n            \"uptime_percentage\": null,\n            \"last_health_check\": null,\n            \"public_facing\": true,\n            \"authentication_method\": \"LDAP\",\n            \"security_score\": 85,\n            \"created_at\": \"2026-02-10T19:33:14.855Z\",\n            \"updated_at\": \"2026-02-10T19:33:14.855Z\"\n        }\n    }\n}"},{"id":"288e67b4-8a10-4130-95a0-8332a2ec532a","name":"400 Bad Request","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"maintenance_date\": \"2024-02-05T10:00:00Z\",\n  \"maintenance_type\": \"Security Patch\",\n  \"title\": \"Applied critical security update\",\n  \"description\": \"Updated service to patch CVE-2024-1234\",\n  \"downtime_minutes\": 10,\n  \"version_before\": \"1.0.0\",\n  \"version_after\": \"1.0.1\",\n  \"success\": true,\n  \"notes\": \"No issues during update\"\n}"},"url":"http://localhost:3000/api/maintenance-logs"},"status":"Bad Request","code":400,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"89"},{"key":"RateLimit-Reset","value":"532"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-B/cJsn9vJjDqYNQ21s4OWJ5Uj6M\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:35:39 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Validation failed\"\n}"},{"id":"27d20665-be0b-4b1f-9fa8-9449510dc09b","name":"401 Unauthorized","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"maintenance_date\": \"2024-02-05T10:00:00Z\",\n  \"maintenance_type\": \"Security Patch\",\n  \"title\": \"Applied critical security update\",\n  \"description\": \"Updated service to patch CVE-2024-1234\",\n  \"downtime_minutes\": 10,\n  \"version_before\": \"1.0.0\",\n  \"version_after\": \"1.0.1\",\n  \"success\": true,\n  \"notes\": \"No issues during update\"\n}"},"url":"http://localhost:3000/api/maintenance-logs"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"88"},{"key":"RateLimit-Reset","value":"508"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:36:02 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"}],"_postman_id":"a75238c8-e030-4a12-8df2-f89f7edc18a9"},{"name":"Delete maintenance log","event":[{"listen":"test","script":{"id":"bc675849-8ded-4a8f-844e-788ca00bcd62","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"18e0dfc9-bebc-41c5-95db-5db6c6bf4524","request":{"method":"DELETE","header":[],"url":"http://localhost:3000/api/maintenance-logs/:id","description":"<p>Removes a specific maintenance record from the historical log.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"883ad575-b983-4156-814c-274426927fe5","id":"883ad575-b983-4156-814c-274426927fe5","name":"Maintenance","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","maintenance-logs",":id"],"host":["localhost"],"query":[],"variable":[{"type":"any","value":"","key":"id"}]}},"response":[{"id":"bf311564-7334-413b-af98-5953b128dd3b","name":"Successful Response","originalRequest":{"method":"DELETE","header":[],"url":"http://localhost:3000/api/maintenance-logs/1"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"93"},{"key":"RateLimit-Reset","value":"674"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"77"},{"key":"ETag","value":"W/\"4d-3/7lwHYC5R9E1TPt3r+RoLUQyz0\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:33:17 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Maintenance log deleted successfully\",\n    \"data\": null\n}"},{"id":"4375ff8f-9bc8-4787-85f9-1e4d4d03047a","name":"401 Unauthorized","originalRequest":{"method":"DELETE","header":[],"url":"http://localhost:3000/api/maintenance-logs/9999"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"90"},{"key":"RateLimit-Reset","value":"621"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:34:09 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"},{"id":"8a54a7a4-b829-43a7-bc55-54091e2a56c7","name":"404 Not Found","originalRequest":{"method":"DELETE","header":[],"url":"http://localhost:3000/api/maintenance-logs/9999"},"status":"Not Found","code":404,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"91"},{"key":"RateLimit-Reset","value":"640"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"55"},{"key":"ETag","value":"W/\"37-w/X43DpK6fmwTYHiDfAbPh0hYtw\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:33:51 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Maintenance log not found\"\n}"}],"_postman_id":"18e0dfc9-bebc-41c5-95db-5db6c6bf4524"}],"id":"883ad575-b983-4156-814c-274426927fe5","description":"<p>The <code>/maintenance-logs</code> endpoint provides a historical record of all updates, patches, and downtime events, allowing you to track version changes and the success rate of maintenance activities per service.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"ae752905-e18b-41da-b6d6-e64583c96cd6","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"265da23f-1d14-4a13-a620-f3a31b811488","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"883ad575-b983-4156-814c-274426927fe5"},{"name":"Vulnerabilities","item":[{"name":"Get all vulnerabilities","event":[{"listen":"test","script":{"id":"c6974fc1-4a2c-464d-b941-5553b5a1aa99","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"cc545a72-8158-438e-9715-e2831beb418b","request":{"method":"GET","header":[],"url":"http://localhost:3000/api/vulnerabilities","description":"<p>Retrieves a list of identified security flaws with optional filtering by service, severity, or status.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"fb667458-f62f-4a5a-926e-addc6f72af92","id":"fb667458-f62f-4a5a-926e-addc6f72af92","name":"Vulnerabilities","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","vulnerabilities"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"6ecafb81-bcaa-47d5-ad7e-a1c41c745d28","name":"Successful Response","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/vulnerabilities"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"98"},{"key":"RateLimit-Reset","value":"852"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"1008"},{"key":"ETag","value":"W/\"3f0-65NtrTvQO8igHUbuwmPk4YGqOcI\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:12:42 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Vulnerabilities retrieved successfully\",\n    \"data\": [\n        {\n            \"id\": 1,\n            \"service_id\": 2,\n            \"cve_id\": \"CVE-2024-1234\",\n            \"title\": \"SQL Injection Vulnerability\",\n            \"description\": \"A SQL injection vulnerability was discovered...\",\n            \"severity\": \"High\",\n            \"cvss_score\": \"7.5\",\n            \"discovered_date\": \"2024-02-01T00:00:00.000Z\",\n            \"status\": \"open\",\n            \"patched_date\": null,\n            \"remediation_notes\": \"Update to version 1.2.3\",\n            \"created_at\": \"2026-02-10T20:07:21.652Z\",\n            \"updated_at\": \"2026-02-10T20:11:54.753Z\",\n            \"service\": {\n                \"id\": 2,\n                \"user_id\": 1,\n                \"service_name\": \"Nextcloud\",\n                \"service_type\": \"storage\",\n                \"description\": \"Self-hosted cloud storage\",\n                \"url\": \"https://cloud.homelab.local\",\n                \"port\": 443,\n                \"internal_ip\": \"192.168.1.100\",\n                \"docker_container_name\": \"nextcloud\",\n                \"docker_image\": \"nextcloud:latest\",\n                \"cores_allocated\": null,\n                \"ram_allocated\": 2048,\n                \"status\": \"running\",\n                \"uptime_percentage\": null,\n                \"last_health_check\": null,\n                \"public_facing\": true,\n                \"authentication_method\": \"LDAP\",\n                \"security_score\": 85,\n                \"created_at\": \"2026-02-10T19:33:14.855Z\",\n                \"updated_at\": \"2026-02-10T19:33:14.855Z\"\n            }\n        }\n    ]\n}"},{"id":"b03c5c20-5b85-461c-81e7-326b1665c794","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/vulnerabilities"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"87"},{"key":"RateLimit-Reset","value":"212"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:23:22 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"}],"_postman_id":"cc545a72-8158-438e-9715-e2831beb418b"},{"name":"Get vulnerability by ID","id":"016ca874-7d4d-4221-8e38-a40d5a5220f2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"http://localhost:3000/api/vulnerabilities/:id","description":"<p>Retrieves specific details regarding a CVE or security issue, including its description and remediation status.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"fb667458-f62f-4a5a-926e-addc6f72af92","id":"fb667458-f62f-4a5a-926e-addc6f72af92","name":"Vulnerabilities","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","vulnerabilities",":id"],"host":["localhost"],"query":[],"variable":[{"type":"any","value":"","key":"id"}]}},"response":[{"id":"5ba9ac1f-d6c4-4685-87eb-e0bdea81a80f","name":"Successful Response","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/vulnerabilities/1"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"97"},{"key":"RateLimit-Reset","value":"811"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"1004"},{"key":"ETag","value":"W/\"3ec-n6TYnorDwxFmj8O35BkpEWCW2ps\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:13:24 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Vulnerability retrieved successfully\",\n    \"data\": {\n        \"id\": 1,\n        \"service_id\": 2,\n        \"cve_id\": \"CVE-2024-1234\",\n        \"title\": \"SQL Injection Vulnerability\",\n        \"description\": \"A SQL injection vulnerability was discovered...\",\n        \"severity\": \"High\",\n        \"cvss_score\": \"7.5\",\n        \"discovered_date\": \"2024-02-01T00:00:00.000Z\",\n        \"status\": \"open\",\n        \"patched_date\": null,\n        \"remediation_notes\": \"Update to version 1.2.3\",\n        \"created_at\": \"2026-02-10T20:07:21.652Z\",\n        \"updated_at\": \"2026-02-10T20:11:54.753Z\",\n        \"service\": {\n            \"id\": 2,\n            \"user_id\": 1,\n            \"service_name\": \"Nextcloud\",\n            \"service_type\": \"storage\",\n            \"description\": \"Self-hosted cloud storage\",\n            \"url\": \"https://cloud.homelab.local\",\n            \"port\": 443,\n            \"internal_ip\": \"192.168.1.100\",\n            \"docker_container_name\": \"nextcloud\",\n            \"docker_image\": \"nextcloud:latest\",\n            \"cores_allocated\": null,\n            \"ram_allocated\": 2048,\n            \"status\": \"running\",\n            \"uptime_percentage\": null,\n            \"last_health_check\": null,\n            \"public_facing\": true,\n            \"authentication_method\": \"LDAP\",\n            \"security_score\": 85,\n            \"created_at\": \"2026-02-10T19:33:14.855Z\",\n            \"updated_at\": \"2026-02-10T19:33:14.855Z\"\n        }\n    }\n}"},{"id":"b69b2568-5349-42e1-9d25-21d8030c9202","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[],"url":{"raw":"http://localhost:3000/api/vulnerabilities/:id","protocol":"http","host":["localhost"],"port":"3000","path":["api","vulnerabilities",":id"],"variable":[{"key":"id","value":""}]}},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"88"},{"key":"RateLimit-Reset","value":"242"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:22:53 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"},{"id":"fed1e391-4524-4d75-bc17-a3d23c0e625f","name":"404 Not Found","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/vulnerabilities/1"},"status":"Not Found","code":404,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"89"},{"key":"RateLimit-Reset","value":"266"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"53"},{"key":"ETag","value":"W/\"35-9+C+4qzxlCz+28VpHjSGN0r5C6k\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:22:29 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Vulnerability not found\"\n}"}],"_postman_id":"016ca874-7d4d-4221-8e38-a40d5a5220f2"},{"name":"Create a vulnerability","event":[{"listen":"test","script":{"id":"54f55cb7-b3ad-422f-9cd1-339ccd95c7ea","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"b2f69385-7cd8-4694-83d4-48f913dc0e28","request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"service_id\": 1,\n  \"cve_id\": \"CVE-2024-1234\",\n  \"title\": \"SQL Injection Vulnerability\",\n  \"description\": \"A SQL injection vulnerability was discovered...\",\n  \"severity\": \"High\",\n  \"cvss_score\": 7.5,\n  \"discovered_date\": \"2024-02-01T00:00:00Z\",\n  \"status\": \"open\",\n  \"remediation_notes\": \"Update to version 1.2.3\"\n}"},"url":"http://localhost:3000/api/vulnerabilities/","description":"<p>Documents a newly discovered security threat associated with a specific service.</p>\n","urlObject":{"protocol":"http","port":"3000","path":["api","vulnerabilities",""],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"7d43260b-9ded-4f12-8d2b-f2f9e505ad8c","name":"Successful Response","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n\n  \"service_id\": 2,\n  \"cve_id\": \"CVE-2024-1234\",\n  \"title\": \"SQL Injection Vulnerability\",\n  \"description\": \"A SQL injection vulnerability was discovered...\",\n  \"severity\": \"High\",\n  \"cvss_score\": 7.5,\n  \"discovered_date\": \"2024-02-01T00:00:00Z\",\n  \"status\": \"open\",\n  \"remediation_notes\": \"Update to version 1.2.3\"\n}"},"url":"http://localhost:3000/api/vulnerabilities"},"status":"Created","code":201,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"95"},{"key":"RateLimit-Reset","value":"706"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"1002"},{"key":"ETag","value":"W/\"3ea-vb6lQWrqm5Bx6c6xiyljk7pVrxc\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:07:21 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Vulnerability created successfully\",\n    \"data\": {\n        \"id\": 1,\n        \"service_id\": 2,\n        \"cve_id\": \"CVE-2024-1234\",\n        \"title\": \"SQL Injection Vulnerability\",\n        \"description\": \"A SQL injection vulnerability was discovered...\",\n        \"severity\": \"High\",\n        \"cvss_score\": \"7.5\",\n        \"discovered_date\": \"2024-02-01T00:00:00.000Z\",\n        \"status\": \"open\",\n        \"patched_date\": null,\n        \"remediation_notes\": \"Update to version 1.2.3\",\n        \"created_at\": \"2026-02-10T20:07:21.652Z\",\n        \"updated_at\": \"2026-02-10T20:07:21.652Z\",\n        \"service\": {\n            \"id\": 2,\n            \"user_id\": 1,\n            \"service_name\": \"Nextcloud\",\n            \"service_type\": \"storage\",\n            \"description\": \"Self-hosted cloud storage\",\n            \"url\": \"https://cloud.homelab.local\",\n            \"port\": 443,\n            \"internal_ip\": \"192.168.1.100\",\n            \"docker_container_name\": \"nextcloud\",\n            \"docker_image\": \"nextcloud:latest\",\n            \"cores_allocated\": null,\n            \"ram_allocated\": 2048,\n            \"status\": \"running\",\n            \"uptime_percentage\": null,\n            \"last_health_check\": null,\n            \"public_facing\": true,\n            \"authentication_method\": \"LDAP\",\n            \"security_score\": 85,\n            \"created_at\": \"2026-02-10T19:33:14.855Z\",\n            \"updated_at\": \"2026-02-10T19:33:14.855Z\"\n        }\n    }\n}"},{"id":"39cdf795-00f9-4765-8930-eaa5601d5c69","name":"400 Bad Request","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"service_id\": 2,\n  \"description\": \"A SQL injection vulnerability was discovered...\",\n  \"severity\": \"High\",\n  \"cvss_score\": 7.5,\n  \"discovered_date\": \"2024-02-01T00:00:00Z\",\n  \"status\": \"open\",\n  \"remediation_notes\": \"Update to version 1.2.3\"\n}"},"url":{"raw":"http://localhost:3000/api/vulnerabilities/","protocol":"http","host":["localhost"],"port":"3000","path":["api","vulnerabilities",""],"query":[{"key":"workspace","value":"{{workspaceId}}","description":"Optional. A workspace ID in which to create the collection.\n\nIf you do not include this query parameter, the system creates the collection in your \"My Workspace\" workspace.","disabled":true}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"77"},{"key":"RateLimit-Reset","value":"199"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-B/cJsn9vJjDqYNQ21s4OWJ5Uj6M\""},{"key":"Date","value":"Tue, 10 Feb 2026 21:04:22 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Validation failed\"\n}"},{"id":"7f5c6686-0b39-437e-ba19-05185c8015b7","name":"401 Unauthorized","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"service_id\": 1,\n  \"cve_id\": \"CVE-2024-1234\",\n  \"title\": \"SQL Injection Vulnerability\",\n  \"description\": \"A SQL injection vulnerability was discovered...\",\n  \"severity\": \"High\",\n  \"cvss_score\": 7.5,\n  \"discovered_date\": \"2024-02-01T00:00:00Z\",\n  \"status\": \"open\",\n  \"remediation_notes\": \"Update to version 1.2.3\"\n}"},"url":"http://localhost:3000/api/vulnerabilities/"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"90"},{"key":"RateLimit-Reset","value":"302"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:21:53 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"},{"id":"aa4b252c-d990-4f1a-8eb4-1e9cdb7bb3c7","name":"404 Not Found","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"service_id\": 1,\n  \"cve_id\": \"CVE-2024-1234\",\n  \"title\": \"SQL Injection Vulnerability\",\n  \"description\": \"A SQL injection vulnerability was discovered...\",\n  \"severity\": \"High\",\n  \"cvss_score\": 7.5,\n  \"discovered_date\": \"2024-02-01T00:00:00Z\",\n  \"status\": \"open\",\n  \"remediation_notes\": \"Update to version 1.2.3\"\n}"},"url":"http://localhost:3000/api/vulnerabilities/"},"status":"Not Found","code":404,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"91"},{"key":"RateLimit-Reset","value":"339"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-+fJtozSbopR9LmOFeQqevi/1GzU\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:21:16 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Service not found\"\n}"}],"_postman_id":"b2f69385-7cd8-4694-83d4-48f913dc0e28"},{"name":"Update a vulnerability","event":[{"listen":"test","script":{"id":"ed1f3517-d8e2-4699-830d-d4ff2fd9eca4","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"79f92747-7e62-453b-a55e-7035920571dd","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"severity\": \"High\",\n    \"cvss_score\": 7.5\n}"},"url":"http://localhost:3000/api/vulnerabilities/:id","description":"<p>Updates the status or remediation notes for an existing vulnerability entry.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"fb667458-f62f-4a5a-926e-addc6f72af92","id":"fb667458-f62f-4a5a-926e-addc6f72af92","name":"Vulnerabilities","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","vulnerabilities",":id"],"host":["localhost"],"query":[],"variable":[{"type":"any","value":"","key":"id"}]}},"response":[{"id":"4a8c0dcb-dc14-4f14-8911-8b1d63070551","name":"Successful Response","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"severity\": \"High\",\n    \"cvss_score\": 7.5\n}"},"url":"http://localhost:3000/api/vulnerabilities/1"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"99"},{"key":"RateLimit-Reset","value":"900"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"1002"},{"key":"ETag","value":"W/\"3ea-NaJAaf7Evd2L6H/hsy4u9EGdeY8\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:11:54 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Vulnerability updated successfully\",\n    \"data\": {\n        \"id\": 1,\n        \"service_id\": 2,\n        \"cve_id\": \"CVE-2024-1234\",\n        \"title\": \"SQL Injection Vulnerability\",\n        \"description\": \"A SQL injection vulnerability was discovered...\",\n        \"severity\": \"High\",\n        \"cvss_score\": \"7.5\",\n        \"discovered_date\": \"2024-02-01T00:00:00.000Z\",\n        \"status\": \"open\",\n        \"patched_date\": null,\n        \"remediation_notes\": \"Update to version 1.2.3\",\n        \"created_at\": \"2026-02-10T20:07:21.652Z\",\n        \"updated_at\": \"2026-02-10T20:11:54.753Z\",\n        \"service\": {\n            \"id\": 2,\n            \"user_id\": 1,\n            \"service_name\": \"Nextcloud\",\n            \"service_type\": \"storage\",\n            \"description\": \"Self-hosted cloud storage\",\n            \"url\": \"https://cloud.homelab.local\",\n            \"port\": 443,\n            \"internal_ip\": \"192.168.1.100\",\n            \"docker_container_name\": \"nextcloud\",\n            \"docker_image\": \"nextcloud:latest\",\n            \"cores_allocated\": null,\n            \"ram_allocated\": 2048,\n            \"status\": \"running\",\n            \"uptime_percentage\": null,\n            \"last_health_check\": null,\n            \"public_facing\": true,\n            \"authentication_method\": \"LDAP\",\n            \"security_score\": 85,\n            \"created_at\": \"2026-02-10T19:33:14.855Z\",\n            \"updated_at\": \"2026-02-10T19:33:14.855Z\"\n        }\n    }\n}"},{"id":"198b3637-5c09-41af-b88d-83a00c8be708","name":"400 Bad Request","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    a\n}"},"url":"http://localhost:3000/api/vulnerabilities/2"},"status":"Bad Request","code":400,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"73"},{"key":"RateLimit-Reset","value":"133"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"99"},{"key":"ETag","value":"W/\"63-yzOyRqKO1oPF8ahBAK/4xVeZD9I\""},{"key":"Date","value":"Tue, 10 Feb 2026 21:05:27 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Expected property name or '}' in JSON at position 6 (line 2 column 5)\"\n}"},{"id":"caa74dfc-f092-4aa0-8837-525f15064ebb","name":"401 Unauthorized","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"severity\": \"High\",\n    \"cvss_score\": 7.5\n}"},"url":"http://localhost:3000/api/vulnerabilities/9999"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"92"},{"key":"RateLimit-Reset","value":"439"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:19:36 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"},{"id":"8b0f4a82-eb53-46c0-8fbd-a0630773c211","name":"404 Not Found","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"severity\": \"High\",\n    \"cvss_score\": 7.5\n}"},"url":"http://localhost:3000/api/vulnerabilities/9999"},"status":"Not Found","code":404,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"93"},{"key":"RateLimit-Reset","value":"564"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"53"},{"key":"ETag","value":"W/\"35-9+C+4qzxlCz+28VpHjSGN0r5C6k\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:17:31 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Vulnerability not found\"\n}"}],"_postman_id":"79f92747-7e62-453b-a55e-7035920571dd"},{"name":"Delete a vulnerability","event":[{"listen":"test","script":{"id":"662cffe9-f3a7-48a4-853d-9202115fec4c","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"0d938bcb-6c77-4227-9474-0fd45831931d","request":{"method":"DELETE","header":[],"url":"http://localhost:3000/api/vulnerabilities/:id","description":"<p>Removes a vulnerability record from the tracking system.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"fb667458-f62f-4a5a-926e-addc6f72af92","id":"fb667458-f62f-4a5a-926e-addc6f72af92","name":"Vulnerabilities","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","vulnerabilities",":id"],"host":["localhost"],"query":[],"variable":[{"type":"any","value":"","key":"id"}]}},"response":[{"id":"45d4a4f1-0b08-4c93-be84-b0e79fb1a546","name":"Successful Response","originalRequest":{"method":"DELETE","header":[],"url":{"raw":"http://localhost:3000/api/vulnerabilities/:id","protocol":"http","host":["localhost"],"port":"3000","path":["api","vulnerabilities",":id"],"variable":[{"key":"id","value":""}]}},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"96"},{"key":"RateLimit-Reset","value":"740"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"75"},{"key":"ETag","value":"W/\"4b-UJNwQLA/suBGt/fAJnyPnllZegY\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:14:35 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Vulnerability deleted successfully\",\n    \"data\": null\n}"},{"id":"928bfb1c-4a85-44f7-843a-661105d271ed","name":"401 Unauthorized","originalRequest":{"method":"DELETE","header":[],"url":"http://localhost:3000/api/vulnerabilities/9999"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"94"},{"key":"RateLimit-Reset","value":"600"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:16:55 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"},{"id":"eede2a64-a3f0-42ec-bf8f-b55622879002","name":"404 Not Found","originalRequest":{"method":"DELETE","header":[],"url":"http://localhost:3000/api/vulnerabilities/9999"},"status":"Not Found","code":404,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"95"},{"key":"RateLimit-Reset","value":"685"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"53"},{"key":"ETag","value":"W/\"35-9+C+4qzxlCz+28VpHjSGN0r5C6k\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:15:30 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Vulnerability not found\"\n}"}],"_postman_id":"0d938bcb-6c77-4227-9474-0fd45831931d"},{"name":"Get vulnerability statistics","id":"8f13795e-48b9-4d8c-8009-4a04404325d8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"http://localhost:3000/api/vulnerabilities/stats","description":"<p>Returns a summary of security health, showing total vulnerabilities grouped by severity and current status.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"fb667458-f62f-4a5a-926e-addc6f72af92","id":"fb667458-f62f-4a5a-926e-addc6f72af92","name":"Vulnerabilities","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","vulnerabilities","stats"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"44e2c53a-9312-4663-b665-61400275e822","name":"Successfull Response","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/vulnerabilities/stats"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"99"},{"key":"RateLimit-Reset","value":"900"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"197"},{"key":"ETag","value":"W/\"c5-SsnThqcaPPRobT3lZtl67LPSGIE\""},{"key":"Date","value":"Tue, 10 Feb 2026 21:30:31 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Vulnerability statistics retrieved successfully\",\n    \"data\": {\n        \"total\": 2,\n        \"by_severity\": {\n            \"critical\": 0,\n            \"high\": 2,\n            \"medium\": 0,\n            \"low\": 0\n        },\n        \"by_status\": {\n            \"open\": 2,\n            \"patched\": 0,\n            \"other\": 0\n        }\n    }\n}"}],"_postman_id":"8f13795e-48b9-4d8c-8009-4a04404325d8"}],"id":"fb667458-f62f-4a5a-926e-addc6f72af92","description":"<p>The <code>/vulnerabilities</code> endpoint serves as a security clearinghouse to report, track, and manage the remediation status of CVEs and security flaws identified within your hosted services.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"5e3827bd-c634-4ded-9446-a1d54e2d98aa","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"c93fc3e6-1e13-4ed4-a7e1-fdaee5bc86dd","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"fb667458-f62f-4a5a-926e-addc6f72af92"},{"name":"SSL Certificates","item":[{"name":"Get all ssl certificates","event":[{"listen":"test","script":{"id":"1faaa5ad-5d6c-41ab-a147-6bff5a6b82f9","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"ab1becc7-c842-46cc-b927-c6616e5fa41c","request":{"method":"GET","header":[],"url":"http://localhost:3000/api/ssl-certificates","description":"<p>Retrieves all tracked SSL certificates with optional filtering by service or expiration status.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","name":"SSL Certificates","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","ssl-certificates"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"36534b86-a5ef-40a2-a82b-0dac10c91d01","name":"Successful Response","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/ssl-certificates"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"82"},{"key":"RateLimit-Reset","value":"89"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"966"},{"key":"ETag","value":"W/\"3c6-y6FY/C8SfbFrCldoZ9M2OZ1qSd8\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:43:02 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"SSL certificates retrieved successfully\",\n    \"data\": [\n        {\n            \"days_until_expiry\": -680,\n            \"id\": 1,\n            \"service_id\": 2,\n            \"domain\": \"cloud.homelab.local\",\n            \"issuer\": \"Let's Encrypt\",\n            \"certificate_type\": \"Let's Encrypt\",\n            \"issue_date\": \"2024-01-01T00:00:00.000Z\",\n            \"expiration_date\": \"2024-04-01T00:00:00.000Z\",\n            \"status\": \"expired\",\n            \"auto_renewal_enabled\": true,\n            \"created_at\": \"2026-02-10T20:42:10.611Z\",\n            \"updated_at\": \"2026-02-10T20:42:10.611Z\",\n            \"service\": {\n                \"id\": 2,\n                \"user_id\": 1,\n                \"service_name\": \"Nextcloud\",\n                \"service_type\": \"storage\",\n                \"description\": \"Self-hosted cloud storage\",\n                \"url\": \"https://cloud.homelab.local\",\n                \"port\": 443,\n                \"internal_ip\": \"192.168.1.100\",\n                \"docker_container_name\": \"nextcloud\",\n                \"docker_image\": \"nextcloud:latest\",\n                \"cores_allocated\": null,\n                \"ram_allocated\": 2048,\n                \"status\": \"running\",\n                \"uptime_percentage\": null,\n                \"last_health_check\": null,\n                \"public_facing\": true,\n                \"authentication_method\": \"LDAP\",\n                \"security_score\": 85,\n                \"created_at\": \"2026-02-10T19:33:14.855Z\",\n                \"updated_at\": \"2026-02-10T19:33:14.855Z\"\n            }\n        }\n    ]\n}"},{"id":"d59e7fd2-fb6b-436a-9a6c-c49109f419b3","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/ssl-certificates"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"99"},{"key":"RateLimit-Reset","value":"900"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:52:40 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"}],"_postman_id":"ab1becc7-c842-46cc-b927-c6616e5fa41c"},{"name":"Get ssl certificate by ID","event":[{"listen":"test","script":{"id":"f8a8d3cf-4b46-477b-9583-1b3ef9a618a3","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"993d1c3f-b3f3-4fbe-93a4-dd8d0f6b1fad","request":{"method":"GET","header":[],"url":"http://localhost:3000/api/ssl-certificates/:id","description":"<p>Retrieves technical details and expiration data for a specific SSL certificate.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","name":"SSL Certificates","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","ssl-certificates",":id"],"host":["localhost"],"query":[],"variable":[{"type":"any","value":"","key":"id"}]}},"response":[{"id":"2029c75c-d6d4-4e13-a1ae-b439ae999283","name":"Successful Response","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/ssl-certificates/1"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"98"},{"key":"RateLimit-Reset","value":"863"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"963"},{"key":"ETag","value":"W/\"3c3-gCQwjYpuIK05KMomecvdEhJ/n7A\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:53:17 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"SSL certificate retrieved successfully\",\n    \"data\": {\n        \"days_until_expiry\": -680,\n        \"id\": 1,\n        \"service_id\": 2,\n        \"domain\": \"cloud.homelab.local\",\n        \"issuer\": \"Let's Encrypt\",\n        \"certificate_type\": \"Let's Encrypt\",\n        \"issue_date\": \"2024-01-01T00:00:00.000Z\",\n        \"expiration_date\": \"2024-04-01T00:00:00.000Z\",\n        \"status\": \"expired\",\n        \"auto_renewal_enabled\": true,\n        \"created_at\": \"2026-02-10T20:42:10.611Z\",\n        \"updated_at\": \"2026-02-10T20:42:10.611Z\",\n        \"service\": {\n            \"id\": 2,\n            \"user_id\": 1,\n            \"service_name\": \"Nextcloud\",\n            \"service_type\": \"storage\",\n            \"description\": \"Self-hosted cloud storage\",\n            \"url\": \"https://cloud.homelab.local\",\n            \"port\": 443,\n            \"internal_ip\": \"192.168.1.100\",\n            \"docker_container_name\": \"nextcloud\",\n            \"docker_image\": \"nextcloud:latest\",\n            \"cores_allocated\": null,\n            \"ram_allocated\": 2048,\n            \"status\": \"running\",\n            \"uptime_percentage\": null,\n            \"last_health_check\": null,\n            \"public_facing\": true,\n            \"authentication_method\": \"LDAP\",\n            \"security_score\": 85,\n            \"created_at\": \"2026-02-10T19:33:14.855Z\",\n            \"updated_at\": \"2026-02-10T19:33:14.855Z\"\n        }\n    }\n}"},{"id":"03d024a2-8bec-4c4c-9675-2708413b8230","name":"401 Unauthorized","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/ssl-certificates/9999"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"96"},{"key":"RateLimit-Reset","value":"798"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:54:23 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"},{"id":"e2e9ea39-d526-4371-a43e-74f7f8a29b22","name":"404 Not Found","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/ssl-certificates/9999"},"status":"Not Found","code":404,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"97"},{"key":"RateLimit-Reset","value":"817"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"55"},{"key":"ETag","value":"W/\"37-RWxVWSkWmhjhDAdIv8qGyt9JcSs\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:54:04 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"SSL certificate not found\"\n}"}],"_postman_id":"993d1c3f-b3f3-4fbe-93a4-dd8d0f6b1fad"},{"name":"Create a ssl certificate","event":[{"listen":"test","script":{"id":"c039478c-28f9-42db-8d65-a5b34f450f5a","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"1fc23ab6-36ae-4660-a58b-bed90eaca382","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n\n  \"service_id\": 2,\n  \"domain\": \"cloud.homelab.local\",\n  \"issuer\": \"Let's Encrypt\",\n  \"certificate_type\": \"Let's Encrypt\",\n  \"issue_date\": \"2024-01-01T00:00:00Z\",\n  \"expiration_date\": \"2024-04-01T00:00:00Z\",\n  \"status\": \"valid\",\n  \"auto_renewal_enabled\": true\n}"},"url":"http://localhost:3000/api/ssl-certificates","description":"<p>Registers a new certificate to be monitored, including its issuer and expiration timeline.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","name":"SSL Certificates","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","ssl-certificates"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"d5c18537-5e77-4c13-b689-03d9866f334f","name":"Successful Response","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n\n  \"service_id\": 2,\n  \"domain\": \"cloud.homelab.local\",\n  \"issuer\": \"Let's Encrypt\",\n  \"certificate_type\": \"Let's Encrypt\",\n  \"issue_date\": \"2024-01-01T00:00:00Z\",\n  \"expiration_date\": \"2024-04-01T00:00:00Z\",\n  \"status\": \"valid\",\n  \"auto_renewal_enabled\": true\n}"},"url":"http://localhost:3000/api/ssl-certificates"},"status":"Created","code":201,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"83"},{"key":"RateLimit-Reset","value":"141"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"961"},{"key":"ETag","value":"W/\"3c1-xZTpnQNJ1xw4B52SOPuOExkj0EE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:42:10 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"SSL certificate created successfully\",\n    \"data\": {\n        \"days_until_expiry\": -680,\n        \"id\": 1,\n        \"service_id\": 2,\n        \"domain\": \"cloud.homelab.local\",\n        \"issuer\": \"Let's Encrypt\",\n        \"certificate_type\": \"Let's Encrypt\",\n        \"issue_date\": \"2024-01-01T00:00:00.000Z\",\n        \"expiration_date\": \"2024-04-01T00:00:00.000Z\",\n        \"status\": \"expired\",\n        \"auto_renewal_enabled\": true,\n        \"created_at\": \"2026-02-10T20:42:10.611Z\",\n        \"updated_at\": \"2026-02-10T20:42:10.611Z\",\n        \"service\": {\n            \"id\": 2,\n            \"user_id\": 1,\n            \"service_name\": \"Nextcloud\",\n            \"service_type\": \"storage\",\n            \"description\": \"Self-hosted cloud storage\",\n            \"url\": \"https://cloud.homelab.local\",\n            \"port\": 443,\n            \"internal_ip\": \"192.168.1.100\",\n            \"docker_container_name\": \"nextcloud\",\n            \"docker_image\": \"nextcloud:latest\",\n            \"cores_allocated\": null,\n            \"ram_allocated\": 2048,\n            \"status\": \"running\",\n            \"uptime_percentage\": null,\n            \"last_health_check\": null,\n            \"public_facing\": true,\n            \"authentication_method\": \"LDAP\",\n            \"security_score\": 85,\n            \"created_at\": \"2026-02-10T19:33:14.855Z\",\n            \"updated_at\": \"2026-02-10T19:33:14.855Z\"\n        }\n    }\n}"},{"id":"3cc8214f-87a9-475f-be33-614837b9b781","name":"400 Bad Request","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"domain\": \"cloud.homelab.local\",\n  \"issuer\": \"Let's Encrypt\",\n  \"certificate_type\": \"Let's Encrypt\",\n  \"issue_date\": \"2024-01-01T00:00:00Z\",\n  \"expiration_date\": \"2024-04-01T00:00:00Z\",\n  \"status\": \"valid\",\n  \"auto_renewal_enabled\": true\n}"},"url":"http://localhost:3000/api/ssl-certificates"},"status":"Bad Request","code":400,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"86"},{"key":"RateLimit-Reset","value":"368"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-B/cJsn9vJjDqYNQ21s4OWJ5Uj6M\""},{"key":"Date","value":"Tue, 10 Feb 2026 21:01:33 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Validation failed\"\n}"},{"id":"b259f236-434c-4a30-a44f-ea17631e9118","name":"401 Unauthorized","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"service_id\": 2,\n  \"domain\": \"cloud.homelab.local\",\n  \"issuer\": \"Let's Encrypt\",\n  \"certificate_type\": \"Let's Encrypt\",\n  \"issue_date\": \"2024-01-01T00:00:00Z\",\n  \"expiration_date\": \"2024-04-01T00:00:00Z\",\n  \"status\": \"valid\",\n  \"auto_renewal_enabled\": true\n}"},"url":"http://localhost:3000/api/ssl-certificates"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"85"},{"key":"RateLimit-Reset","value":"329"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 21:02:11 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"}],"_postman_id":"1fc23ab6-36ae-4660-a58b-bed90eaca382"},{"name":"Update a collection","event":[{"listen":"test","script":{"id":"aa40f415-cabf-4ce0-bcc5-aef78a1f0425","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"7ec1c2ba-6a57-495a-a7a4-50c36e21b751","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n      \"expiration_date\": \"2026-04-01T00:00:00Z\"\n}"},"url":"http://localhost:3000/api/ssl-certificates/:id","description":"<p>Modifies certificate details, such as status or auto-renewal settings.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","name":"SSL Certificates","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","ssl-certificates",":id"],"host":["localhost"],"query":[],"variable":[{"type":"any","value":"","key":"id"}]}},"response":[{"id":"0c2907de-3d73-4574-ab36-8a28be56b24a","name":"Successful Response","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"expiration_date\": \"2026-04-01T00:00:00Z\"\n}"},"url":"http://localhost:3000/api/ssl-certificates/2"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"89"},{"key":"RateLimit-Reset","value":"510"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"957"},{"key":"ETag","value":"W/\"3bd-z41ujam1wqkI7QDa4kCL/3yUBX8\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:59:11 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"SSL certificate updated successfully\",\n    \"data\": {\n        \"days_until_expiry\": 50,\n        \"id\": 2,\n        \"service_id\": 2,\n        \"domain\": \"cloud.homelab.local\",\n        \"issuer\": \"Let's Encrypt\",\n        \"certificate_type\": \"Let's Encrypt\",\n        \"issue_date\": \"2024-01-01T00:00:00.000Z\",\n        \"expiration_date\": \"2026-04-01T00:00:00.000Z\",\n        \"status\": \"valid\",\n        \"auto_renewal_enabled\": true,\n        \"created_at\": \"2026-02-10T20:56:42.121Z\",\n        \"updated_at\": \"2026-02-10T20:59:11.480Z\",\n        \"service\": {\n            \"id\": 2,\n            \"user_id\": 1,\n            \"service_name\": \"Nextcloud\",\n            \"service_type\": \"storage\",\n            \"description\": \"Self-hosted cloud storage\",\n            \"url\": \"https://cloud.homelab.local\",\n            \"port\": 443,\n            \"internal_ip\": \"192.168.1.100\",\n            \"docker_container_name\": \"nextcloud\",\n            \"docker_image\": \"nextcloud:latest\",\n            \"cores_allocated\": null,\n            \"ram_allocated\": 2048,\n            \"status\": \"running\",\n            \"uptime_percentage\": null,\n            \"last_health_check\": null,\n            \"public_facing\": true,\n            \"authentication_method\": \"LDAP\",\n            \"security_score\": 85,\n            \"created_at\": \"2026-02-10T19:33:14.855Z\",\n            \"updated_at\": \"2026-02-10T19:33:14.855Z\"\n        }\n    }\n}"},{"id":"5f275dce-f5cb-471e-9328-7f35fce80bcb","name":"400 Bad Request","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"  \"expiration_date\": \"2026-04-01T00:00:00Z\""},"url":"http://localhost:3000/api/ssl-certificates/2"},"status":"Bad Request","code":400,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"90"},{"key":"RateLimit-Reset","value":"580"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"91"},{"key":"ETag","value":"W/\"5b-j66/76YaemKwveIQ50qOU2iibQQ\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:58:01 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"Unexpected token '\\\"', \\\"  \\\"expiratio\\\"... is not valid JSON\"\n}"},{"id":"e3bcf7ae-409d-4155-b825-a0c97614714f","name":"401 Unauthorized","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"expiration_date\": \"2026-04-01T00:00:00Z\"\n}"},"url":"http://localhost:3000/api/ssl-certificates/9999"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"87"},{"key":"RateLimit-Reset","value":"471"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:59:50 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"},{"id":"19441717-8a23-4343-91e9-55afba2a0850","name":"404 Not Found","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"expiration_date\": \"2026-04-01T00:00:00Z\"\n}"},"url":"http://localhost:3000/api/ssl-certificates/9999"},"status":"Not Found","code":404,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"88"},{"key":"RateLimit-Reset","value":"486"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"55"},{"key":"ETag","value":"W/\"37-RWxVWSkWmhjhDAdIv8qGyt9JcSs\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:59:35 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"SSL certificate not found\"\n}"}],"_postman_id":"7ec1c2ba-6a57-495a-a7a4-50c36e21b751"},{"name":"Delete a ssl certificate","event":[{"listen":"test","script":{"id":"77866829-a19c-4b02-8f28-2306a91e3a44","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"3619eefe-99ee-4bee-933d-6310550f21c2","request":{"method":"DELETE","header":[],"url":"http://localhost:3000/api/ssl-certificates/:id","description":"<p>Removes a certificate from the monitoring list.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","name":"SSL Certificates","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","ssl-certificates",":id"],"host":["localhost"],"query":[],"variable":[{"type":"any","value":"","key":"id"}]}},"response":[{"id":"aaf3c340-4e60-408d-9115-0d9f9ca36548","name":"Successful Response","originalRequest":{"method":"DELETE","header":[],"url":"http://localhost:3000/api/ssl-certificates/1"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"95"},{"key":"RateLimit-Reset","value":"752"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"77"},{"key":"ETag","value":"W/\"4d-+Lc/ywzQ6BlzM9Z9D8M5Qc+ZGuw\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:55:09 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"SSL certificate deleted successfully\",\n    \"data\": null\n}"},{"id":"5ebb3714-366f-42f5-8f4d-30dc5e4f1d44","name":"401 Unauthorized","originalRequest":{"method":"DELETE","header":[],"url":"http://localhost:3000/api/ssl-certificates/9999"},"status":"Unauthorized","code":401,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"93"},{"key":"RateLimit-Reset","value":"693"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"47"},{"key":"ETag","value":"W/\"2f-VwoH6g/NSC3v0iJZlTnsI5fj3wE\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:56:08 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"No token provided\"\n}"},{"id":"37a60d03-40b4-4eda-a86f-cffcc4d8306c","name":"404 Not Found","originalRequest":{"method":"DELETE","header":[],"url":"http://localhost:3000/api/ssl-certificates/9999"},"status":"Not Found","code":404,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"94"},{"key":"RateLimit-Reset","value":"710"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"55"},{"key":"ETag","value":"W/\"37-RWxVWSkWmhjhDAdIv8qGyt9JcSs\""},{"key":"Date","value":"Tue, 10 Feb 2026 20:55:51 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"message\": \"SSL certificate not found\"\n}"}],"_postman_id":"3619eefe-99ee-4bee-933d-6310550f21c2"},{"name":"Get ssl certificate statistics","id":"63074e52-cfa8-4acf-b77b-e1f39f58c13c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"http://localhost:3000/api/ssl-certificates/expiring","description":"<p>Retrieves a list of certificates nearing their expiration date within a specified window (default 30 days).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":true,"source":{"_postman_id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","name":"SSL Certificates","type":"folder"}},"urlObject":{"protocol":"http","port":"3000","path":["api","ssl-certificates","expiring"],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"b25b18f5-e0a4-49e0-92a6-983f0856dfd8","name":"Successful Response","originalRequest":{"method":"GET","header":[],"url":"http://localhost:3000/api/ssl-certificates/expiring"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"RateLimit-Policy","value":"100;w=900"},{"key":"RateLimit-Limit","value":"100"},{"key":"RateLimit-Remaining","value":"98"},{"key":"RateLimit-Reset","value":"864"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"98"},{"key":"ETag","value":"W/\"62-NLdPdEHXgG1O9SXbAaYvRMsBEbQ\""},{"key":"Date","value":"Tue, 10 Feb 2026 21:31:08 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"message\": \"Certificates expiring within 30 days retrieved successfully\",\n    \"data\": []\n}"}],"_postman_id":"63074e52-cfa8-4acf-b77b-e1f39f58c13c"}],"id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862","description":"<p>The <code>/ssl-certificates</code> endpoint manages the lifecycle of your domain security, enabling you to track issuers, monitor expiration timelines, and identify which certificates require immediate renewal.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"3fd538a4-6301-42d0-ab40-f4613410a3c4","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"ec0cb0bb-e420-4dbb-917f-c467cbb7b842","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"ef5f5a51-0ba9-43e7-ac7b-664756e3d862"},{"name":"Default Landing Page","id":"153d7375-905f-4592-84cd-64f482ea1904","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"http://localhost:3000/","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"01266fca-c472-438f-9038-b5ad0efbbc96","id":"01266fca-c472-438f-9038-b5ad0efbbc96","name":"Homelab Manager API","type":"collection"}},"urlObject":{"protocol":"http","port":"3000","path":[""],"host":["localhost"],"query":[],"variable":[]}},"response":[{"id":"21a0b45a-e24f-4641-a65d-61d15a6960ff","name":"Successful Response","originalRequest":{"method":"GET","header":[],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"http://localhost:3000/"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Security-Policy","value":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests"},{"key":"Cross-Origin-Opener-Policy","value":"same-origin"},{"key":"Cross-Origin-Resource-Policy","value":"same-origin"},{"key":"Origin-Agent-Cluster","value":"?1"},{"key":"Referrer-Policy","value":"no-referrer"},{"key":"Strict-Transport-Security","value":"max-age=31536000; includeSubDomains"},{"key":"X-Content-Type-Options","value":"nosniff"},{"key":"X-DNS-Prefetch-Control","value":"off"},{"key":"X-Download-Options","value":"noopen"},{"key":"X-Frame-Options","value":"SAMEORIGIN"},{"key":"X-Permitted-Cross-Domain-Policies","value":"none"},{"key":"X-XSS-Protection","value":"0"},{"key":"Access-Control-Allow-Origin","value":"http://localhost:3000"},{"key":"Vary","value":"Origin"},{"key":"Access-Control-Allow-Credentials","value":"true"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"283"},{"key":"ETag","value":"W/\"11b-5Z5TT55iFTq7lukPVWn1N8X3zm4\""},{"key":"Date","value":"Tue, 10 Feb 2026 18:36:11 GMT"},{"key":"Connection","value":"keep-alive"},{"key":"Keep-Alive","value":"timeout=5"}],"cookie":[],"responseTime":null,"body":"{\n    \"message\": \"Homelab Service Manager API\",\n    \"version\": \"1.0.0\",\n    \"status\": \"running\",\n    \"endpoints\": {\n        \"health\": \"/api/health\",\n        \"auth\": \"/api/auth\",\n        \"services\": \"/api/services\",\n        \"maintenance\": \"/api/maintenance-logs\",\n        \"vulnerabilities\": \"/api/vulnerabilities\",\n        \"ssl_certificates\": \"/api/ssl-certificates\"\n    }\n}"}],"_postman_id":"153d7375-905f-4592-84cd-64f482ea1904"}],"auth":{"type":"bearer","bearer":{"basicConfig":[]}},"event":[{"listen":"prerequest","script":{"id":"96d15514-36ba-4fea-89df-fdf85487bf0f","type":"text/javascript","requests":{},"exec":[""]}},{"listen":"test","script":{"id":"416a77b1-77c0-4fcb-a8b6-90e1cac167d4","type":"text/javascript","requests":{},"exec":[""]}}],"variable":[{"key":"baseUrl","value":"https://farming-simulator.pstmn.io"}]}