Invite a user
POST
/v1/users/invite
const url = 'http://localhost:8080/v1/users/invite';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"email":"example","displayName":"example","roles":["example"]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url http://localhost:8080/v1/users/invite \ --header 'Content-Type: application/json' \ --data '{ "email": "example", "displayName": "example", "roles": [ "example" ] }'Creates a user without a password, assigns roles (at least one) and emails a single-use invite link valid for 72 hours; redeeming it at POST /v1/auth/otp/redeem signs them in. Administrators only. 400 for invalid fields, 409 when the email is already taken, 422 when the email domain is not allowed by policy.
Request Bodyrequired
Section titled “Request Bodyrequired”Media typeapplication/json
object
email
string
displayName
string
roles
Array<string>
Examplegenerated
{ "email": "example", "displayName": "example", "roles": [ "example" ]}Responses
Section titled “Responses”Created
Media typeapplication/json
object
id
required
string format: uuid
email
required
string
displayName
required
string
roles
required
Array<string>
isActive
required
boolean
lastLoginAt
required
null | string format: date-time
totpEnrolled
required
boolean
Examplegenerated
{ "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "email": "example", "displayName": "example", "roles": [ "example" ], "isActive": true, "lastLoginAt": "2026-04-15T12:00:00Z", "totpEnrolled": true}