# Retrieve a member's basic profile details

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

- **Success:** `200 OK`
- **Products:** Operator (`FOH`), Consumer (`CONSUMER`), Integrations (`INTEGRATIONS`) (any one of these products, not all)
- **Features:** Online Bookings (`ONLINEBOOK`), Online Joining (`ONLINEJOIN`), TRP Integration (`TRP`), DataHub (4Global) Integration (`DATAHUB`), Front of House Generic Access (`FOHGENERIC`) (any one of these features, not all)

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

## Overview

Returns one member's profile, addressed by member ID: who they are, which centre they belong to, and — when you ask for them — their addresses, contact details, current status and subscriptions. It is the single-member counterpart of [List all member profiles with filtering and pagination](list-all-member-profiles-with-filtering-and-pagination.md), which returns the same profile shape in bulk.

**This endpoint has two response shapes, and which one you get is decided by the features on your access token, not by anything in your request.** A caller whose token carries the DataHub feature and none of the privileged full-profile features (TRP, online booking or online join) is deliberately given a reduced profile — member ID, home site, gender, join date, date of birth, postcode and subscriptions, and nothing else. That reduced shape is what the fields below describe. Every other caller receives the full profile, which adds the member's name and title, both addresses, contact details, price level, site, status, last recorded visit, and counts of attendance and activity over the past 30 days. The redaction happens on the way out, so the omitted fields are simply absent rather than null — build against the shape your own credentials actually produce, and re-check it if the features on your integration change.

The four `include*` parameters control how much of the profile is loaded. All default to `false`, so a bare call returns the member's core details and leaves addresses, contact details, status and subscriptions out. They apply to the reduced shape too: `subscriptionDetails` is only populated there if you set `includeSubscriptions=true`.

Two details worth knowing before you map the response. Members with no title recorded come back as `UNKNO` / `Unknown` rather than null: the endpoint substitutes a default. And for a junior member who inherits their email address from the primary member on their linked account, this endpoint resolves the address from that primary member before returning it, preferring whichever of the primary member's home and work addresses is flagged as primary and falling back to the other if it is blank — the bulk list endpoint does not do this.

Access is checked against your token: the member ID in the path must be the member the token was issued for, or a member linked to them, such as a parent reading a child's profile.

## Endpoint

`GET {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 you want. Must be the member your access token was issued for, or a member linked to them, otherwise the request is rejected with `403 Forbidden`. A value that is not a whole number is rejected with `400 Bad Request` before any lookup happens. |

## Query parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `includeStatus` | boolean | No | Set to `true` to have the `status` object populated — the member's current status code, the date it was set, and the display colours the operator configured for it. Defaults to `false`, in which case `status` comes back as `null` rather than being omitted. Only affects the full profile shape; the reduced shape has no status field. |
| `includeSubscriptions` | boolean | No | Set to `true` to have `subscriptionDetails` populated with the member's memberships. Defaults to `false`. This is the one `include*` flag that also applies to the reduced profile shape. |
| `includeAddresses` | boolean | No | Set to `true` to have the member's address objects populated. Defaults to `false`. `postcode` is returned either way, because it is read from the member record rather than from an address. |
| `includeContactDetails` | boolean | No | Set to `true` to have `contactDetails` — the member's email addresses and telephone numbers — populated. Defaults to `false`. Only affects the full profile shape. |

## Sample request

```bash title="cURL"
curl -X GET '{base_url}/api/members/{memberId}/profile' \
  -H 'Authorization: Bearer {accessToken}' \
  -H 'X-Use-SSO: true'
```

## Response fields

| Field | Type | Description |
|-------|------|-------------|
| `memberId` | integer (int32) | The member's identifier in Gladstone. It is the value you pass as `{memberId}` to every other per-member endpoint, and it is stable for the life of the record. |
| `homeSiteId` | string | The site — a single leisure centre — the member is registered at. In the full profile shape the same value is repeated as `site.id`, with the site's name and translations alongside it; both come from the same value on the member, so they never disagree. |
| `gender` | object | The member's recorded gender. It is a configured lookup rather than free text, so you get an identifier, the operator's wording for it, and any translations of that wording. |
| `gender.id` | integer (int32) | Identifies the configured gender option held against the member. The available options are operator configuration, so map on this identifier rather than assuming a fixed set of values. |
| `gender.name` | string | The operator's untranslated wording for that gender option. |
| `gender.translations` | array of object | Localised versions of `name`, one entry per language the operator has configured. Empty when none have been configured, in which case display `name`. |
| `gender.translations[].type` | string | Identifies the set of configured text this translation belongs to; translations are grouped by type. |
| `gender.translations[].culture` | string | The culture the text is written for, in the form `en-GB`. Which cultures appear depends on the languages the operator has enabled. |
| `gender.translations[].text` | string | The wording for that culture. Use it in place of `name` when it matches your user's language. |
| `joinDate` | string (date-time) | The date the member joined the operator. It is supplied when the member is created rather than derived from the record, so for a member migrated from an older system it can sit well before the record itself existed. |
| `dateOfBirth` | string (date-time) | The member's date of birth. The platform compares it against the operator's configured age of consent, which is what decides whether consent and profile changes for this member need a guardian's name. |
| `postcode` | string | The postcode held directly on the member record. It is returned whether or not you set `includeAddresses`, which makes it the only piece of address data available to a reduced-profile caller. |
| `subscriptionDetails` | array of object | The memberships held by this member. Only populated when you send `includeSubscriptions=true`; empty otherwise. The profile service reports this data rather than owning it — memberships are managed elsewhere in the platform — so treat it as a summary and go to the membership endpoints for anything you intend to act on. |
| `subscriptionDetails[].id` | string | Identifies this subscription record. |
| `subscriptionDetails[].siteId` | string | The site this subscription is recorded against. It is held on the subscription itself, so do not assume it is the member's `homeSiteId`. |
| `subscriptionDetails[].membershipRef` | integer (int32) | |
| `subscriptionDetails[].autoRenewInd` | integer (int32) | Indicates whether the subscription is set to renew automatically. |
| `subscriptionDetails[].renewalStopDate` | string (date-time) | |
| `subscriptionDetails[].expiryDate` | string (date-time) | The date the subscription expires. `null` where no expiry is recorded against it. |
| `subscriptionDetails[].lastModifiedDate` | string (date-time) | When this subscription record was last changed. It tracks the subscription rather than the member, so it moves independently of any change to the profile itself. |
| `subscriptionDetails[].createdOn` | string (date-time) | When this subscription record was created. |
| `subscriptionDetails[].startDate` | string (date-time) | The date the subscription starts. |
| `subscriptionDetails[].membershipStatus` | string | The subscription's current status. |
| `subscriptionDetails[].subscriptionGroups` | array of object | The subscription groups this membership belongs to. Subscription groups are operator configuration used to categorise memberships, and their identifiers are what you pass to the `subscriptionGroups` filter on [List all member profiles with filtering and pagination](list-all-member-profiles-with-filtering-and-pagination.md). |
| `subscriptionDetails[].subscriptionGroups[].id` | string | Identifies the group. This is the value to use in the `subscriptionGroups` filter when listing profiles; passing one that does not exist there is rejected with `400`. |
| `subscriptionDetails[].subscriptionGroups[].description` | string | The operator's wording for the group, suitable for display. |

## Sample response

```json title="200 OK"
{
  "memberId": 12345,
  "homeSiteId": "string",
  "gender": {
    "id": 12345,
    "name": "string",
    "translations": [
      {
        "type": "string",
        "culture": "string",
        "text": "string"
      }
    ]
  },
  "joinDate": "2026-08-14T19:00:00Z",
  "dateOfBirth": "2026-08-14T19:00:00Z",
  "postcode": "string",
  "subscriptionDetails": [
    {
      "id": "string",
      "siteId": "string",
      "membershipRef": 1,
      "autoRenewInd": 1,
      "renewalStopDate": "2026-08-14T19:00:00Z",
      "expiryDate": "2026-08-14T19:00:00Z",
      "lastModifiedDate": "2026-08-14T19:00:00Z",
      "createdOn": "2026-08-14T19:00:00Z",
      "startDate": "2026-08-14T19:00:00Z",
      "membershipStatus": "string",
      "subscriptionGroups": [
        {
          "id": "string",
          "description": "string"
        }
      ]
    }
  ]
}
```

## Errors

| Status | Meaning | When |
|--------|---------|------|
| `404` | Not found | No member exists with that ID. The body is the plain-text message `No member exists with the ID {memberId}`. |
| `500` | Internal server error | An unexpected server-side failure while assembling the profile. The response carries no body, so there is nothing to parse — retry, and raise it with Gladstone if it persists. |
