> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dueflow.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Parent/guardian contact

> Require parent/guardian contact from a chapter's members, and read or write it on the member resource.

A chapter can require every member to give a parent or guardian's name and
email. Once it's on, members are asked for it in the member portal and before
they pay. The API can turn the requirement on or off and read or write the
values themselves.

## Scopes

Parent/guardian contact is personal data about someone who isn't a member, so
it sits behind its own scope:

| To | Scopes |
| - | - |
| Read the requirement | `organization:read` (or `organization:write`) |
| Turn the requirement on or off | `organization:write` |
| Read parent/guardian fields on members | `members:read` + `members:pii` |
| Set or clear parent/guardian fields | `members:write` + `members:pii` |

A token without `members:pii` sees the same member shape as before: the three
fields are absent, not `null`. Sending any of them without `members:pii` is a
`403 insufficient_scope` naming the field, and nothing is written.

> [!WARNING]
>
> Only personal tokens (Settings → API tokens) and service tokens (Settings →
> Developers) can read or write parent/guardian contact. OAuth apps and MCP
> connectors never receive these fields, even when granted `members:pii`, and
> get a `403` if they send them.

## Turn the requirement on or off

```bash theme={"system"}
curl -X POST https://api.dueflow.co/v1/organization/required-roster-fields \
  -H "Authorization: Bearer $DUEFLOW_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"fields":["parentFirstName","parentLastName","parentEmail"]}'
```

A chapter passes all three fields to require parent/guardian contact, or `[]`
to make it optional. Any other set is a `400`. (A national uses the same
endpoint to pick the fields chapters must include on HQ roster uploads; that
policy doesn't ask the chapters' members for anything.)

Read it back:

```bash theme={"system"}
curl https://api.dueflow.co/v1/organization/required-roster-fields \
  -H "Authorization: Bearer $DUEFLOW_TOKEN"
```

```json theme={"system"}
{
  "requiredRosterFields": ["parentFirstName", "parentLastName", "parentEmail"],
  "parentContactRequired": true
}
```

## Read and write the values

With `members:pii`, `GET /v1/members` and `GET /v1/members/:id` include the
fields. A field with nothing on file is `null`:

```json theme={"system"}
{
  "id": "S_QZS1bcVIsrxWJHTKbIM",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "email": "ada@example.com",
  "isActive": true,
  "joinDate": "2026-07-25",
  "groups": [],
  "createdAt": "2026-07-25T17:40:23.352Z",
  "updatedAt": "2026-08-02T09:12:00.000Z",
  "parentFirstName": "Pat",
  "parentLastName": "Lovelace",
  "parentEmail": "pat@example.com"
}
```

Set them when you create a member, or later with `PATCH`. `null` clears a
field:

```bash theme={"system"}
curl -X PATCH https://api.dueflow.co/v1/members/$MEMBER_ID \
  -H "Authorization: Bearer $DUEFLOW_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"parentFirstName":"Pat","parentLastName":"Lovelace","parentEmail":"pat@example.com"}'
```

Changing a member's parent/guardian contact moves its `updatedAt`, so an
`updatedSince` sync picks it up. A member without all three still gets a
prompt in the portal while the requirement is on, whatever your integration
wrote.

> [!NOTE]
>
> A national's `GET /v1/chapters/:chapterId/members` stays PII-free:
> parent/guardian contact is only returned for your own organization's
> members.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.