All phone numbers must be in Uganda format. Accepted patterns are
+256XXXXXXXXX (international) or 0XXXXXXXXX (local). The API will reject any phone number that does not match these formats.Add a new member
Admins create members directly — no OTP flow is required on the admin side. If you do not supply an initial password, the account is placed inpending status and the member must set their own password before they can log in.
role field accepts "Member", "Admin", or "Administrator". Omitting password (or passing an empty string) leaves the account in pending state — see the onboarding flow below.
List all members
Any authenticated user can call this endpoint; members will only see themselves, while admins see the full group roster. Results are paginated.limit (1–100) and offset to page through large groups.
Get a single member
Members may fetch their own profile. Admins can fetch any member in the same group.Update a member
UsePUT /api/members/{id} to change a member’s role or active status. Only the group creator can promote or demote roles; any admin can toggle is_active.
Member onboarding flow
When an admin creates a member without a password — or wants the member to choose their own PIN — the member completes a short self-service onboarding flow.1
Admin creates the member account
Create the member without a password. The account status is set to
pending automatically.2
Admin shares credentials with the member
Send the member their phone number and the group name out of band (SMS, WhatsApp, or in person). These are the two pieces of information the member needs to start onboarding.
3
Member checks onboarding status
The member’s app calls the onboarding check endpoint to verify the account exists and is awaiting a password.
4
Member sets their password
The member chooses a secure password using the set-password endpoint.After this call succeeds,
status transitions from pending to active and the member can log in normally.Suspend a member
Suspending a member is a non-destructive operation — all their contribution history, credit score, and loan records are preserved. To suspend, sendis_active: false:

