# Update a member's basic profile details

`PUT /api/members/{memberId}/profile`

- **Products:** Operator (`FOH`), Consumer (`CONSUMER`) (any one of these products, not all)
- **Features:** Online Bookings (`ONLINEBOOK`), Online Joining (`ONLINEJOIN`), Front of House Generic Access (`FOHGENERIC`) (any one of these features, not all)

HTML version: [Update a member's basic profile details](https://support.gladstonesoftware.cloud/reference/members/update-a-members-basic-profile-details)

## Overview

Updates the core identity fields on a member record — name, title, date of birth, email, join date — and the three administrative codes that classify the member: `siteId`, `statusId` and `priceLevelId`.

This is a **partial update with one exception**. Every field you omit (or send as `null`) is left at its current value, so you can send only the fields you are changing. The exception is `titleId`: if you omit it, send `null` or send an empty string, the member's title is **overwritten with the default title `UNKNO`**. If you are not changing the title, send the member's current `titleId` back.

Validation runs against the member record as it will be *after* your changes, so a change to `dateOfBirth` is checked against the price level you are also setting in the same request. All validation failures return `400` with a plain-text message; nothing is written unless every check passes.

Linked members are permitted — a token issued for a member linked to `{memberId}` may call this endpoint.

## Endpoint

`PUT {base_url}/api/members/{memberId}/profile`

`{base_url}` is the environment URL issued to your integration. See [Authenticating with Gladstone APIs](../../guides/authenticating-with-gladstone-apis.md).

## Path parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `memberId` | integer (int32) | Yes | The member whose profile is updated. Must match the member id in your access token, or be a member linked to it, or the request is rejected. Any `id` in the body is ignored and replaced with this value. |

## Request body

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `titleId` | string | No | The member's form of address, as an id from the tenant's title list. 1–15 characters. **Omitting this field does not leave the title alone** — an absent, null or empty `titleId` resets the member's title to the default `UNKNO`. Send the current value back if you are not changing it. A value that does not exist in the title list is rejected with `400 Title ID {titleId} not found`. |
| `firstName` | string | No | The member's forename(s), maximum 25 characters. Omit, or send null or an empty string, to leave the existing value unchanged — this field cannot be cleared through this endpoint. |
| `lastName` | string | No | The member's surname, 1–25 characters. Omit, or send null or an empty string, to leave the existing value unchanged — this field cannot be cleared through this endpoint. |
| `dateOfBirth` | string (date-time) | No | The member's date of birth. Must not be in the future. Omit or send null to leave it unchanged. Some price levels are age-restricted: if the price level in force after this request requires a date of birth and the member has none, the call fails with `A date of birth is required for this price level`; if the date of birth falls outside the price level's age range it fails with `The member's date of birth is outside of the age range defined on the price level`. |
| `siteId` | string | No | The centre the member is registered at, 1–15 characters. Must be an existing site id or the call fails with `400 Site ID {siteId} not found`. Omit or send null to leave the member at their current site. |
| `statusId` | string | No | The member's account status code (an id from the tenant's status list), 1–15 characters. Must exist or the call fails with `400 Status ID {statusId} not found`. Omit or send null to leave the status unchanged. |
| `priceLevelId` | string | No | The pricing band the member is charged at, 1–15 characters. Must exist or the call fails with `400 Price level ID {priceLevelId} not found`. Changing it re-runs the age check described under `dateOfBirth`. Omit or send null to leave the price level unchanged. |
| `email` | string | No | The member's home email address, maximum 255 characters. Validated as a well-formed address, and must not already belong to a different member — a clash returns `400 A member with that email address already exists`. Omit or send null to leave the existing address unchanged. |
| `joinDate` | string (date-time) | No | The date the member joined, used as the start of their membership history. Omit or send null to leave the existing join date unchanged. |

## Sample request

```bash title="cURL"
curl -X PUT '{base_url}/api/members/{memberId}/profile' \
  -H 'Authorization: Bearer {accessToken}' \
  -H 'X-Use-SSO: true' \
  -H 'Content-Type: application/json' \
  -d '{
  "titleId": "string",
  "firstName": "string",
  "lastName": "string",
  "dateOfBirth": "2026-08-14T19:00:00Z",
  "siteId": "string",
  "statusId": "string",
  "priceLevelId": "string",
  "email": "member@example.com",
  "joinDate": "2026-08-14T19:00:00Z"
}'
```

## Errors

A successful call returns `204 No Content` with an empty body. Failures return a plain-text message, not JSON.

| Status | Meaning | When |
|--------|---------|------|
| `400` | Bad request | `email` is not a well-formed address: `The email field is not a valid e-mail address.` |
| `400` | Bad request | `email` already belongs to another member: `A member with that email address already exists` |
| `400` | Bad request | An unknown code was supplied: `Price level ID … not found`, `Status ID … not found`, `Site ID … not found` or `Title ID … not found` |
| `400` | Bad request | The price level requires a date of birth the member does not have: `A date of birth is required for this price level` |
| `400` | Bad request | `The member's date of birth is outside of the age range defined on the price level` |
| `400` | Bad request | A field breaches its length limit, or `dateOfBirth` is in the future — for example `Last name cannot be more than 25 characters`, `Date of Birth must not be in the future` |
| `404` | Not found | No member exists with that id: `No member could be found with the ID {memberId}` |
| `500` | Internal server error | The change could not be saved, or another unexpected server-side failure occurred. No detail is returned in the body. |
