Members
Base path: /api/org. All routes need a signed-in session unless noted. Concept: Connected ID.
Invitations
Section titled “Invitations”| Method · Route | Purpose | Required scope |
|---|---|---|
POST /{slug}/members/invite | Invite a member | org.member.invite |
POST /{slug}/members/invite/resend | Resend invitation | org.member.invite |
DELETE /{slug}/members/invite/{invitationId} | Cancel invitation | org.member.invite |
Body of POST /{slug}/members/invite:
| Field | Type | Meaning |
|---|---|---|
InviteeEmail | string, required | Who to invite |
InviteeName | string | Display name shown on the invitation |
RoleId | guid | The role assigned on acceptance |
MembershipType | string | Used when no RoleId is given; defaults to Member |
SupervisorConnectedId | guid | Reporting manager, applied on acceptance |
TeamId | guid | Team the invitee joins as lead (Team Lead role) |
AssignDeviceKey | string | Key of a pre-registered device to reserve for the invitee; its code is included in the invitation email |
AppGroupId | guid | For a Freelancer invitation: the one app group the invitee is scoped to. Must belong to this organization (400 otherwise) |
Success is 200 { "message": "Invitation sent." }. A caller without org.member.invite, or a
caller other than the Owner inviting an Admin or an Owner-level role, gets 403 with
errorCode: "PERMISSION_DENIED" and the reason in error. Any other rejected invitation gets
400 with the reason in error. When the plan’s member limit is
reached the answer is 403 with error: "UPGRADE_REQUIRED" and feature: "members".
Cancelling an invitation without org.member.invite answers 403 with
errorCode: "PERMISSION_DENIED".
In a corporate organization, members must use a company email; Freelancer, Guest and Director invitations are exempt.
Director invitations (Board of Directors)
Section titled “Director invitations (Board of Directors)”Inviting a member with the Director (ORG_DIRECTOR) or Representative Director
(REPRESENTATIVE_DIRECTOR) role seats them on the organization’s
Board of Directors when they accept.
Corporation / Project(SPV) organizations only.
Additional body fields on POST /{slug}/members/invite:
| Field | Type | Meaning |
|---|---|---|
BoardChairman | bool | Also designate the invitee as chairman on acceptance |
BoardSharePercent | decimal? | Shareholding % (0–100) recorded on the board roster — used by meeting minutes |
SealAssertionJson | string | Required for director invitations — a personal-seal (passkey) step-up assertion with purpose board.member.change, subject {slug}|{inviteeEmail}|appoint-invite |
SealEmail | string | Email of the sealing account |
Without a valid seal assertion the invite is rejected with 401 STEPUP_REQUIRED /
STEPUP_FAILED. The acceptance-side board seating is the execution of that sealed decision —
no second seal is requested from the invitee.
ORG_DIRECTOR invitations are exempt from the corporate-email gate (like Freelancer/Guest) —
outside directors commonly use personal email. REPRESENTATIVE_DIRECTOR still requires a
company email (consistent with the legal-representative gate at organization creation).
Accepting (self-service)
Section titled “Accepting (self-service)”| Method · Route | Purpose |
|---|---|
POST /invitation/accept | Accept an invitation |
POST /invitation/decline | Decline an invitation |
POST /invitation/accept-with-register | Accept and register a new account in one step (anonymous) |
Managing members
Section titled “Managing members”| Method · Route | Purpose | Required scope |
|---|---|---|
GET /{slug}/members | List members. Pending invitations (invitations) are returned only to callers who hold view.members; for everyone else the list is empty | — |
GET /{slug}/members/{connectedIdId} | One member’s detail. For a member other than the caller, activeSessions, devices, countryGrants, signatureSpec and riskScore are returned only to callers who hold view.members; everyone else gets them empty | — |
PATCH /{slug}/members/{connectedIdId} | Edit a member’s name and profile — your own, or (Owner/Admin) someone else’s. Only the Owner can edit the Owner’s profile (403) | — |
POST /{slug}/members/{connectedIdId}/suspend | Suspend | org.member.suspend |
POST /{slug}/members/{connectedIdId}/reactivate | Undo a suspension. Roles are not changed | org.member.suspend |
POST /{slug}/members/{connectedIdId}/country-access | Allow the member to sign in from one more country. Body: countryIso (ISO 3166 alpha-2), optional days until it expires. Needs the Advanced Device Trust add-on (402 ADDON_REQUIRED) | org.member.connected_id_permission.create |
DELETE /{slug}/members/{connectedIdId}/country-access/{iso} | Take that country allowance back | org.member.connected_id_permission.create |
PUT /{slug}/members/{connectedIdId}/signature · POST …/signature/image | Set your own visual signature or personal seal image. Self only | — |
POST /{slug}/members/{connectedIdId}/revoke | Revoke all of the member’s roles; the account stays | org.member.revoke |
DELETE /{slug}/members/{connectedIdId} | Remove the member | org.member.revoke |
POST /{slug}/members/self/withdraw | Leave the organization yourself | — |
Suspend, reactivate, revoke, remove and the country-access routes are for an Owner or Admin
(403 for anyone else), and you cannot suspend, revoke or remove your own account. The Owner cannot be
suspended, revoked or removed, and cannot withdraw — transfer ownership first. A representative
director can be suspended or removed, and can withdraw; the representative seat is then left vacant
and the Owner is notified.
On accept, the proposed role is assigned and MembershipType is derived — see Roles & permissions.