Create a new member with a basic profile

POST /api/members/profile

Success: 201 Created

Overview

Creates a new member record with a basic profile — name, site, and optionally date of birth, title, home email, status, price level, join date and preferred language — and returns the new member's id. Use it to register someone who is not yet a member; to change an existing member's details, use Update a member's basic profile details instead, and to create a member and book them onto a session in one call, use Create a new member with an associated booking.

This is normally the first call in a join or registration flow: take memberId from the response and use it in the {memberId} route segment of the other member endpoints — identifiers, personalisation and the rest.

The new id is drawn from the NextMemberID counter configured against the site you pass in siteId, which is why siteId is mandatory and why a misconfigured counter surfaces as a 409 naming the site rather than a generic failure. The same site supplies the defaults used when you leave statusId or priceLevelId out; if those defaults are not configured for that site the call fails with 422 and no member is created.

Two age thresholds held in tenant configuration change what gets stored. A member younger than the age at which an online account is permitted has their home and work email saved as empty and is set to inherit the email of the member they are linked to, whatever you sent in email. A member younger than the age of consent is treated as a junior, and the platform's new-member notification, which other parts of the platform act on, is not raised for them. That notification is also suppressed when you send pendingConfirmation: true, which is the flag that later makes the member eligible for DELETE {base_url}/api/members/{memberId}/profile.

Validation runs in full before anything is written, so a rejected request leaves no partial member behind.

Endpoint

POST {base_url}/api/members/profile

{base_url} is the environment URL issued to your integration. See Authenticating with Gladstone APIs.

Request body

FieldTypeRequiredDescription
firstNamestringYesThe member's given name. Maximum 25 characters, cannot be empty, and cannot contain digits — a digit is rejected with The First name field cannot contain numbers. Also stored as the member's salutation.
lastNamestringYesThe member's family name. Maximum 25 characters, cannot be empty, and cannot contain digits — a digit is rejected with The Last name field cannot contain numbers.
dateOfBirthstring (date-time)NoThe member's date of birth, rejected with Date of Birth cannot be in the future if it is later than today. It drives the two age checks described in the overview, and it must fall inside the age range of priceLevelId where that price level defines one — omit it in that case and the call fails with A date of birth is required for this price level. Omitting it stores a placeholder minimum date rather than a null.
siteIdstringYesThe site (centre or venue) the member is registered against. Maximum 15 characters and must already exist, otherwise Site ID {siteId} not found. It also selects which NextMemberID counter allocates the new member id, and which site's default status and price level are applied when you omit those fields.
titleIdstringNoThe salutation title to store against the member, taken from the configured list of titles. Maximum 15 characters and must exist, otherwise Title ID {titleId} not found. When omitted, a built-in default title is applied rather than leaving the field blank.
statusIdstringNoThe membership status the record opens in, taken from the configured list of statuses. Maximum 15 characters and must exist, otherwise Status ID {statusId} not found. When omitted, the DefaultStatus configured for siteId is used; if that setting is missing the call fails with 422.
priceLevelIdstringNoThe pricing band the member is charged at, taken from the configured price levels. Maximum 15 characters and must exist, otherwise Price level ID {priceLevelId} not found. If the price level defines an age range, dateOfBirth must fall inside it. When omitted, the DefaultPriceLevel configured for siteId is used; if that setting is missing the call fails with 422.
joinDatestring (date-time)NoThe date the membership starts. Only the date part is kept — any time component is discarded. Defaults to the current server date when omitted or null.
emailstringNoThe member's home email address. Maximum 255 characters and must be a syntactically valid address, otherwise The email field is not a valid email address.. When your access token carries the unique-emails feature, an address already held by another member is rejected with A member with that email address already exists; without that feature duplicate addresses are accepted. Ignored and stored empty for a member below the age at which an online account is permitted.
memberLanguagestringNoThe member's preferred language. Supplying it also creates a Language personalisation record for the new member, exactly as a separate call to POST {base_url}/api/members/{memberId}/personalisation would. The value is checked against the tenant's list of allowed languages and, if it is not on that list, it is silently stored as en-GB instead of being rejected. Omit it to create no personalisation record at all.
pendingConfirmationbooleanNoMarks the member as not yet confirmed. While it is true the platform's new-member notification is not raised, and the member can be removed again with DELETE {base_url}/api/members/{memberId}/profile — that delete is refused for any member who is not pending confirmation. Defaults to false when omitted or sent as null.

Sample request

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

Response fields

FieldTypeDescription
memberIdinteger (int32)The id allocated to the new member from the NextMemberID counter of the site you sent. Store it — it is the {memberId} value every other member endpoint expects, and there is no other call in this operation that returns it.

Sample response

201 Created
{
  "memberId": 12345
}

Errors

StatusMeaningWhen
400Bad requestBody validation failed (a missing, over-length or digit-bearing name, or a future date of birth); email is not a valid address or is already held by another member while the unique-emails feature is active; siteId, statusId, priceLevelId or titleId does not exist; the member's date of birth is missing or outside the age range required by the price level; or memberLanguage names a personalisation type that does not exist. The response body is the specific message.
409ConflictThe id taken from the site's counter is already in use: The member ID of {memberId} is already in use. The configuration for NextMemberId of site {siteId} is likely incorrect. Any other clash with an existing record while saving returns Creating the member caused a conflict exception.
422Unprocessable entityThe values you left out could not be resolved: no DefaultPriceLevel or DefaultStatus configured for siteId, or the site's NextMemberID is not a number (Could not retrieve the next member ID for site ID {siteId}). Also returned when memberLanguage is supplied but the tenant has no allowed-languages configuration.
500Internal server errorAn unexpected server-side failure while saving the member, other than the conflicts above. The response has no body.

This page as markdown · All pages · llms.txt