{"info":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","description":"<html><head></head><body><p>Server health monitoring dashboard API.</p>\n<p>Monitors CPU, memory, and service status for .NET applications running on a Hostinger VPS. Provides real-time dashboards, historical metrics, restart event logging, and email/SMS alerting.</p>\n<h2 id=\"authentication\">Authentication</h2>\n<p><strong>Two auth mechanisms:</strong></p>\n<ol>\n<li><p><strong>API Key</strong> (<code>X-Api-Key</code> header) — Used by the <code>health-monitor.sh</code> cron script to POST metrics and restart events from the server. Keys are SHA256-hashed and stored per-server.</p>\n</li>\n<li><p><strong>JWT Bearer Token</strong> — Used by the React dashboard for admin access. Obtain a token via <code>POST /api/auth/login</code>, then include it as <code>Authorization: Bearer </code>.</p>\n</li>\n</ol>\n<h2 id=\"base-url\">Base URL</h2>\n<ul>\n<li><strong>Production:</strong> <code>https://monitor.ilheureux.dev</code></li>\n<li><strong>Development:</strong> <code>http://localhost:5230</code></li>\n</ul>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"53534571","collectionId":"dce082ee-d704-47c3-9500-6ceaeb1938fc","publishedId":"2sBXikoXEB","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-03-26T22:17:27.000Z"},"item":[{"name":"Authentication","item":[{"name":"Login","event":[{"listen":"test","script":{"exec":["if (pm.response.code === 200) {","    var jsonData = pm.response.json();","    pm.collectionVariables.set('token', jsonData.token);","    pm.test('Token received and saved', function () {","        pm.expect(jsonData.token).to.be.a('string');","    });","}"],"type":"text/javascript","id":"b68caf78-1163-44f8-a25e-55d62e30c3a5"}}],"id":"3d7aeef9-c777-457e-87b8-489fcda08ee4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"admin@example.com\",\n  \"password\": \"your-password\"\n}"},"url":"https://monitor.ilheureux.dev/api/auth/login","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","auth","login"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[{"id":"8cf2d0fa-dd50-432d-9539-36333792e245","name":"200 — Success","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"admin@example.com\",\n  \"password\": \"your-password\"\n}"},"url":"https://monitor.ilheureux.dev/api/auth/login"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"email\": \"admin@example.com\"\n}"},{"id":"40ee3632-09e1-4363-9e5b-191b6036782e","name":"401 — Invalid credentials","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"admin@example.com\",\n  \"password\": \"your-password\"\n}"},"url":"https://monitor.ilheureux.dev/api/auth/login"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":""},{"id":"ac81077d-f53b-41f3-8317-9c36b67abd4b","name":"429 — Rate limited","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"admin@example.com\",\n  \"password\": \"your-password\"\n}"},"url":"https://monitor.ilheureux.dev/api/auth/login"},"status":"Too Many Requests","code":429,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"3d7aeef9-c777-457e-87b8-489fcda08ee4"}],"id":"5169179c-8cc9-41af-b36e-4f1a19b8ff1c","description":"<p>JWT-based admin authentication. Single admin user, rate-limited to 5 attempts per 5 minutes per IP.</p>\n","_postman_id":"5169179c-8cc9-41af-b36e-4f1a19b8ff1c","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}}},{"name":"Dashboard","item":[{"name":"Get Dashboard (Public)","id":"e2597e14-1b02-48a7-b29d-f8ccb7ab8673","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://monitor.ilheureux.dev/api/dashboard","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","dashboard"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[{"id":"ec3e0b08-e350-4f83-9719-ab06c5045fcf","name":"200 — Public (restarts stripped)","originalRequest":{"method":"GET","header":[],"url":"https://monitor.ilheureux.dev/api/dashboard"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"servers\": [\n    {\n      \"serverId\": 1,\n      \"serverName\": \"Hostinger VPS\",\n      \"lastSeenAt\": \"2026-03-26T10:05:00Z\",\n      \"isStale\": false,\n      \"latestMetrics\": {\n        \"cpuUserPct\": 3.2,\n        \"cpuSystemPct\": 1.1,\n        \"cpuStealPct\": 0.0,\n        \"cpuIdlePct\": 95.7,\n        \"memTotalMb\": 8192,\n        \"memUsedMb\": 2340,\n        \"memAvailableMb\": 5852\n      },\n      \"services\": [\n        {\n          \"serviceName\": \"calvary-checkin\",\n          \"isActive\": true,\n          \"cpuPct\": 1.4,\n          \"memoryMb\": 118,\n          \"pid\": 12345\n        }\n      ],\n      \"recentRestarts\": []\n    }\n  ]\n}"}],"_postman_id":"e2597e14-1b02-48a7-b29d-f8ccb7ab8673"},{"name":"Get Dashboard (Authenticated)","id":"3481c129-88f7-4dbe-9142-413a6cd8e25e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"https://monitor.ilheureux.dev/api/dashboard","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","dashboard"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[{"id":"1957d69f-d9d4-439a-a2df-e0941fb45d7e","name":"200 — Authenticated (with restarts)","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"https://monitor.ilheureux.dev/api/dashboard"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"servers\": [\n    {\n      \"serverId\": 1,\n      \"serverName\": \"Hostinger VPS\",\n      \"lastSeenAt\": \"2026-03-26T10:05:00Z\",\n      \"isStale\": false,\n      \"latestMetrics\": {\n        \"cpuUserPct\": 3.2,\n        \"cpuSystemPct\": 1.1,\n        \"cpuStealPct\": 0.0,\n        \"cpuIdlePct\": 95.7,\n        \"memTotalMb\": 8192,\n        \"memUsedMb\": 2340,\n        \"memAvailableMb\": 5852\n      },\n      \"services\": [\n        {\n          \"serviceName\": \"calvary-checkin\",\n          \"isActive\": true,\n          \"cpuPct\": 1.4,\n          \"memoryMb\": 118,\n          \"pid\": 12345\n        }\n      ],\n      \"recentRestarts\": [\n        {\n          \"id\": 42,\n          \"serverName\": \"Hostinger VPS\",\n          \"serviceName\": \"calvary-checkin\",\n          \"reason\": \"memory_threshold\",\n          \"details\": \"RSS 523MB exceeded 500MB threshold\",\n          \"restartedAt\": \"2026-03-26T09:15:00Z\"\n        }\n      ]\n    }\n  ]\n}"}],"_postman_id":"3481c129-88f7-4dbe-9142-413a6cd8e25e"}],"id":"93ae9c8a-1c85-4c5e-94ac-b8fc4baacfe6","description":"<p>Aggregated current status for all monitored servers. The dashboard endpoint is publicly accessible but strips sensitive data (recent restarts) for unauthenticated requests.</p>\n","_postman_id":"93ae9c8a-1c85-4c5e-94ac-b8fc4baacfe6","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}}},{"name":"Metrics Ingestion","item":[{"name":"Post System Metrics","id":"3b8026fb-f165-4bfe-a024-0f49d51f896f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-Api-Key","value":"","description":"<p>Server API key (generated at registration, SHA256-hashed in DB)</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"recordedAt\": \"2026-03-26T10:05:00Z\",\n  \"system\": {\n    \"cpuUserPct\": 3.2,\n    \"cpuSystemPct\": 1.1,\n    \"cpuStealPct\": 0.0,\n    \"cpuIdlePct\": 95.7,\n    \"memTotalMb\": 8192,\n    \"memUsedMb\": 2340,\n    \"memAvailableMb\": 5852,\n    \"swapUsedMb\": 0,\n    \"loadAvg1\": 0.12,\n    \"loadAvg5\": 0.08,\n    \"loadAvg15\": 0.05\n  },\n  \"services\": [\n    {\n      \"name\": \"calvary-checkin\",\n      \"isActive\": true,\n      \"cpuPct\": 1.4,\n      \"memoryMb\": 118,\n      \"pid\": 12345\n    },\n    {\n      \"name\": \"ohpm-giving\",\n      \"isActive\": true,\n      \"cpuPct\": 0.8,\n      \"memoryMb\": 101,\n      \"pid\": 12346\n    },\n    {\n      \"name\": \"bible-memory\",\n      \"isActive\": true,\n      \"cpuPct\": 0.2,\n      \"memoryMb\": 72,\n      \"pid\": 12347\n    },\n    {\n      \"name\": \"poker\",\n      \"isActive\": true,\n      \"cpuPct\": 0.1,\n      \"memoryMb\": 10,\n      \"pid\": 12348\n    },\n    {\n      \"name\": \"vps-monitor\",\n      \"isActive\": true,\n      \"cpuPct\": 1.0,\n      \"memoryMb\": 218,\n      \"pid\": 12349\n    },\n    {\n      \"name\": \"di-checkin\",\n      \"isActive\": true,\n      \"cpuPct\": 0.5,\n      \"memoryMb\": 115,\n      \"pid\": 12350\n    }\n  ]\n}"},"url":"https://monitor.ilheureux.dev/api/metrics","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","metrics"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[{"id":"9e9bc325-9354-43e8-8995-bcd8626132ea","name":"200 — Metrics ingested","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-Api-Key","value":"","description":"Server API key (generated at registration, SHA256-hashed in DB)"}],"body":{"mode":"raw","raw":"{\n  \"recordedAt\": \"2026-03-26T10:05:00Z\",\n  \"system\": {\n    \"cpuUserPct\": 3.2,\n    \"cpuSystemPct\": 1.1,\n    \"cpuStealPct\": 0.0,\n    \"cpuIdlePct\": 95.7,\n    \"memTotalMb\": 8192,\n    \"memUsedMb\": 2340,\n    \"memAvailableMb\": 5852,\n    \"swapUsedMb\": 0,\n    \"loadAvg1\": 0.12,\n    \"loadAvg5\": 0.08,\n    \"loadAvg15\": 0.05\n  },\n  \"services\": [\n    {\n      \"name\": \"calvary-checkin\",\n      \"isActive\": true,\n      \"cpuPct\": 1.4,\n      \"memoryMb\": 118,\n      \"pid\": 12345\n    },\n    {\n      \"name\": \"ohpm-giving\",\n      \"isActive\": true,\n      \"cpuPct\": 0.8,\n      \"memoryMb\": 101,\n      \"pid\": 12346\n    },\n    {\n      \"name\": \"bible-memory\",\n      \"isActive\": true,\n      \"cpuPct\": 0.2,\n      \"memoryMb\": 72,\n      \"pid\": 12347\n    },\n    {\n      \"name\": \"poker\",\n      \"isActive\": true,\n      \"cpuPct\": 0.1,\n      \"memoryMb\": 10,\n      \"pid\": 12348\n    },\n    {\n      \"name\": \"vps-monitor\",\n      \"isActive\": true,\n      \"cpuPct\": 1.0,\n      \"memoryMb\": 218,\n      \"pid\": 12349\n    },\n    {\n      \"name\": \"di-checkin\",\n      \"isActive\": true,\n      \"cpuPct\": 0.5,\n      \"memoryMb\": 115,\n      \"pid\": 12350\n    }\n  ]\n}"},"url":"https://monitor.ilheureux.dev/api/metrics"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":""},{"id":"01987ed0-3723-4a46-87bb-d06944684fd0","name":"401 — Invalid API key","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-Api-Key","value":"","description":"Server API key (generated at registration, SHA256-hashed in DB)"}],"body":{"mode":"raw","raw":"{\n  \"recordedAt\": \"2026-03-26T10:05:00Z\",\n  \"system\": {\n    \"cpuUserPct\": 3.2,\n    \"cpuSystemPct\": 1.1,\n    \"cpuStealPct\": 0.0,\n    \"cpuIdlePct\": 95.7,\n    \"memTotalMb\": 8192,\n    \"memUsedMb\": 2340,\n    \"memAvailableMb\": 5852,\n    \"swapUsedMb\": 0,\n    \"loadAvg1\": 0.12,\n    \"loadAvg5\": 0.08,\n    \"loadAvg15\": 0.05\n  },\n  \"services\": [\n    {\n      \"name\": \"calvary-checkin\",\n      \"isActive\": true,\n      \"cpuPct\": 1.4,\n      \"memoryMb\": 118,\n      \"pid\": 12345\n    },\n    {\n      \"name\": \"ohpm-giving\",\n      \"isActive\": true,\n      \"cpuPct\": 0.8,\n      \"memoryMb\": 101,\n      \"pid\": 12346\n    },\n    {\n      \"name\": \"bible-memory\",\n      \"isActive\": true,\n      \"cpuPct\": 0.2,\n      \"memoryMb\": 72,\n      \"pid\": 12347\n    },\n    {\n      \"name\": \"poker\",\n      \"isActive\": true,\n      \"cpuPct\": 0.1,\n      \"memoryMb\": 10,\n      \"pid\": 12348\n    },\n    {\n      \"name\": \"vps-monitor\",\n      \"isActive\": true,\n      \"cpuPct\": 1.0,\n      \"memoryMb\": 218,\n      \"pid\": 12349\n    },\n    {\n      \"name\": \"di-checkin\",\n      \"isActive\": true,\n      \"cpuPct\": 0.5,\n      \"memoryMb\": 115,\n      \"pid\": 12350\n    }\n  ]\n}"},"url":"https://monitor.ilheureux.dev/api/metrics"},"status":"Unauthorized","code":401,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"3b8026fb-f165-4bfe-a024-0f49d51f896f"},{"name":"Post Restart Event","id":"cc2b54b2-f54f-402d-87cc-ff818a8e20a3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-Api-Key","value":""}],"body":{"mode":"raw","raw":"{\n  \"serviceName\": \"calvary-checkin\",\n  \"reason\": \"memory_threshold\",\n  \"details\": \"RSS 523MB exceeded 500MB threshold (2nd consecutive check)\",\n  \"restartedAt\": \"2026-03-26T10:10:00Z\"\n}"},"url":"https://monitor.ilheureux.dev/api/metrics/restart","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","metrics","restart"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[{"id":"5be438b2-53ba-4b17-8a96-81dd5607cbe1","name":"200 — Restart logged","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-Api-Key","value":""}],"body":{"mode":"raw","raw":"{\n  \"serviceName\": \"calvary-checkin\",\n  \"reason\": \"memory_threshold\",\n  \"details\": \"RSS 523MB exceeded 500MB threshold (2nd consecutive check)\",\n  \"restartedAt\": \"2026-03-26T10:10:00Z\"\n}"},"url":"https://monitor.ilheureux.dev/api/metrics/restart"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"cc2b54b2-f54f-402d-87cc-ff818a8e20a3"}],"id":"1fbdac73-47fa-44e4-905d-ff97e2b9fd3a","description":"<p>Endpoints called by the <code>health-monitor.sh</code> cron script running on the VPS. Authenticated via API key (<code>X-Api-Key</code> header).</p>\n<p>The script runs every 5 minutes and POSTs system-level metrics (CPU, memory, load averages) plus per-service status (active/inactive, CPU%, memory, PID).</p>\n","_postman_id":"1fbdac73-47fa-44e4-905d-ff97e2b9fd3a","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}}},{"name":"Historical Metrics","item":[{"name":"Get System Metrics History","id":"0dd89ae6-5956-4d38-8a9e-b8a676525812","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"https://monitor.ilheureux.dev/api/metrics/1?from=2026-03-25T00:00:00Z&to=2026-03-26T23:59:59Z","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","metrics","1"],"host":["https://monitor.ilheureux.dev"],"query":[{"description":{"content":"<p>Start of date range (ISO 8601)</p>\n","type":"text/plain"},"key":"from","value":"2026-03-25T00:00:00Z"},{"description":{"content":"<p>End of date range (ISO 8601)</p>\n","type":"text/plain"},"key":"to","value":"2026-03-26T23:59:59Z"}],"variable":[]}},"response":[],"_postman_id":"0dd89ae6-5956-4d38-8a9e-b8a676525812"},{"name":"Get Per-Service Metrics History","id":"1ce6febb-63f4-4d69-a2d5-7751f0db0cba","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"https://monitor.ilheureux.dev/api/metrics/1/services?from=2026-03-25T00:00:00Z&to=2026-03-26T23:59:59Z","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","metrics","1","services"],"host":["https://monitor.ilheureux.dev"],"query":[{"key":"from","value":"2026-03-25T00:00:00Z"},{"key":"to","value":"2026-03-26T23:59:59Z"}],"variable":[]}},"response":[],"_postman_id":"1ce6febb-63f4-4d69-a2d5-7751f0db0cba"}],"id":"97b7fae5-a4b0-4ae6-b4b9-5648d4c44373","description":"<p>Query historical metrics for charting. Used by the React frontend's MetricsPage with Recharts time-series visualizations.</p>\n","_postman_id":"97b7fae5-a4b0-4ae6-b4b9-5648d4c44373","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}}},{"name":"Restart Events Log","item":[{"name":"Get Restart Events","id":"190da9d0-b763-46c0-b9cf-7c55b5f2e464","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"https://monitor.ilheureux.dev/api/restarts?page=1&pageSize=20","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","restarts"],"host":["https://monitor.ilheureux.dev"],"query":[{"disabled":true,"description":{"content":"<p>Filter by server ID</p>\n","type":"text/plain"},"key":"serverId","value":"1"},{"disabled":true,"description":{"content":"<p>Filter by service name</p>\n","type":"text/plain"},"key":"service","value":"calvary-checkin"},{"disabled":true,"description":{"content":"<p>Start date filter</p>\n","type":"text/plain"},"key":"from","value":"2026-03-20T00:00:00Z"},{"disabled":true,"description":{"content":"<p>End date filter</p>\n","type":"text/plain"},"key":"to","value":"2026-03-26T23:59:59Z"},{"description":{"content":"<p>Page number (1-based)</p>\n","type":"text/plain"},"key":"page","value":"1"},{"description":{"content":"<p>Results per page</p>\n","type":"text/plain"},"key":"pageSize","value":"20"}],"variable":[]}},"response":[{"id":"95652a30-3ddf-4ef1-9122-9faf9f45b001","name":"200 — Paginated results","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":{"raw":"https://monitor.ilheureux.dev/api/restarts?page=1&pageSize=20","host":["https://monitor.ilheureux.dev"],"path":["api","restarts"],"query":[{"key":"serverId","value":"1","description":"Filter by server ID","disabled":true},{"key":"service","value":"calvary-checkin","description":"Filter by service name","disabled":true},{"key":"from","value":"2026-03-20T00:00:00Z","description":"Start date filter","disabled":true},{"key":"to","value":"2026-03-26T23:59:59Z","description":"End date filter","disabled":true},{"key":"page","value":"1","description":"Page number (1-based)"},{"key":"pageSize","value":"20","description":"Results per page"}]}},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"items\": [\n    {\n      \"id\": 42,\n      \"serverName\": \"Hostinger VPS\",\n      \"serviceName\": \"calvary-checkin\",\n      \"reason\": \"memory_threshold\",\n      \"details\": \"RSS 523MB exceeded 500MB threshold (2nd consecutive check)\",\n      \"restartedAt\": \"2026-03-26T09:15:00Z\"\n    }\n  ],\n  \"totalCount\": 156,\n  \"page\": 1,\n  \"pageSize\": 20\n}"}],"_postman_id":"190da9d0-b763-46c0-b9cf-7c55b5f2e464"}],"id":"3f0601de-49fc-4249-a2cb-d401928ae681","description":"<p>Paginated restart event history with filtering. Powers the Logs page in the React frontend.</p>\n","_postman_id":"3f0601de-49fc-4249-a2cb-d401928ae681","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}}},{"name":"Servers","item":[{"name":"List Servers","id":"33dbc789-2f79-43a2-a533-c389be3e8527","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"https://monitor.ilheureux.dev/api/servers","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","servers"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[],"_postman_id":"33dbc789-2f79-43a2-a533-c389be3e8527"},{"name":"Register Server","id":"c4c75f68-4121-45f0-8930-9879a0a5c78a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Hostinger VPS\",\n  \"hostname\": \"vps.example.com\",\n  \"ipAddress\": \"187.77.0.238\"\n}"},"url":"https://monitor.ilheureux.dev/api/servers","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","servers"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[],"_postman_id":"c4c75f68-4121-45f0-8930-9879a0a5c78a"},{"name":"Deactivate Server","id":"dfadf31d-9db2-4500-986e-384eb7d4f067","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer "}],"url":"https://monitor.ilheureux.dev/api/servers/1","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","servers","1"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[],"_postman_id":"dfadf31d-9db2-4500-986e-384eb7d4f067"}],"id":"9d68373f-0ac9-40f8-8090-a1fdfcb11191","description":"<p>Server registration and management. Each server gets a unique API key for metric ingestion.</p>\n","_postman_id":"9d68373f-0ac9-40f8-8090-a1fdfcb11191","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}}},{"name":"Alerts","item":[{"name":"Get Alert Config","id":"375e6cf9-4f6a-432d-84f7-b64db629a0a9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"https://monitor.ilheureux.dev/api/alerts/config","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","alerts","config"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[],"_postman_id":"375e6cf9-4f6a-432d-84f7-b64db629a0a9"},{"name":"Update Alert Rule","id":"4849b80d-a5d1-455a-bb70-1774fb26d45b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"isEnabled\": true,\n  \"emailEnabled\": true,\n  \"smsEnabled\": false,\n  \"cooldownMinutes\": 30\n}"},"url":"https://monitor.ilheureux.dev/api/alerts/config/1","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","alerts","config","1"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[],"_postman_id":"4849b80d-a5d1-455a-bb70-1774fb26d45b"},{"name":"List Recipients","id":"9661ce8c-2b4f-46f0-9336-4e9043fca27a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer "}],"url":"https://monitor.ilheureux.dev/api/alerts/recipients","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","alerts","recipients"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[],"_postman_id":"9661ce8c-2b4f-46f0-9336-4e9043fca27a"},{"name":"Add Recipient","id":"81298623-1a7c-4ff4-82b0-10f471dc5684","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Immanuel\",\n  \"email\": \"admin@example.com\",\n  \"phoneE164\": \"+15551234567\"\n}"},"url":"https://monitor.ilheureux.dev/api/alerts/recipients","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","alerts","recipients"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[],"_postman_id":"81298623-1a7c-4ff4-82b0-10f471dc5684"},{"name":"Update Recipient","id":"0f4d9d75-505c-4604-83e9-633d66452d66","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer "}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Immanuel\",\n  \"email\": \"updated@example.com\",\n  \"phoneE164\": \"+15551234567\",\n  \"isActive\": true\n}"},"url":"https://monitor.ilheureux.dev/api/alerts/recipients/1","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","alerts","recipients","1"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[],"_postman_id":"0f4d9d75-505c-4604-83e9-633d66452d66"},{"name":"Delete Recipient","id":"75f48118-4b04-4ff2-b5ae-2ef38aa9752c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer "}],"url":"https://monitor.ilheureux.dev/api/alerts/recipients/1","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","alerts","recipients","1"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[],"_postman_id":"75f48118-4b04-4ff2-b5ae-2ef38aa9752c"},{"name":"Send Test Alert","id":"d77d5ba1-77e8-4ba1-b77f-93d89f4421f0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer "}],"url":"https://monitor.ilheureux.dev/api/alerts/test","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}},"urlObject":{"path":["api","alerts","test"],"host":["https://monitor.ilheureux.dev"],"query":[],"variable":[]}},"response":[],"_postman_id":"d77d5ba1-77e8-4ba1-b77f-93d89f4421f0"}],"id":"6d75864d-75b8-49e3-b9d7-9f08ac8fe8d0","description":"<p>Alert configuration and recipient management. Alerts are triggered on service restarts and threshold breaches, delivered via Gmail SMTP (email) with SMS support planned via Twilio.</p>\n","_postman_id":"6d75864d-75b8-49e3-b9d7-9f08ac8fe8d0","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]},"isInherited":true,"source":{"_postman_id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","id":"dce082ee-d704-47c3-9500-6ceaeb1938fc","name":"VPS Monitor API","type":"collection"}}}],"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":""}]}},"variable":[{"key":"baseUrl","value":"https://monitor.ilheureux.dev"},{"key":"token","value":""},{"key":"apiKey","value":""},{"key":"serverId","value":"1"}]}