Get membership type by ID
GET /api/configuration/membership-types/{all}
Success: 200 OK
- Products: Operator (
FOH), Consumer (CONSUMER) (any one of these products, not all) - Features: Online Joining (
ONLINEJOIN), Front of House Generic Access (FOHGENERIC) (any one of these features, not all)
Overview
Returns one membership type — the template an operator sells, defining how long a membership runs, how it renews, which price level it is priced from, what documentation a joiner must supply and which tags describe it. You will typically call this after listing types for a group with Get membership types by membership type groups, to fetch the full detail of the one the customer chose before starting a join.
This endpoint does not return a price. priceLevelId tells you which price level applies, but the money comes from the pricing calls. Use Get price level by ID to resolve the level itself.
Three things surprise integrators:
- A number of fields in the response are never populated by this endpoint and always come back as the default for their type, whatever the operator has configured. They are
units,unitTypeIndicator,unitType,startupType(alwaysnull),preventConcurrencyIndandallowDuplicateSubscriptions(alwaysfalse),maximumUsage(always0) andapplyToLinksInd(always0). Each is flagged in the table below. Do not build logic on them from this call. minAgeandmaxAgeare not the membership type's own age settings. They are copied from the associated price level, and only when that level actually declares a range. See their descriptions.- A missing membership type returns
404, not400— unlike several other Configuration lookups, which return400for a record that does not exist. The body is a plain-text sentence rather than a JSON error object.
Endpoint
GET {base_url}/api/configuration/membership-types/{all}
{base_url} is the environment URL issued to your integration. See Authenticating with Gladstone APIs.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The membership type to return. This is an operator-assigned code of maximum 15 characters, not a number — take it from the id of a type returned by Get membership types by membership type groups. The lookup is an exact match, so pass it back unchanged rather than upper-casing or trimming it. An ID that matches nothing returns 404. |
Sample request
curl -X GET '{base_url}/api/configuration/membership-types/{all}' \
-H 'Authorization: Bearer {accessToken}' \
-H 'X-Use-SSO: true'Response fields
| Field | Type | Description |
|---|---|---|
id | string | The membership type's operator-assigned code, maximum 15 characters. Use it wherever a membership type is named — starting a join, filtering members, or querying prices. |
description | string | The type's display name, maximum 25 characters, so expect terse text such as ADULT PEAK. This is the only human-readable label on the record; use translations for other languages. |
autoRenewIndicator | integer (int32) | The raw renewal flag. 1 means the membership renews automatically; any other value, including null, means it does not. Prefer autoRenews, which is the same fact as a boolean. |
applyToLinksInd | integer (int32) | Always 0 on this endpoint — it is never populated, so it tells you nothing about how the type is configured. Read isGroupMembership instead, which reflects the same setting and is populated correctly. |
autoRenews | boolean | Whether the membership renews itself at the end of its term. Computed as autoRenewIndicator == 1, so a null indicator reports false. When true, duration and durationType tell you the length of each renewed term, and renewalDay/renewalMonth may anchor when it falls. |
isGroupMembership | boolean | Whether the membership covers linked members — a family or corporate group — rather than only the individual who buys it. Derived from the type's apply-to-links setting: any non-zero value reports true. |
paymentMethodId | string | The payment method this type is sold on, maximum 15 characters. Mandatory on every membership type, so it is always present. Determines the collection mechanism — direct debit, card, cash — and therefore what a join flow must gather. |
priceLevelId | string | The price level the type is priced from, maximum 15 characters. Resolve it with Get price level by ID. Null when the type has no price level, in which case minAge and maxAge are also null, because they are taken from the level. |
statusId | string | The member status applied to a member holding this membership, maximum 15 characters. Null when the type does not set one. |
duration | integer (int32) | How many durationType periods one term of the membership runs for — 12 with a durationType of Monthly is a twelve-month membership. Read it together with durationType; on its own it is meaningless. Null when the type has no fixed term. |
durationTypeIndicator | integer (int32) | The raw code behind durationType: 0 monthly, 1 daily, 2 weekly. Provided for callers that prefer the number; durationType carries the identical value. |
durationType | integer (enum) | One of: 0, 1, 2. The unit that duration is counted in — 0 monthly, 1 daily, 2 weekly. Note that 0 means monthly, not "unset"; a type with no term reports null here rather than 0. |
units | integer (int32) | Always null on this endpoint. The operator may have configured a units value, but this call never returns it. |
unitTypeIndicator | integer (int32) | Always null on this endpoint — never populated by this call. |
unitType | integer (enum) | One of: 0, 1, 2, 3, 4, 5. Computed from unitTypeIndicator, which this endpoint never populates, so it is always null here. Were it populated, the codes are 0 nothing, 1 daily, 2 weekly, 3 fortnightly, 4 monthly, 5 yearly. |
startupType | integer (int32) | Always null on this endpoint — never populated by this call. |
renewalDay | integer (int32) | The day of the month the membership's term is anchored to, taken from the type's default start day. Null when the type does not fix one, in which case the term runs from the join date. Read with renewalMonth. |
renewalMonth | integer (int32) | The month the membership's term is anchored to, taken from the type's default start month, for annual types with a common renewal date across all members. Null when the type does not fix one. |
minAge | integer (int32) | The youngest age eligible for this membership, copied from the associated price level's age range, not from the membership type's own age settings. It is only populated when priceLevelId is set and that level declares a non-zero start or end age; otherwise it is null, which means "no age restriction known from this call" rather than "no restriction". |
maxAge | integer (int32) | The oldest age eligible, copied from the associated price level's age range under the same conditions as minAge. The two are populated or omitted together — you never get one without the other. A level whose range is 0–0 yields null for both. |
imageUrl | string | Absolute URL of the type's promotional image on the public CDN, built as {cdn}/public/{tenantId}/images/{filename} with the filename lower-cased. Null when the type has no image, and also null when the environment has no CDN URL configured — so do not treat null as proof the operator has not uploaded one. |
preventConcurrencyInd | boolean | Always false on this endpoint — never populated by this call, so it does not tell you whether concurrent memberships are actually blocked. |
allowDuplicateSubscriptions | boolean | Always false on this endpoint — never populated by this call. |
priority | integer (int32) | The type's ordering weight, used where several types compete and one must be chosen. |
earliestStartDate | string (date-time) | The earliest date a membership of this type may start, returned with the time truncated to midnight — treat it as a date. Null when the type imposes no floor. When you are combining several types, note that a single type with a null value relaxes the constraint for the whole set rather than being ignored. |
fixedEndDate | string (date-time) | The calendar date this membership type is configured to end on, which makes it a fixed-term type rather than one that runs for its usual duration. Returned with the time truncated to midnight — treat it as a date. null when the type has no fixed end date. A fixed end date can only be set on a type that does not auto-renew and is not paid by Direct Debit, BACS or recurring card payment, but a type whose renewal or payment settings were changed after the date was set still carries it. Set or remove it with Update membership type configuration. |
tagGroups | array of object | The tag groups that contain at least one tag applied to this membership type, ordered by sortOrder. Tags are the operator's own classification scheme — use them to filter or badge types in your UI. Only groups with a matching tag appear; a group the operator has defined but not used on this type is absent, not empty. |
tagGroups[].id | integer (int32) | The group's numeric identifier, and the key its translations entries are held against. |
tagGroups[].key | string | The group's stable text key. Prefer matching on this rather than on id or name, since it is the value that survives across environments. |
tagGroups[].name | string | The group's display name in the default language. Use tagGroups[].translations for other languages. |
tagGroups[].description | string | Longer explanatory text for the group, for a tooltip or help panel. |
tagGroups[].type | string | The key of the tag group's type — the operator-defined category the group itself belongs to. Resolve it with Get tag group by ID or key. |
tagGroups[].allowMultipleTags | boolean | Whether more than one tag from this group may apply at once. When false, expect exactly one entry in tags; when true, expect one or more. |
tagGroups[].sortOrder | integer (int32) | The group's display position. Groups arrive already sorted by this value, so you only need it if you re-sort or merge with another source. |
tagGroups[].tags | array of object | The tags from this group that are applied to this membership type, ordered by sortOrder. Not the group's full membership — tags the operator has defined but not applied here are absent. |
tagGroups[].tags[].id | integer (int32) | The tag's numeric identifier, and the key its translations entries are held against. |
tagGroups[].tags[].key | string | The tag's stable text key. Match on this rather than on name. |
tagGroups[].tags[].name | string | The tag's display name in the default language. |
tagGroups[].tags[].description | string | Longer explanatory text for the tag. |
tagGroups[].tags[].sortOrder | integer (int32) | The tag's display position within its group. Tags arrive already sorted by it. |
tagGroups[].tags[].isSecondary | boolean | Marks the tag as a secondary rather than primary classification. |
tagGroups[].tags[].translations | array of object | Localised text for this tag, keyed on the tag's id. Empty when no translations have been captured. |
tagGroups[].tags[].translations[].type | string | The object type the translation belongs to — always Tag in this collection. |
tagGroups[].tags[].translations[].culture | string | The culture the text is written in. |
tagGroups[].tags[].translations[].text | string | The translated text, replacing the tag's default-language text when rendering in that culture. |
tagGroups[].translations | array of object | Localised text for the tag group itself, keyed on the group's id. Empty when no translations have been captured. |
tagGroups[].translations[].type | string | The object type the translation belongs to — always TagGroup in this collection. |
tagGroups[].translations[].culture | string | The culture the text is written in. |
tagGroups[].translations[].text | string | The translated text for the group. |
translations | array of object | Localised text for the membership type itself, keyed on id, covering every translatable property of the record. Empty when no translations have been captured — in which case description is all you have, in the operator's default language. |
translations[].type | string | The object type the translation belongs to — always MembershipType in this collection. |
translations[].culture | string | The culture the text is written in. |
translations[].text | string | The translated text for the membership type. |
documentationRequired | array of object | The document types a joiner must supply before this membership can be sold — proof of age, proof of address and the like. Empty when the type demands none. Collect these during your join flow; the platform does not gather them for you. |
documentationRequired[].documentTypeId | integer (int32) | The document type's numeric identifier, and the key its translations entries are held against. Quote it when uploading the member's document. |
documentationRequired[].documentDescription | string | The document type's display name in the default language — what to ask the joiner for. |
documentationRequired[].translations | array of object | Localised text for this document type, keyed on documentTypeId. Empty when no translations have been captured. |
documentationRequired[].translations[].type | string | The object type the translation belongs to — always DocumentType in this collection. |
documentationRequired[].translations[].culture | string | The culture the text is written in. |
documentationRequired[].translations[].text | string | The translated document description for that culture. |
maximumUsage | integer (int32) | Always 0 on this endpoint — never populated by this call, so 0 does not mean "unlimited" or "none". The operator may have configured a maximum usage figure; this endpoint simply does not return it. |
Sample response
{
"id": "string",
"description": "string",
"autoRenewIndicator": 1,
"applyToLinksInd": 1,
"autoRenews": true,
"isGroupMembership": true,
"paymentMethodId": "string",
"priceLevelId": "string",
"statusId": "string",
"duration": 1,
"durationTypeIndicator": 1,
"durationType": 0,
"units": 1,
"unitTypeIndicator": 1,
"unitType": 0,
"startupType": 1,
"renewalDay": 1,
"renewalMonth": 1,
"minAge": 1,
"maxAge": 1,
"imageUrl": "string",
"preventConcurrencyInd": true,
"allowDuplicateSubscriptions": true,
"priority": 1,
"earliestStartDate": "2026-08-14T19:00:00Z",
"fixedEndDate": null,
"tagGroups": [
{
"id": 12345,
"key": "string",
"name": "string",
"description": "string",
"type": "string",
"allowMultipleTags": true,
"sortOrder": 1,
"tags": [
{
"id": 12345,
"key": "string",
"name": "string",
"description": "string",
"sortOrder": 1,
"isSecondary": true,
"translations": [
{
"type": "string",
"culture": "string",
"text": "string"
}
]
}
],
"translations": [
{
"type": "string",
"culture": "string",
"text": "string"
}
]
}
],
"translations": [
{
"type": "string",
"culture": "string",
"text": "string"
}
],
"documentationRequired": [
{
"documentTypeId": 12345,
"documentDescription": "string",
"translations": [
{
"type": "string",
"culture": "string",
"text": "string"
}
]
}
],
"maximumUsage": 1
}Errors
This endpoint only ever returns 200, 404 and 500. The other rows below are not returned by this endpoint; they are listed so you recognise them if a gateway or proxy in front of the API returns one.
| Status | Meaning | When |
|---|---|---|
400 | Bad request | Not produced by this endpoint. A membership type that does not exist returns 404, not 400 — worth checking if you have generalised from other Configuration lookups, several of which do the opposite. |
404 | Not found | No membership type has that ID. The body is the plain-text sentence Membership type ID {id} was not found., including the full stop. |
422 | Unprocessable entity | Not produced by this endpoint. |
500 | Internal server error | An unexpected server-side failure while reading the type, its tags or its price level. The response body is empty — the reason is not returned to you. Note that this also covers faults reading the price level used to fill minAge/maxAge, so a broken price level can fail an otherwise valid membership type. |
503 | Service unavailable | Not produced by this endpoint. Treat it as an infrastructure response and retry. |