{ "opencollection": "1.0.0", "info": { "name": "QaaS Backend admin API", "version": "1.0.0" }, "items": [ { "info": { "name": "admin", "type": "folder" }, "items": [ { "info": { "name": "Admin Observability Config", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/admin/config", "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "Admin UI runtime config: whether the Grafana observability link is live and\nits URL. Read from env (GRAFANA_PROXY_*); flip without a rebuild. Admin-gated\nby the router so the URL is never exposed to non-admins." }, { "info": { "name": "Admin Grafana Session", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/admin/grafana-session", "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "Mint a one-time ticket for the Grafana proxy. A new-tab navigation to\n/grafana/ can't carry the JWT Authorization header, so the SPA calls this\n(authenticated XHR), then opens /grafana/?__t=; the proxy exchanges\nthe ticket for a scoped HttpOnly session cookie." }, { "info": { "name": "Health Check Details", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/admin/health", "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "Detailed health check with component status (admin only).\n\nPublic liveness probe lives at GET /health; this endpoint exposes per-component\ndetail and is gated behind the admin role at the router level." }, { "info": { "name": "Get Metrics", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/admin/metrics", "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "Get current aggregated metrics (admin only)." }, { "info": { "name": "Debug Publish Webserver Metric", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/admin/debug/publish-webserver-metric", "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "Debug endpoint to test webserver metrics publishing (admin only)." }, { "info": { "name": "Get Service Maintenance Status", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/admin/services/:service_name/maintenance", "params": [ { "name": "service_name", "value": "", "type": "path" } ], "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "Return current maintenance status for a service (admin-only)." }, { "info": { "name": "Enable Service Maintenance", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/admin/services/:service_name/maintenance/enable", "params": [ { "name": "service_name", "value": "", "type": "path" }, { "name": "ttl_seconds", "value": "", "type": "query", "description": "Optional TTL in seconds for auto-disable" } ], "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "Enable maintenance mode for a service.\n\nWhile in maintenance the service stops claiming new tasks. The optional\nttl_seconds causes the maintenance flag to auto-clear after that many\nseconds. The maintenance_updates_subscription_task background watcher\nwill broadcast the change over WebSocket via Redis keyspace notifications." }, { "info": { "name": "Disable Service Maintenance", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/admin/services/:service_name/maintenance/disable", "params": [ { "name": "service_name", "value": "", "type": "path" } ], "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "Disable maintenance mode for a service.\n\nClears the control key so the service resumes claiming tasks. The\nmaintenance_updates_subscription_task background watcher will\nbroadcast the change over WebSocket via Redis keyspace notifications." }, { "info": { "name": "List Users", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/admin/users", "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "Get all users from database (admin only)." }, { "info": { "name": "Update User", "type": "http" }, "http": { "method": "PUT", "url": "{{baseUrl}}/admin/users/:user_id", "params": [ { "name": "user_id", "value": "", "type": "path" } ], "body": { "type": "json", "data": "{}" }, "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "Update user details (admin only)." }, { "info": { "name": "Delete User", "type": "http" }, "http": { "method": "DELETE", "url": "{{baseUrl}}/admin/users/:user_id", "params": [ { "name": "user_id", "value": "", "type": "path" } ], "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "Delete a user (admin only)." }, { "info": { "name": "List Registration Requests", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/admin/registration-requests", "params": [ { "name": "status", "value": "", "type": "query", "description": "Comma-separated subset of pending,verified,confirmed,rejected,verification_expired. Defaults to 'verified' (the rows admins can act on)." }, { "name": "search", "value": "", "type": "query", "description": "Case-insensitive substring search across first_name, last_name, email, organization." }, { "name": "limit", "value": "", "type": "query" }, { "name": "offset", "value": "", "type": "query" } ], "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "List registration requests for the admin Pending Users tab.\n\nSorted by created_at DESC so newest submissions surface first." }, { "info": { "name": "Confirm Registration Request", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/admin/registration-requests/:req_id/confirm", "params": [ { "name": "req_id", "value": "", "type": "path" } ], "body": { "type": "json", "data": "{}" }, "auth": { "type": "bearer", "token": "{{bearerToken}}" } }, "docs": "Mark a verified registration request as admin-confirmed.\n\nBody (optional)::\n\n {\"notes\": \"Saw them at QIP poster session\"}\n\nThe endpoint records the admin event (confirmed_at, confirmed_by,\noptional notes) and flips status verified -> confirmed. The\nsubscription_manager worker then creates the matching user row and\ndrafts a welcome email; the API does not block on either.\n\nIdempotency: any non-verified state returns 409. Race-safe via the\npre-update WHERE clause." } ] } ], "bundled": true }