Retrieve a member's basic profile details

GET /api/members/{memberId}/profile

Success: 200 OK

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, 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.

Path parameters

NameTypeRequiredDescription
memberIdinteger (int32)YesThe 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

NameTypeRequiredDescription
includeStatusbooleanNoSet 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.
includeSubscriptionsbooleanNoSet 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.
includeAddressesbooleanNoSet 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.
includeContactDetailsbooleanNoSet 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

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

Response fields

FieldTypeDescription
memberIdinteger (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.
homeSiteIdstringThe 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.
genderobjectThe 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.idinteger (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.namestringThe operator's untranslated wording for that gender option.
gender.translationsarray of objectLocalised versions of name, one entry per language the operator has configured. Empty when none have been configured, in which case display name.
gender.translations[].typestringIdentifies the set of configured text this translation belongs to; translations are grouped by type.
gender.translations[].culturestringThe culture the text is written for, in the form en-GB. Which cultures appear depends on the languages the operator has enabled.
gender.translations[].textstringThe wording for that culture. Use it in place of name when it matches your user's language.
joinDatestring (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.
dateOfBirthstring (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.
postcodestringThe 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.
subscriptionDetailsarray of objectThe 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[].idstringIdentifies this subscription record.
subscriptionDetails[].siteIdstringThe site this subscription is recorded against. It is held on the subscription itself, so do not assume it is the member's homeSiteId.
subscriptionDetails[].membershipRefinteger (int32)
subscriptionDetails[].autoRenewIndinteger (int32)Indicates whether the subscription is set to renew automatically.
subscriptionDetails[].renewalStopDatestring (date-time)
subscriptionDetails[].expiryDatestring (date-time)The date the subscription expires. null where no expiry is recorded against it.
subscriptionDetails[].lastModifiedDatestring (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[].createdOnstring (date-time)When this subscription record was created.
subscriptionDetails[].startDatestring (date-time)The date the subscription starts.
subscriptionDetails[].membershipStatusstringThe subscription's current status.
subscriptionDetails[].subscriptionGroupsarray of objectThe 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.
subscriptionDetails[].subscriptionGroups[].idstringIdentifies 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[].descriptionstringThe operator's wording for the group, suitable for display.

Sample response

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

StatusMeaningWhen
404Not foundNo member exists with that ID. The body is the plain-text message No member exists with the ID {memberId}.
500Internal server errorAn 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.

This page as markdown · All pages · llms.txt