{"endpoints":["GET /healthz","GET /api/v1/instruments?kind=lme_metal_outright","GET /api/v1/lives/latest","GET /api/v1/lives/history?instrument=155.3.CADF1-R3M&minutes=60","GET /api/v1/lives/cash-implied/latest","GET /api/v1/spreads/history?instrument=155.13.CA123793&minutes=60","GET /api/v1/forex/history?instrument=240.20.EURUSDCOMP&minutes=60","GET /api/v1/precious/history?instrument=XAU_USD&hours=24","GET /api/v1/ferrous/history?instrument=155.3.SCDF1-D2726G&hours=24","GET /api/v1/premiums/latest","GET /api/v1/premiums/history?instrument=155.3.EADF1-D3026J&hours=24","GET /api/v1/officials/latest","GET /api/v1/officials/history?instrument=155.3.CADF2-RCASH&days=30","GET /api/v1/stocks/latest","GET /api/v1/stocks/history?instrument=155.18.*LMESS&days=30","GET /api/v1/bars/intraday?instrument=155.3.CADF1-R3M&hours=24","GET /api/v1/bars/historical?instrument=155.3.CADF1-R3M&days=30","GET /api/v1/ecb-rates?days=30","GET /api/v1/fixings/latest","GET /api/v1/fixings/history?instrument=155.20.EURUSDE-DYSPOT&days=30","GET /api/v1/forward-quotes/latest","GET /api/v1/grabber-state","POST /api/v1/auth/login   — body: {email,password,device_id} → returns bearer token + password_must_change flag","GET  /api/v1/auth/me      — returns current user (Bearer + x-device-id required)","POST /api/v1/auth/logout  — revokes current session","POST /api/v1/auth/change-password — body: {old_password, new_password}, clears password_must_change, revokes other sessions","POST /api/v1/auth/accept-terms — body: {version}, records T&Cs acceptance for LME audit","POST /api/admin/users/:id/subscription — body: {subscription: none|n|rn|rd|rt}, sets subscriber package","POST /api/admin/users/:id/roles — body: {roles: [\"admin\"|\"partner_admin\"|…]}; sets the user's roles (admin/partner_admin mutually exclusive)","GET  /api/admin/entitlement-report?from=…&to=… — aggregated subscriber data accesses (LME monthly report)","POST /api/admin/users     — admin creates user (admin role)","POST /api/admin/users/:id/reset-password — rotate user's password to a fresh temp value, revoke sessions, force change on next login (returned once)","POST /api/admin/users/:id/force-password-change — set password_must_change=TRUE and revoke sessions (user keeps existing pw to log in once)","PUT  /api/admin/users/:id/identity — partial update of LME-compliance identity record (first/last name, address, country, etc.)","POST /api/admin/onboard   — admin onboards partner: creates user + subscription + welcome/credentials email templates","GET  /api/admin/usage     — per-user/per-day/per-data_kind request counts for the operator usage chart","GET  /api/admin/users/:id/scrap-configs — operator-only read of one user's saved formulas + last result (audit-logged)","GET  /api/admin/users/:id/stream-configs — operator-only read of one user's saved stream configs (audit-logged)","GET  /api/admin/users/:id/audit-log?limit=N — per-user audit trail (inbound + outbound); operator surface for the Audit tab","GET  /api/admin/docs-credential — current docs-Basic user + masked password + last rotation","POST /api/admin/docs-credential/rotate — generate or set a new docs password; takes effect immediately (no restart)","GET  /api/admin/partners — list of partners + computed user count (read-only)","GET  /api/admin/partners/:id — single partner detail + users + last 50 audit_log rows (read-only)","POST /api/admin/partners — admin creates a partner (name, contact_email, default_subscription, max_subscription, max_users)","PATCH /api/admin/partners/:id — admin updates partner fields (validates max_users >= user count, max_subscription >= existing user subs)","POST /api/admin/partners/:id/status — admin suspend/reactivate; suspended partners cannot onboard new users","GET  /api/v1/partners/me — caller's partner row (partner_admin only)","GET  /api/v1/partners/me/users — list of users under caller's partner_id (partner_admin only)","POST /api/v1/partners/me/users — partner-self-onboard end-user (partner_admin only; subscription clamped to partners.max_subscription, max_users enforced)","POST /api/v1/partners/me/users/:id/sessions/revoke-all — revoke own end-user's sessions (partner_admin only)","GET  /api/v1/partners/me/users/:id/audit-log?limit=N — per-user audit trail scoped to caller's partner (partner_admin only)","POST /api/v1/partners/me/users/:id/subscription — set end-user subscription, server-clamped to partner.max_subscription (partner_admin only)","POST /api/v1/partners/me/users/:id/reset-password — rotate end-user password + revoke sessions, returns temp pw once (partner_admin only)","POST /api/v1/partners/me/users/:id/force-password-change — flag end-user for pw rotation + revoke sessions (partner_admin only)","POST /api/v1/partners/me/users/:id/force-accept-terms — clear end-user terms acceptance (partner_admin only)","PUT  /api/v1/partners/me/users/:id/identity — partial update of end-user LME-compliance identity (partner_admin only; 404 cross-partner)","POST /api/v1/scrap-prices/calculate — body: ScrapConfig JSON (user auth required)","POST /api/v1/scrap-prices/configs — save formula (user auth)","GET  /api/v1/scrap-prices/configs — list saved formulas","GET  /api/v1/scrap-prices/configs/:id — fetch one + latest result","PUT  /api/v1/scrap-prices/configs/:id — update + recompute","DELETE /api/v1/scrap-prices/configs/:id — remove","GET  /api/v1/scrap-prices/sides — canonical (source, side) validity matrix (PUBLIC, no auth)","GET  /api/v1/scrap-prices/stream — SSE: realtime result updates for this user","POST /api/v1/stream-configs — save a named bundle of instrument slugs (user auth)","GET  /api/v1/stream-configs — list caller's saved stream configs","GET  /api/v1/stream-configs/:id — fetch one saved stream config (with instruments)","PUT  /api/v1/stream-configs/:id — partial update (name and/or instruments)","DELETE /api/v1/stream-configs/:id — remove a saved stream config","WS  /api/v1/stream — subscribe to live tick events"],"service":"mq-api","version":"0.6.1"}