Members and children
The church's member register: congregants and visitors, their family links, groups and status, and the children registered under them.
Read routes accept church:members:view, and also head_office:churches:view or system:churches:view with an X-Church header (see the overview). Members registered through the app or USSD arrive here with status pending when the church approves new members, and move to active with the status route.
Members
| Route | Permission | Purpose |
|---|---|---|
| GET/v1/members | church:members:view | List members. Filters: q (name, phone, member number), status, kind (member | visitor), gender, department, cell_group, age_group (uuids), sort (name | newest | number), page, page_size. |
| GET/v1/members/stats | church:members:view | Counts: total, active, pending, inactive, visitors, children, new this month. |
| GET/v1/members/search | church:members:view | Quick search for pickers (q), returning uuid, name and phone. |
| GET/v1/members/age-groups | church:members:view | The church's age groups, for the age_group field. |
| POST/v1/members | church:members:create | Register a member. |
| GET/v1/members/{uuid} | church:members:view | One member with spouse, parent, departments and cell groups. |
| PUT/v1/members/{uuid} | church:members:edit | Update a member (PATCH accepted). Same body as create, without pin. |
| POST/v1/members/{uuid}/status | church:members:approve or church:members:edit | Set status: active, inactive or pending (approves pending registrations). |
| DELETE/v1/members/{uuid} | church:members:delete | Remove a member. The record is kept for giving history but leaves every list. |
Member fields
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| first_name | string | Yes | First name. |
| other_names | string | No | Surname and any other names. |
| middle_name | string | No | Middle name. |
| phone | string | No | Primary phone. 07..., 2547... and +2547... accepted. It is the member's app login, so another member of the church with the same number answers 409. |
| alternative_phone | string | No | A second number. |
| string | No | Email, used for statements. | |
| physical_address | string | No | Where the member lives. |
| date_of_birth | date | No | YYYY-MM-DD. Drives birthday messages and the age group. |
| gender | string | No | male or female. |
| marital_status | string | No | single, married, single_parent, widowed or divorced. |
| married_on | date | No | Wedding date, for anniversary messages. |
| kind | string | No | member (default) or visitor. |
| member_type | string | No | The church's member type label. |
| member_number | string | No | The church's member number. Generated with the church's prefix when left blank. |
| tithe_number | string | No | Tithe card number, if the church uses them. |
| date_joined | date | No | When the member joined. |
| is_baptised | boolean | No | Baptised or not; baptism_date and confirmation_date alongside. |
| age_group_uuid | uuid | No | One of GET /v1/members/age-groups. |
| spouse_uuid | uuid | No | Link to the spouse's member record. |
| parent_uuid | uuid | No | Link to a parent's member record. |
| departments | uuid[] | No | Departments and ministries to join. |
| cell_groups | uuid[] | No | Cell groups to join. |
| pin | string | No | Create only: a 4-digit app PIN. Without it the member sets one at first app login. |
# Paste your token once (it starts with mc_):
export MYCHURCH_TOKEN="mc_your_token_here"
curl -X POST https://uat-api.mychurch.co.ke/v1/members \
-H "Authorization: Bearer $MYCHURCH_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"first_name": "Jane",
"other_names": "Wanjiku",
"phone": "0712345678",
"email": "[email protected]",
"gender": "female",
"date_of_birth": "1990-04-12",
"marital_status": "married",
"departments": [
"5d1c0a3e-0000-4000-8000-00000000d001"
]
}'200 OK
{
"success": true,
"data": {
"uuid": "0b6f4c1e-1111-4a2b-9c3d-000000000001",
"first_name": "Jane",
"other_names": "Wanjiku",
"name": "Jane Wanjiku",
"phone": "254712345678",
"email": "[email protected]",
"date_of_birth": "1990-04-12T00:00:00Z",
"gender": "female",
"marital_status": "married",
"kind": "member",
"status": "active",
"member_type": "member",
"member_number": "EFC0412",
"is_baptised": false,
"has_pin": false,
"departments": [{ "uuid": "5d1c0a3e-0000-4000-8000-00000000d001", "name": "Choir" }],
"created_at": "2026-11-01T09:12:44Z",
"updated_at": "2026-11-01T09:12:44Z"
}
}Phones and hashed phones
The api stores every phone in international form and keeps a SHA-256 hash beside it, because Safaricom sends payers' numbers hashed. A correct phone on the member record is what lets a paybill payment land on the right member automatically.
Children
Children are registered under a parent member and are what Sunday school check-in and checkout work with.
| Route | Permission | Purpose |
|---|---|---|
| GET/v1/children | church:children:view or church:members:view | List children. Filters: q, status, parent (member uuid), page, page_size. |
| POST/v1/children | church:children:manage | Register a child: first_name, other_names, gender, date_of_birth, child_phone, parent_uuid. |
| PUT/v1/children/{uuid} | church:children:manage | Update a child (PATCH accepted). |
| DELETE/v1/children/{uuid} | church:children:manage | Remove a child. |