API Reference

Platform & Administration API

Cross-cutting platform administration — tenants, identity & RBAC, licensing, settings, audit, and support. Auto-generated from the platform OpenAPI schema so it matches the running API.

REST API for this feature — 151 operations across 107 resource paths, auto-generated from the platform's live OpenAPI schema (drf-spectacular).

Base URL https://<your-versus-host>/api · Auth Authorization: Bearer <JWT> (from POST /api/auth/token/) · 📄 Download the OpenAPI spec for Postman/Insomnia/Swagger · see the API overview for pagination, filtering, and errors.

Activation

POST /api/activation/v1/activate

§3.1 — exchange a one-time activation code for a node-bound .veslic.

Responses: 200

GET /api/activation/v1/issued

Recent issued licenses + their activation state, for the Control Plane.

Responses: 200

POST /api/activation/v1/mint-code

Mint a fresh activation code for an existing issued license.

Responses: 200

POST /api/activation/v1/revoke

Revoke an issued license — connected installs go read-only on next heartbeat.

Responses: 200

POST /api/activation/v1/validate

§3.2 — heartbeat: state / revocation / superseding token, signed.

Responses: 200


Ai

POST /api/ai/analyze-device/

Create analyze device

Responses: 200

POST /api/ai/analyze-screen/

Vision + live-state helper. Looks at a screenshot of the app and, using RBAC-scoped

Responses: 200

POST /api/ai/analyze-waf/

Create analyze waf

Responses: 200

POST /api/ai/appbuilder-build/

App Builder AI that actually creates app components from a description.

Responses: 200

POST /api/ai/appbuilder-chat/

App Builder AI guide — walks admins through building Versus apps.

Responses: 200

POST /api/ai/chat/

Create chat

Responses: 200

POST /api/ai/generate-report/

Create generate report

Responses: 200

POST /api/ai/panel-chat/

Streaming-compatible chat with automatic environment context injection.

Responses: 200

POST /api/ai/suggest-irule/

Create suggest irule

Responses: 200


Audit log

GET /api/audit-log/

Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated

ParameterInRequiredTypeDescription
actionquerynostring* create - Create
orderingquerynostringWhich field to use when ordering the results.
pagequerynointegerA page number within the paginated result set.
page_sizequerynointegerNumber of results to return per page.
resource_typequerynostring
searchquerynostringA search term.
userquerynostring

Responses: 200 → PaginatedAuditList

GET /api/audit-log/{id}/

Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this audit.

Responses: 200 → Audit


Auth

GET /api/auth/oidc/callback

List callbacks

Responses: 200

GET /api/auth/oidc/enabled

Public: lets the login page decide whether to show the SSO button.

Responses: 200

GET /api/auth/oidc/login

List logins

Responses: 200

GET /api/auth/oidc/logout

RP-initiated single logout (VS-SPEC-IDENTITY-PLATFORM-001 §7).

Responses: 200

POST /api/auth/saml/acs/

Assertion Consumer Service — receives the IdP POST after successful SSO.

Responses: 200

GET /api/auth/saml/login/

Redirects the browser to the IdP SSO URL.

Responses: 200

GET /api/auth/sso/callback

List callbacks

Responses: 200

GET /api/auth/sso/enabled

Public: lets the login page decide whether to show the SSO button.

Responses: 200

GET /api/auth/sso/login

List logins

Responses: 200

POST /api/auth/token/

Multi-backend login endpoint.

Responses: 200

POST /api/auth/token/refresh/

Takes a refresh type JSON web token and returns an access type JSON web

Request body (application/json): TokenRefreshRequest

Responses: 200 → TokenRefresh

POST /api/auth/totp/confirm/

Verifies the first code from an authenticator app against the

Responses: 200

POST /api/auth/totp/enroll/

Starts (or restarts) TOTP enrollment for the current user — issues

Responses: 200

GET /api/auth/totp/status/

Whether the current user has a confirmed authenticator — drives the

Responses: 200

POST /api/auth/totp/verify/

Completes login for a user LoginView returned mfa_required for.

Responses: 200


Auth backends

GET /api/auth-backends/

Configure pluggable auth backends. Super Admin only.

ParameterInRequiredTypeDescription
orderingquerynostringWhich field to use when ordering the results.
pagequerynointegerA page number within the paginated result set.
page_sizequerynointegerNumber of results to return per page.
searchquerynostringA search term.

Responses: 200 → PaginatedAuthBackendConfigList

POST /api/auth-backends/

Configure pluggable auth backends. Super Admin only.

Request body (application/json): AuthBackendConfigRequest

Responses: 201 → AuthBackendConfig

GET /api/auth-backends/status/

Return enabled/disabled state of all four backends.

Responses: 200 → AuthBackendConfig

GET /api/auth-backends/{id}/

Configure pluggable auth backends. Super Admin only.

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this auth backend config.

Responses: 200 → AuthBackendConfig

PUT /api/auth-backends/{id}/

Configure pluggable auth backends. Super Admin only.

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this auth backend config.

Request body (application/json): AuthBackendConfigRequest

Responses: 200 → AuthBackendConfig

PATCH /api/auth-backends/{id}/

Configure pluggable auth backends. Super Admin only.

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this auth backend config.

Request body (application/json): PatchedAuthBackendConfigRequest

Responses: 200 → AuthBackendConfig

DELETE /api/auth-backends/{id}/

Configure pluggable auth backends. Super Admin only.

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this auth backend config.

Responses: 204

POST /api/auth-backends/{id}/import_idp_metadata/

Parse IdP SAML metadata XML (or fetch from URL) and return extracted fields.

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this auth backend config.

Request body (application/json): AuthBackendConfigRequest

Responses: 200 → AuthBackendConfig

GET /api/auth-backends/{id}/sp_metadata/

Generate SAML SP metadata XML from the saved config.

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this auth backend config.

Responses: 200 → AuthBackendConfig

POST /api/auth-backends/{id}/test/

Test connectivity for a backend without saving credentials.

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this auth backend config.

Request body (application/json): AuthBackendConfigRequest

Responses: 200 → AuthBackendConfig


Client tools

GET /api/client-tools/

List client tools

ParameterInRequiredTypeDescription
orderingquerynostringWhich field to use when ordering the results.
searchquerynostringA search term.

Responses: 200 → ClientTool[]

POST /api/client-tools/

Create client tool

Request body (application/json): ClientToolRequest

Responses: 201 → ClientTool

GET /api/client-tools/{filename}/

Retrieve client tool

ParameterInRequiredTypeDescription
filenamepathyesstring

Responses: 200 → ClientTool

PUT /api/client-tools/{filename}/

Update client tool

ParameterInRequiredTypeDescription
filenamepathyesstring

Request body (application/json): ClientToolRequest

Responses: 200 → ClientTool

PATCH /api/client-tools/{filename}/

Update client tool

ParameterInRequiredTypeDescription
filenamepathyesstring

Request body (application/json): PatchedClientToolRequest

Responses: 200 → ClientTool

DELETE /api/client-tools/{filename}/

Delete client tool

ParameterInRequiredTypeDescription
filenamepathyesstring

Responses: 204

GET /api/client-tools/{filename}/download/

Download: client tool

ParameterInRequiredTypeDescription
filenamepathyesstring

Responses: 200 → ClientTool


Clients

GET /api/clients/

Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated

ParameterInRequiredTypeDescription
orderingquerynostringWhich field to use when ordering the results.
pagequerynointegerA page number within the paginated result set.
page_sizequerynointegerNumber of results to return per page.
searchquerynostringA search term.

Responses: 200 → PaginatedClientList

POST /api/clients/

Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated

Request body (application/json): ClientRequest

Responses: 201 → Client

GET /api/clients/{id}/

Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this client.

Responses: 200 → Client

PUT /api/clients/{id}/

Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this client.

Request body (application/json): ClientRequest

Responses: 200 → Client

PATCH /api/clients/{id}/

Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this client.

Request body (application/json): PatchedClientRequest

Responses: 200 → Client

DELETE /api/clients/{id}/

Deploy-safe base for making an existing DRF ModelViewSet tenant-isolated

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this client.

Responses: 204


Default roles

GET /api/default-roles/

Default roles are system-defined and read-only from the API.

ParameterInRequiredTypeDescription
orderingquerynostringWhich field to use when ordering the results.
pagequerynointegerA page number within the paginated result set.
page_sizequerynointegerNumber of results to return per page.
searchquerynostringA search term.

Responses: 200 → PaginatedDefaultRoleList

GET /api/default-roles/permissions_list/

Return the full list of available permission strings.

Responses: 200 → DefaultRole

GET /api/default-roles/{id}/

Default roles are system-defined and read-only from the API.

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this default role.

Responses: 200 → DefaultRole


Group mappings

GET /api/group-mappings/

List group mappings

ParameterInRequiredTypeDescription
default_rolequerynointeger
orderingquerynostringWhich field to use when ordering the results.
pagequerynointegerA page number within the paginated result set.
page_sizequerynointegerNumber of results to return per page.
providerquerynostring* ldap - AD / LDAP
scoped_rolequerynointeger
searchquerynostringA search term.

Responses: 200 → PaginatedGroupMappingList

POST /api/group-mappings/

Create group mapping

Request body (application/json): GroupMappingRequest

Responses: 201 → GroupMapping

GET /api/group-mappings/{id}/

Retrieve group mapping

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this group mapping.

Responses: 200 → GroupMapping

PUT /api/group-mappings/{id}/

Update group mapping

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this group mapping.

Request body (application/json): GroupMappingRequest

Responses: 200 → GroupMapping

PATCH /api/group-mappings/{id}/

Update group mapping

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this group mapping.

Request body (application/json): PatchedGroupMappingRequest

Responses: 200 → GroupMapping

DELETE /api/group-mappings/{id}/

Delete group mapping

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this group mapping.

Responses: 204


Import jobs

GET /api/import-jobs/

List import jobs

ParameterInRequiredTypeDescription
devicequerynointeger
orderingquerynostringWhich field to use when ordering the results.
pagequerynointegerA page number within the paginated result set.
page_sizequerynointegerNumber of results to return per page.
searchquerynostringA search term.
statusquerynostring* pending - Pending

Responses: 200 → PaginatedDeviceImportJobList

GET /api/import-jobs/{id}/

Retrieve import job

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this device import job.

Responses: 200 → DeviceImportJob


Internal

POST /api/internal/idp/confirm-totp

Create confirm totp

Responses: 200

POST /api/internal/idp/enroll-totp

Create enroll totp

Responses: 200

GET /api/internal/idp/userinfo

List userinfos

Responses: 200

POST /api/internal/idp/verify-password

Create verify password

Responses: 200

POST /api/internal/idp/verify-totp

Create verify totp

Responses: 200


Licensing

POST /api/licensing/activate

Online activation: exchange an activation code for a node-bound license

Responses: 200

POST /api/licensing/apply

Create apply

Responses: 200

GET /api/licensing/fingerprint

List fingerprints

Responses: 200

POST /api/licensing/issue

Sign a new license token (issuer side). The Ed25519 private key comes from

Responses: 200

GET /api/licensing/issue-meta

Form metadata for the Control Plane license generator: the feature

Responses: 200

GET /api/licensing/pricing

Reference pricing model for the quote generator (units, bands, discounts).

Responses: 200

GET /api/licensing/pricing-config

Read / edit / reset the quote Rate Card. GET returns the effective config

Responses: 200

PUT /api/licensing/pricing-config

Read / edit / reset the quote Rate Card. GET returns the effective config

Responses: 200

DELETE /api/licensing/pricing-config

Read / edit / reset the quote Rate Card. GET returns the effective config

Responses: 204

POST /api/licensing/quote

Price a quote from per-module quantities + bundle + term.

Responses: 200

POST /api/licensing/quote.xlsx

Return the quote as a Versus-branded .xlsx download.

Responses: 200

GET /api/licensing/status

List status

Responses: 200

POST /api/licensing/validate

'Check now' — run one heartbeat against the license server and return the

Responses: 200


Options

GET /api/options/{provider}/

Dynamic options provider for form fields.

ParameterInRequiredTypeDescription
providerpathyesstring

Responses: 200


Public

GET /api/public/kb/{public_slug}/{page_slug}/

UNAUTHENTICATED read-only page render (spec §7/§9 rule 6).

ParameterInRequiredTypeDescription
page_slugpathyesstring
public_slugpathyesstring

Responses: 200

POST /api/public/v1/set-password

Public invite completion for Versus-IdP tenants (POST

Responses: 200

POST /api/public/v1/tenant-registrations/{token}/

Public registration completion (spec §2.4 steps 1-2) — POST

ParameterInRequiredTypeDescription
tokenpathyesstring

Responses: 200

POST /api/public/v1/tenant-requests

Public intake (spec §2.1) — POST /api/public/v1/tenant-requests.

Responses: 200


Role assignments

GET /api/role-assignments/

Manage manual scoped-role assignments to specific users.

ParameterInRequiredTypeDescription
assignment_sourcequerynostring* group_match - Group Match
orderingquerynostringWhich field to use when ordering the results.
pagequerynointegerA page number within the paginated result set.
page_sizequerynointegerNumber of results to return per page.
scoped_rolequerynointeger
searchquerynostringA search term.
userquerynointeger

Responses: 200 → PaginatedUserRoleAssignmentList

POST /api/role-assignments/

Manage manual scoped-role assignments to specific users.

Request body (application/json): UserRoleAssignmentRequest

Responses: 201 → UserRoleAssignment

GET /api/role-assignments/for-user/{user_id}/

Manage manual scoped-role assignments to specific users.

ParameterInRequiredTypeDescription
user_idpathyesstring

Responses: 200 → UserRoleAssignment

GET /api/role-assignments/{id}/

Manage manual scoped-role assignments to specific users.

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this user role assignment.

Responses: 200 → UserRoleAssignment

PUT /api/role-assignments/{id}/

Manage manual scoped-role assignments to specific users.

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this user role assignment.

Request body (application/json): UserRoleAssignmentRequest

Responses: 200 → UserRoleAssignment

PATCH /api/role-assignments/{id}/

Manage manual scoped-role assignments to specific users.

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this user role assignment.

Request body (application/json): PatchedUserRoleAssignmentRequest

Responses: 200 → UserRoleAssignment

DELETE /api/role-assignments/{id}/

Manage manual scoped-role assignments to specific users.

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this user role assignment.

Responses: 204


Roles

GET /api/roles/

List roles

ParameterInRequiredTypeDescription
orderingquerynostringWhich field to use when ordering the results.
pagequerynointegerA page number within the paginated result set.
page_sizequerynointegerNumber of results to return per page.
searchquerynostringA search term.

Responses: 200 → PaginatedRoleList

POST /api/roles/

Create role

Request body (application/json): RoleRequest

Responses: 201 → Role

GET /api/roles/{id}/

Retrieve role

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this role.

Responses: 200 → Role

PUT /api/roles/{id}/

Update role

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this role.

Request body (application/json): RoleRequest

Responses: 200 → Role

PATCH /api/roles/{id}/

Update role

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this role.

Request body (application/json): PatchedRoleRequest

Responses: 200 → Role

DELETE /api/roles/{id}/

Delete role

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this role.

Responses: 204


Scoped roles

GET /api/scoped-roles/

List scoped roles

ParameterInRequiredTypeDescription
orderingquerynostringWhich field to use when ordering the results.
pagequerynointegerA page number within the paginated result set.
page_sizequerynointegerNumber of results to return per page.
searchquerynostringA search term.

Responses: 200 → PaginatedScopedRoleList

POST /api/scoped-roles/

Create scoped role

Request body (application/json): ScopedRoleWriteRequest

Responses: 201 → ScopedRoleWrite

GET /api/scoped-roles/{id}/

Retrieve scoped role

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this scoped role.

Responses: 200 → ScopedRole

PUT /api/scoped-roles/{id}/

Update scoped role

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this scoped role.

Request body (application/json): ScopedRoleWriteRequest

Responses: 200 → ScopedRoleWrite

PATCH /api/scoped-roles/{id}/

Update scoped role

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this scoped role.

Request body (application/json): PatchedScopedRoleWriteRequest

Responses: 200 → ScopedRoleWrite

DELETE /api/scoped-roles/{id}/

Delete scoped role

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this scoped role.

Responses: 204

GET /api/scoped-roles/{id}/assignments/

Assignments: scoped role

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this scoped role.

Responses: 200 → ScopedRole


Search

GET /api/search/

List searchs

Responses: 200


Settings

GET /api/settings/

List settings

ParameterInRequiredTypeDescription
orderingquerynostringWhich field to use when ordering the results.
pagequerynointegerA page number within the paginated result set.
page_sizequerynointegerNumber of results to return per page.
searchquerynostringA search term.

Responses: 200 → PaginatedSystemSettingsList

POST /api/settings/

Create setting

Request body (application/json): SystemSettingsRequest

Responses: 201 → SystemSettings

POST /api/settings/bulk_update/

Create bulk update

Request body (application/json): SystemSettingsRequest

Responses: 200 → SystemSettings

GET /api/settings/{id}/

Retrieve setting

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this system settings.

Responses: 200 → SystemSettings

PUT /api/settings/{id}/

Update setting

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this system settings.

Request body (application/json): SystemSettingsRequest

Responses: 200 → SystemSettings

PATCH /api/settings/{id}/

Update setting

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this system settings.

Request body (application/json): PatchedSystemSettingsRequest

Responses: 200 → SystemSettings

DELETE /api/settings/{id}/

Delete setting

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this system settings.

Responses: 204


Support

POST /api/support/ask/

POST /api/support/ask/ {question, conversation_id?}

Responses: 200

POST /api/support/escalate/

POST /api/support/escalate/ {conversation_id, reason?}

Responses: 200

POST /api/support/public/ask/

POST /api/support/public/ask/ {question, conversation_id?}

Responses: 200


Tenant admin

GET /api/tenant-admin/meta/

/api/tenant-admin/meta/ — assignable roles + context for the console UI.

Responses: 200

GET /api/tenant-admin/users/

/api/tenant-admin/users/ — org-scoped user administration.

Responses: 200

POST /api/tenant-admin/users/

Invite a user: {email, first_name?, last_name?, role?}.

Responses: 201

DELETE /api/tenant-admin/users/{id}/

/api/tenant-admin/users/ — org-scoped user administration.

ParameterInRequiredTypeDescription
idpathyesstring

Responses: 204

POST /api/tenant-admin/users/{id}/deactivate/

/api/tenant-admin/users/ — org-scoped user administration.

ParameterInRequiredTypeDescription
idpathyesstring

Responses: 200

POST /api/tenant-admin/users/{id}/reactivate/

/api/tenant-admin/users/ — org-scoped user administration.

ParameterInRequiredTypeDescription
idpathyesstring

Responses: 200

POST /api/tenant-admin/users/{id}/role/

/api/tenant-admin/users/ — org-scoped user administration.

ParameterInRequiredTypeDescription
idpathyesstring

Responses: 200


Tenants

POST /api/tenants/eula/accept/

Records an immutable acceptance (spec §6) — body_sha256 is

Responses: 200

GET /api/tenants/eula/current/

The version a registration/login flow should show and require

Responses: 200

GET /api/tenants/my-entitlement/

The caller's tenant entitlement (VS-SPEC-SAAS-LICENSING-001) — the module

Responses: 200

GET /api/tenants/notes/

The RLS + envelope-encryption pilot's only endpoint. The queryset

ParameterInRequiredTypeDescription
orderingquerynostringWhich field to use when ordering the results.
pagequerynointegerA page number within the paginated result set.
page_sizequerynointegerNumber of results to return per page.
searchquerynostringA search term.

Responses: 200 → PaginatedTenantNoteList

POST /api/tenants/notes/

The RLS + envelope-encryption pilot's only endpoint. The queryset

Request body (application/json): TenantNoteRequest

Responses: 201 → TenantNote

GET /api/tenants/notes/{id}/

The RLS + envelope-encryption pilot's only endpoint. The queryset

ParameterInRequiredTypeDescription
idpathyesstringA UUID string identifying this tenant note.

Responses: 200 → TenantNote

PUT /api/tenants/notes/{id}/

The RLS + envelope-encryption pilot's only endpoint. The queryset

ParameterInRequiredTypeDescription
idpathyesstringA UUID string identifying this tenant note.

Request body (application/json): TenantNoteRequest

Responses: 200 → TenantNote

PATCH /api/tenants/notes/{id}/

The RLS + envelope-encryption pilot's only endpoint. The queryset

ParameterInRequiredTypeDescription
idpathyesstringA UUID string identifying this tenant note.

Request body (application/json): PatchedTenantNoteRequest

Responses: 200 → TenantNote

DELETE /api/tenants/notes/{id}/

The RLS + envelope-encryption pilot's only endpoint. The queryset

ParameterInRequiredTypeDescription
idpathyesstringA UUID string identifying this tenant note.

Responses: 204

GET /api/tenants/setup-status/

Tells the frontend whether the logged-in user still needs to finish

Responses: 200


Users

GET /api/users/

List users

ParameterInRequiredTypeDescription
is_activequerynoboolean
is_staffquerynoboolean
orderingquerynostringWhich field to use when ordering the results.
pagequerynointegerA page number within the paginated result set.
page_sizequerynointegerNumber of results to return per page.
searchquerynostringA search term.

Responses: 200 → PaginatedUserList

POST /api/users/

Create user

Request body (application/json): UserCreateRequest

Responses: 201 → UserCreate

GET /api/users/me/

List mes

Responses: 200 → User

PATCH /api/users/me/

Update me

Request body (application/json): PatchedUserRequest

Responses: 200 → User

GET /api/users/my-role-request/

List my role requests

Responses: 200 → User

POST /api/users/request-role/

Create request role

Request body (application/json): UserRequest

Responses: 200 → User

GET /api/users/role-requests/

List role requests

Responses: 200 → User

GET /api/users/{id}/

Retrieve user

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this user.

Responses: 200 → User

PUT /api/users/{id}/

Update user

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this user.

Request body (application/json): UserRequest

Responses: 200 → User

PATCH /api/users/{id}/

Update user

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this user.

Request body (application/json): PatchedUserRequest

Responses: 200 → User

DELETE /api/users/{id}/

Delete user

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this user.

Responses: 204

POST /api/users/{id}/reset-mfa/

Admin: clear a user's TOTP device so they can re-enrol — lockout

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this user.

Request body (application/json): UserRequest

Responses: 200 → User

POST /api/users/{id}/review-request/

Review request: user

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this user.

Request body (application/json): UserRequest

Responses: 200 → User

POST /api/users/{id}/set-role/

Set role: user

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this user.

Request body (application/json): UserRequest

Responses: 200 → User

POST /api/users/{id}/set_password/

Set password: user

ParameterInRequiredTypeDescription
idpathyesintegerA unique integer value identifying this user.

Request body (application/json): UserRequest

Responses: 200 → User


Auto-generated from drf-spectacular OpenAPI. Endpoint descriptions come from viewset docstrings/serializers; enriching those improves this page on the next generation.