GuidesClient
Admin
adminApi — user management, audit-log queries, and platform invites for an admin dashboard, built on the apiRequest helper.
Admin client
Wraps every endpoint from the Admin and Audit Logs guides into adminApi, built on the apiRequest helper. Every call here 403s unless the logged-in user has role: "admin" — this is for an admin dashboard, not a regular app surface.
import { apiRequest } from "./client";
const API_BASE = "https://api.myapp.com";
export const adminApi = {
login: (email: string, password: string) =>
apiRequest(API_BASE, "POST", "/auth/admin/login", { email, password }),
listUsers: (params: Record<string, string | number> = {}) =>
apiRequest(API_BASE, "GET", `/admin/users?${new URLSearchParams(params as Record<string, string>)}`),
getUser: (userId: string) => apiRequest(API_BASE, "GET", `/admin/users/${userId}`),
createUser: (input: { email: string; password: string; name: string; role?: "user" | "admin" }) =>
apiRequest(API_BASE, "POST", "/admin/users", input),
updateRole: (userId: string, role: "user" | "admin") =>
apiRequest(API_BASE, "PATCH", `/admin/users/${userId}/role`, { role }),
ban: (userId: string) => apiRequest(API_BASE, "PATCH", `/admin/users/${userId}/ban`),
unban: (userId: string) => apiRequest(API_BASE, "PATCH", `/admin/users/${userId}/unban`),
deleteUser: (userId: string) => apiRequest(API_BASE, "DELETE", `/admin/users/${userId}`),
listUserSessions: (userId: string, offset = 0, limit = 20) =>
apiRequest(API_BASE, "GET", `/admin/users/${userId}/sessions?offset=${offset}&limit=${limit}`),
revokeUserSession: (userId: string, sessionId: string) =>
apiRequest(API_BASE, "DELETE", `/admin/users/${userId}/sessions/${sessionId}`),
revokeUserSessions: (userId: string) =>
apiRequest(API_BASE, "DELETE", `/admin/users/${userId}/sessions`),
// --- Audit logs — requires WithAudit(AuditConfig{Enabled: true}) server-side ---
listAuditLogs: (params: Record<string, string | number> = {}) =>
apiRequest(API_BASE, "GET", `/admin/audit-logs?${new URLSearchParams(params as Record<string, string>)}`),
listUserAuditLogs: (userId: string, params: Record<string, string | number> = {}) =>
apiRequest(API_BASE, "GET", `/admin/users/${userId}/audit-logs?${new URLSearchParams(params as Record<string, string>)}`),
// --- Platform invites — requires RegistrationConfig.EnableInvite ---
createInvite: (email: string) => apiRequest(API_BASE, "POST", "/admin/invites", { email }),
listInvites: (params: Record<string, string | number> = {}) =>
apiRequest(API_BASE, "GET", `/admin/invites?${new URLSearchParams(params as Record<string, string>)}`),
revokeInvite: (inviteId: string) => apiRequest(API_BASE, "DELETE", `/admin/invites/${inviteId}`),
resendInvite: (inviteId: string) => apiRequest(API_BASE, "POST", `/admin/invites/${inviteId}/resend`),
deleteInvite: (inviteId: string) => apiRequest(API_BASE, "DELETE", `/admin/invites/${inviteId}/hard`),
};Using it
const { users, total } = await adminApi.listUsers({ limit: 20, search: "ada" });try {
await adminApi.updateRole(userId, "user");
} catch (err) {
// last_admin — see the Admin guide
showError(err.message ?? err.error);
}Audit logs
const { events, total } = await adminApi.listAuditLogs({ event_type: "login.failed", limit: 50 });try {
await adminApi.listAuditLogs();
} catch (err) {
// 404 audit_not_configured if WithAudit was never enabled server-side
}Platform invites
const invite = await adminApi.createInvite("ada@example.com");
const { invites, total } = await adminApi.listInvites({ status: "pending" });
await adminApi.resendInvite(invite.id); // issues a fresh code, invalidates the old oneNext
- Setup — the
apiRequesthelper this is built on - Admin — full request/response/error reference
- Audit Logs — event types and filter params