Use this file to discover all available pages before exploring further.
Members are the foundation of every savings group in Save App. As an admin, you can add new members by phone number, assign roles, and control access at any time. Each member gets a credit score, reliability label, and eligibility status calculated automatically by the server so your app always has up-to-date data without any extra work.
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.
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 in pending status and the member must set their own password before they can log in.
{ "success": true, "message": "Member created successfully", "otp": "1234"}
The 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.
Use PUT /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.
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.
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.
Suspending a member is a non-destructive operation — all their contribution history, credit score, and loan records are preserved. To suspend, send is_active: false:
curl -X PUT "https://api.saveapp.io/api/members/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \ -H "Authorization: Bearer <admin_token>" \ -H "Content-Type: application/json" \ -d '{"is_active": false}'To restore access later, repeat the request with `"is_active": true`.## MemberEntity response fields| Field | Type | Description ||---|---|---|| `id` | string | Unique member UUID || `name` | string | Full display name || `phone` | string | Phone in `+256` format || `role` | string | `"member"` or `"admin"` || `group_name` | string | Savings group name || `contribution_paid` | float | Total contributions approved so far || `shortfall_amount` | float | Outstanding shortfall balance owed to the group || `has_received_payout` | boolean | Whether the member has received a cycle payout || `is_active` | boolean | `false` means account is suspended || `is_creator` | boolean | `true` for the group founder || `status` | string | `"pending"` (before onboarding) or `"active"` || `created_at` | datetime | Account creation timestamp (ISO 8601) || `reliability_label` | string | `SAFE`, `STABLE`, `MODERATE`, or `AT RISK` || `reliability_color` | string | Hex colour matching the reliability label || `is_eligible` | boolean | `true` if the member qualifies for a loan (score ≥ 60 and active) || `credit_score` | integer | Current credit score (300–850, starting at 500) |