End users
End users are your application’s users (distinct from org members — see Authentication model). Create or import each customer in the target app group. Active email addresses are unique within that group’s member scope, so the same email can identify separate members in two groups. Each member carries an identity badge — see Connected ID — but is not a member of your organization and carries no membership grade. Base path: /api/org/{slug}/endusers (authenticated org member). Each route needs the listed scope; the organization Owner and Admin hold them all. Missing permission returns 403 with errorCode: "PERMISSION_DENIED".
| Method · Route | Purpose | Required scope |
|---|---|---|
GET / | List end users (paged: page, pageSize, search, status, appGroupId) | org.end_user.list |
GET /by-group/{groupId} | The end users who have access to one app group | org.end_user.list |
POST / | Create and invite an end user: { email, appGroupId, displayName? }. Returns { id, email, status: "Pending", emailSent }. 409 when the email already exists in the group’s member scope. In a development app group this adds a tester; beyond 100 active testers: 409 TESTER_LIMIT_REACHED (see Development and production). | org.end_user.create |
POST /bulk-import | Bulk import — body { appGroupId, users: [{ email, displayName? }] }, up to 500 rows. Same creation path as single create: each user is created Pending in the target group’s member scope, granted app access, and sent a Magic Link invite (in the background — failures recover via resend). Returns { total, created, duplicates, invalid, results }; each row in results is created / duplicate / invalid, or limit for rows beyond 100 testers in a development app group. | org.end_user.create |
POST /{endUserId}/resend-invite | Resend the invite. Only for users still Pending (400 otherwise). | org.end_user.update |
PATCH /{endUserId}/suspend | Suspend | org.end_user.suspend |
PATCH /{endUserId}/activate | Activate | org.end_user.activate |
DELETE /{endUserId} | Delete. Also cancels the member’s live subscriptions — see App member purchases. | org.end_user.delete |
DELETE /{endUserId}/groups/{groupId} | Remove from an app group | org.end_user.delete |
The invite verification is a public route — POST /api/enduser/verify-invite with { token }; it activates the Pending user and answers { message, alreadyActive, appName, appIconUrl } (400 for an invalid or expired link). End-user authentication flows (passkey / magic-link / social) live under /api/public/apps/{applicationKey}/auth/* — see Quickstart and the OIDC reference.