Appointment, bookable appointment and slots operations
PerfectGym Next API (1.11.1)
- Appointment, bookable appointment and slots operations
- Redeem checkin vouchers
- Class and slots operations
- Cross studio operations
- Get customers and contracts
- Retrieve customer accounting details
- Retrieve customer communication details
- Get device information
- Employee operations
- Debt collection operations
- Leads operations
- Manage membership contracts
- Membership operations
- Payment operations
- Get studio information
- Get trial offers information
https://open-api-demo.open-api.perfectgym.com/
https://redocly.sportalliance.com/_mock/apis/perfectgym/openapi/openapi/
- Demo tenant
https://open-api-demo.open-api.perfectgym.com/v1/memberships/membership-offers
- Mock server
https://redocly.sportalliance.com/_mock/apis/perfectgym/openapi/openapi/v1/memberships/membership-offers
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
https://open-api-demo.open-api.perfectgym.com/v1/memberships/membership-offers \
-H 'X-API-KEY: YOUR_API_KEY_HERE'OK
Description of the membership offer.
Sub description for the membership offer.
Temporary valid download link for rate bundle image. Expires after 2 hours.
Contractual or legal comments to be displayed below the offer.
Contract pre-use type information.
| Enum Value | Description |
|---|---|
| CHARGEABLE | Contract pre-use is chargeable |
| FREE | Contract pre-use is free |
| NOT_AVAILABLE | Contract is not available for pre-use |
Period in which the membership offer is valid.
Rate codes of the membership offer.
List of terms that are part of this membership offer.
Contains the total amount to be paid during the initial runtime of the contract and the average amounts per month and per the rate's payment frequency (e.g. 1 week)
Represents the payment frequency
The unique identifier of the payment frequency. (null possible for starter package)
Payment frequency type of a contract
| Enum Value | Description |
|---|---|
| TERM_BASED | Represents that the contract payment frequency is based on terms, with a possibly individual price per term. |
| NON_RECURRING | Represents that the contract payment frequency is non recurring, meaning only one payment is necessary here. |
| FREE | Represents that the contract payment frequency is free of charge. |
| RECURRING | Represents that the contract payment frequency is recurring, meaning that the payment will take place every term. |
| MONTH_DAY | Represents that the contract payment frequency is based on month days, with a possibly individual price per month day. |
Base price, used only for payment frequencies of type RECURRING
Month day to prices list, used for contract payment frequency type MONTH_DAY
Terms to prices list, used for contract payment frequency type TERM_BASED. Note that the price will become active AFTER the respective term has passed
Whether the cycle of payments repeats indefinitely. Only relevant if type is TERM_BASED or MONTH_DAY.
[ { "id": 0, "description": "This offer includes access to all gym facilities and group classes.", "name": "Standard Membership", "subDescription": "Best value for regular gym-goers.", "imageUrl": "https://example.com", "footnote": "This offer is valid for new members only. Terms and conditions apply.", "preUseType": "NOT_AVAILABLE", "limitedOfferingPeriod": { … }, "rateCodes": [ … ], "terms": [ … ] } ]
- Demo tenant
https://open-api-demo.open-api.perfectgym.com/v1/memberships/membership-offers/{membershipOfferId}
- Mock server
https://redocly.sportalliance.com/_mock/apis/perfectgym/openapi/openapi/v1/memberships/membership-offers/{membershipOfferId}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://open-api-demo.open-api.perfectgym.com/v1/memberships/membership-offers/{membershipOfferId}' \
-H 'X-API-KEY: YOUR_API_KEY_HERE'OK
Description of the membership offer.
Sub description for the membership offer.
Temporary valid download link for rate bundle image. Expires after 2 hours.
Contractual or legal comments to be displayed below the offer.
Contract pre-use type information.
| Enum Value | Description |
|---|---|
| CHARGEABLE | Contract pre-use is chargeable |
| FREE | Contract pre-use is free |
| NOT_AVAILABLE | Contract is not available for pre-use |
Period in which the membership offer is valid.
Rate codes of the membership offer.
List of included modules of this membership offer.
Unique identifier for the membership offer module.
Name of the membership offer module.
Description of the membership offer module.
Image url of membership offer module. Expires after 5hours.
Represents the terms of a membership offer.
Module term extension type
| Enum Value | Description |
|---|---|
| SUBSEQUENT_RATE_DETAIL | Subsequent rate detail |
| TERM_EXTENSION | Term extension |
| NONE | No extension |
Represents the trial period of a membership offer.
Indicates if contract signatures are required for this membership offer.
Allowed payment choices for this membership offer.
| Items Enum Value | Description |
|---|---|
| BACS | Payment by BACS direct debit |
| IDEAL | Payment by ideal |
| PAYPAL | Payment by paypal |
| TWINT | Payment by Twint |
| SEPA | Payment by SEPA direct debit |
| BANK_TRANSFER | Payment by bank transfer |
| CH_DD | Payment by CH_DD direct debit |
| CASH | Payment by cash |
| BANCONTACT | Payment by bancontact |
| CREDIT_CARD | Payment by credit card |
Maximum number of selectableModules for this membership offer. If 0, no modules can be selected.
List of contract text blocks that are part of this membership offer.
Text block configuration has a signature field. You have the option to show a signature input field and it will be added in the contract document. It is not a required field in magicline. It is up to your implementation if you add this field.
Text block contains information about the communication privacy options. You are advised to show a matrix with communication settings in combination with this text block.
Indicates the type of attachment for this block
| Enum Value | Description |
|---|---|
| CONTRACT_PDF_PREVIEW | Contract PDF preview |
| NONE | No text block |
| FILE | File information available in |
| URL | Url information available in |
The ID of the associated rate bundle module. Only set if this is a module consent text block.
List of selectable modules for this membership offer. Limited by maximumNumberOfSelectableModules.
List of terms that are part of this membership offer.
{ "id": 0, "description": "This offer includes access to all gym facilities and group classes.", "name": "Standard Membership", "subDescription": "Best value for regular gym-goers.", "imageUrl": "https://example.com", "footnote": "This offer is valid for new members only. Terms and conditions apply.", "preUseType": "NOT_AVAILABLE", "limitedOfferingPeriod": { "startDate": "2025-01-01", "endDate": "2026-01-01" }, "rateCodes": [ { … } ], "includedModules": [ { … } ], "contractSignaturesRequired": true, "allowedPaymentChoices": [ "CASH" ], "maximumNumberOfSelectableModules": 0, "contractTextBlocks": [ { … } ], "selectableModules": [ { … } ], "terms": [ { … } ], "timeRestrictions": { "openingHoursCategory": { … }, "availabilities": [ … ] } }
The contract information used for the membership signup
Unique ID of the contract offer term
The pre use date of the contract. If not provided, it will be evaluated based on contract offer configuration.
Unique ID of the third party contract in the third party system
Unique ID of the employee who created the membership
The selected modules from the available selectable modules
The selected modules from the available optional modules
This token identifies a pre-authorized payment request. It acts as a reference to the payment session initiated by the user. It's not needed for preview endpoints.
The customer information used for the membership signup
Unique ID of the third party customer in the third party system
Place of birth of the customer. Required for Italian studios and nationals.
Country of birth of the customer. Required for Italian studios and non-Italian nationals
Gender of the customer
| Enum Value | Description |
|---|---|
| MALE | Male gender of the customer |
| FEMALE | Female gender of the customer |
| UNISEX | Unisex gender of the customer |
Additional address information of the customer's address
Language of the customer
Required if the studio is located in Spain or Italy. Alternatively, a valid document identification can be provided.
List of communication preferences for the customer
Information from an official document that identifies the customer
By assigning the paymentRequestToken to the customer, the payment method associated with the token will be used as payment method setting of the customer. Additionally, if the paymentRequestToken is associated with a payment instrument, i.e. a SEPA Mandate, BACS Mandate, Credit Card, or other, the payment instrument will be made available in the member account for future collection via payment runs. By leaving this field empty the payment method of the customer will be set to CASH. For reference check 'Create a user payment session'.
- Demo tenant
https://open-api-demo.open-api.perfectgym.com/v1/memberships/signup/preview
- Mock server
https://redocly.sportalliance.com/_mock/apis/perfectgym/openapi/openapi/v1/memberships/signup/preview
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://open-api-demo.open-api.perfectgym.com/v1/memberships/signup/preview \
-H 'Content-Type: application/json' \
-H 'X-API-KEY: YOUR_API_KEY_HERE' \
-d '{
"contract": {
"contractOfferTermId": 1000,
"startDate": "2026-02-01",
"preuseDate": "2026-01-01",
"notes": "Some notes",
"thirdPartyId": "1000a",
"employeeId": 1239812733,
"referralCode": "A500D",
"selectedSelectableModuleIds": [
0
],
"selectedOptionalModuleIds": [
0
],
"initialPaymentRequestToken": "3JtyH5sakfn2V22vB0napNC2zWMlpFwS9gPQawuk7Jw1F00atOD0BA",
"contractSignature": {
"base64SvgSignature": "string"
},
"textBlockSignatures": [
{
"base64SvgSignature": "string",
"textBlockId": 0
}
],
"voucherCode": 123
},
"customer": {
"thirdPartyId": "A1000",
"firstName": "Peter",
"secondFirstName": "Thomas",
"lastName": "Muller",
"secondLastName": "Meyer",
"dateOfBirth": "2019-08-24",
"placeOfBirth": "string",
"countryOfBirth": "string",
"email": "example@example.com",
"gender": "MALE",
"phoneNumberPrivate": "+44123456789",
"phoneNumberMobile": "+44987654321",
"street": "Raboisen Street",
"secondStreet": "Second Street",
"cityPart": "Tegel",
"district": "District 12",
"streetType": "Avenue",
"streetBlock": "5th block",
"portal": "Portal 1",
"stairway": "Right stairway",
"door": "Door 1",
"province": "Champagne",
"additionalAddressInformation": "Additional information",
"floor": "2nd floor",
"language": {
"languageCode": "de",
"countryCode": "DE"
},
"houseNumber": "3-4",
"buildingName": "Empire State Building",
"city": "Hamburg",
"zipCode": "220-99",
"countryCode": "DE",
"taxId": "12345678A",
"communicationPreferences": [
{
"messageCategory": "CONTRACT",
"channels": [
{
"communicationChannel": "EMAIL",
"customerOverridable": true,
"active": true
}
]
}
],
"documentIdentification": {
"documentNumber": "CX5432112345DS",
"documentType": "ID_CARD"
},
"paymentRequestToken": "string",
"additionalInformationFieldAssignments": [
{
"additionalInformationFieldId": 1234567890,
"value": "string"
}
]
}
}'OK
Base price of contract
Type of a voucher, if a valid voucher code has been provided
| Enum Value | Description |
|---|---|
| CREDIT | Represents a credit voucher |
| CHECKIN | Represents a check-in voucher |
| COMPANY_FEE_SPLIT | Represents a company fee split voucher |
| CONTRACT | Represents a contract voucher |
| DISCOUNT | Represents a discount voucher |
Voucher remarks, if a valid voucher code has been provided
List of discount periods for the voucher, if a valid discount voucher code has been provided. Each period has its own discount and effective period.
Discounted pre-use charge, if a valid discount voucher code has been provided
Type of company fee split (percentage or absolute), if a valid company discount voucher code has been provided
| Enum Value | Description |
|---|---|
| ABSOLUTE | Represents an absolute discount |
| PERCENTAGE | Represents a percentage based discount |
Company fee split value, if a valid company discount voucher code has been provided
Name of the company that will pay the company amount, if a valid company discount voucher code has been provided
Amount the company has to pay, if a valid company discount voucher code has been provided. This field is populated when there are 0 or 1 discount periods. For multiple discount periods, use voucherDiscountPeriods[].companyAmount instead to see amounts per discount period.
Amount the member has to pay, if a valid company discount voucher code has been provided. This field is populated when there are 0 or 1 discount periods. For multiple discount periods, use voucherDiscountPeriods[].memberAmount instead to see amounts per discount period.
Amount the company has to pay without discount, if a valid company discount voucher code has been provided
Amount the member has to pay without discount, if a valid company discount voucher code has been provided
Bonus period applied with the discount voucher, if valid a discount voucher has been provided
Voucher related text blocks, if a valid voucher code has been provided
Flat fee previews, including discount if a valid discount voucher code has been provided
Textual representation of the voucher conditions, if a valid voucher code has been provided
An error code, if the voucher code is invalid
| Value | Description |
|---|---|
| INVALID_CODE | Represents an invalid voucher code |
The adjusted price, if age-based discounts are configured and the customer is eligible, null otherwise
Contains the total amount to be paid during the initial runtime of the contract and the average amounts per month and per the rate's payment frequency (e.g. 1 week)
Consent texts for modules that are part of the contract
Optional module contract preview including discount, company split or credit, if a valid voucher code has been provided
Detailed payment preview including schedule and due-on-signing amount
The type of period for which the voucher is applied, if a valid voucher code has been provided. Deprecated: Use voucherDiscountPeriods[].effectivePeriod instead to see periods per discount period.
| Enum Value | Description |
|---|---|
| TIME_BASED | Represents a voucher with a time based effective period |
| UNLIMITED | Represents a voucher with unlimited effective period |
| INITIAL_TERM | Represents a voucher effective during the initial term of the membership |
Effective period: term for which a discount is applied, if type is time based and a valid voucher code has been provided. Deprecated: Use voucherDiscountPeriods[].effectivePeriodTimeBasedTerm instead to see terms per discount period.
Discounted base price, if a valid discount voucher code has been provided. Deprecated: Use voucherDiscountPeriods[].discountedBasePrice instead to see prices per discount period.
Type of discount (percentage or absolute), if a valid discount voucher code has been provided. Deprecated: Use voucherDiscountPeriods[].discountType instead to see discount types per discount period.
| Enum Value | Description |
|---|---|
| ABSOLUTE | Represents an absolute discount |
| PERCENTAGE | Represents a percentage based discount |
{ "basePrice": { "amount": 20, "currency": "EUR" }, "preUseCharge": { "amount": 20, "currency": "EUR" }, "voucherType": "DISCOUNT", "voucherRemarks": "Yoga class not included", "voucherEffectivePeriod": "UNLIMITED", "effectivePeriodTimeBasedTerm": { "value": 2, "unit": "WEEK" }, "discountedBasePrice": { "amount": 20, "currency": "EUR" }, "discountType": "PERCENTAGE", "discountValue": { "amount": 20, "currency": "EUR" }, "voucherDiscountPeriods": [ { … } ], "discountedPreUseCharge": { "amount": 20, "currency": "EUR" }, "creditValue": { "amount": 20, "currency": "EUR" }, "companyFeeSplitType": "ABSOLUTE", "companyFeeSplitValue": { "amount": 20, "currency": "EUR" }, "companyName": "Some company", "companyAmount": { "amount": 20, "currency": "EUR" }, "memberAmount": { "amount": 20, "currency": "EUR" }, "companyAmountWithoutDiscount": { "amount": 20, "currency": "EUR" }, "memberAmountWithoutDiscount": { "amount": 20, "currency": "EUR" }, "voucherBonusPeriod": { "term": { … }, "termStrategy": "CONTRACT_START", "displaySeparately": true, "runtimeExtensionType": "WITH_EXTENSION", "extendsCancellationPeriod": false }, "voucherTextBlocks": [ { … } ], "flatFeePreviews": [ { … } ], "voucherSuccessMessage": "Voucher code \"123\" successfully applied: 5% discount on the membership fee", "voucherErrorCode": "INVALID_CODE", "ageAdjustedPrice": { "amount": 20, "currency": "EUR" }, "contractVolumeInformation": { "totalContractVolume": { … }, "averagePaymentVolumePerMonth": { … }, "averagePaymentVolumePerPaymentFrequencyTerm": { … } }, "moduleConsentTextBlocks": [ { … } ], "selectedOptionalModulesPreviews": [ { … } ], "paymentPreview": { "paymentSchedule": [ … ], "dueOnSigningAmount": { … } } }
The contract information used for the membership signup
Unique ID of the contract offer term
The pre use date of the contract. If not provided, it will be evaluated based on contract offer configuration.
Unique ID of the third party contract in the third party system
Unique ID of the employee who created the membership
The selected modules from the available selectable modules
The selected modules from the available optional modules
This token identifies a pre-authorized payment request. It acts as a reference to the payment session initiated by the user. It's not needed for preview endpoints.
The customer information used for the membership signup
Unique ID of the third party customer in the third party system
Place of birth of the customer. Required for Italian studios and nationals.
Country of birth of the customer. Required for Italian studios and non-Italian nationals
Gender of the customer
| Enum Value | Description |
|---|---|
| MALE | Male gender of the customer |
| FEMALE | Female gender of the customer |
| UNISEX | Unisex gender of the customer |
Additional address information of the customer's address
Language of the customer
Required if the studio is located in Spain or Italy. Alternatively, a valid document identification can be provided.
List of communication preferences for the customer
Information from an official document that identifies the customer
By assigning the paymentRequestToken to the customer, the payment method associated with the token will be used as payment method setting of the customer. Additionally, if the paymentRequestToken is associated with a payment instrument, i.e. a SEPA Mandate, BACS Mandate, Credit Card, or other, the payment instrument will be made available in the member account for future collection via payment runs. By leaving this field empty the payment method of the customer will be set to CASH. For reference check 'Create a user payment session'.
- Demo tenant
https://open-api-demo.open-api.perfectgym.com/v1/memberships/signup
- Mock server
https://redocly.sportalliance.com/_mock/apis/perfectgym/openapi/openapi/v1/memberships/signup
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://open-api-demo.open-api.perfectgym.com/v1/memberships/signup \
-H 'Content-Type: application/json' \
-H 'X-API-KEY: YOUR_API_KEY_HERE' \
-d '{
"contract": {
"contractOfferTermId": 1000,
"startDate": "2026-02-01",
"preuseDate": "2026-01-01",
"notes": "Some notes",
"thirdPartyId": "1000a",
"employeeId": 1239812733,
"referralCode": "A500D",
"selectedSelectableModuleIds": [
0
],
"selectedOptionalModuleIds": [
0
],
"initialPaymentRequestToken": "3JtyH5sakfn2V22vB0napNC2zWMlpFwS9gPQawuk7Jw1F00atOD0BA",
"contractSignature": {
"base64SvgSignature": "string"
},
"textBlockSignatures": [
{
"base64SvgSignature": "string",
"textBlockId": 0
}
],
"voucherCode": 123
},
"customer": {
"thirdPartyId": "A1000",
"firstName": "Peter",
"secondFirstName": "Thomas",
"lastName": "Muller",
"secondLastName": "Meyer",
"dateOfBirth": "2019-08-24",
"placeOfBirth": "string",
"countryOfBirth": "string",
"email": "example@example.com",
"gender": "MALE",
"phoneNumberPrivate": "+44123456789",
"phoneNumberMobile": "+44987654321",
"street": "Raboisen Street",
"secondStreet": "Second Street",
"cityPart": "Tegel",
"district": "District 12",
"streetType": "Avenue",
"streetBlock": "5th block",
"portal": "Portal 1",
"stairway": "Right stairway",
"door": "Door 1",
"province": "Champagne",
"additionalAddressInformation": "Additional information",
"floor": "2nd floor",
"language": {
"languageCode": "de",
"countryCode": "DE"
},
"houseNumber": "3-4",
"buildingName": "Empire State Building",
"city": "Hamburg",
"zipCode": "220-99",
"countryCode": "DE",
"taxId": "12345678A",
"communicationPreferences": [
{
"messageCategory": "CONTRACT",
"channels": [
{
"communicationChannel": "EMAIL",
"customerOverridable": true,
"active": true
}
]
}
],
"documentIdentification": {
"documentNumber": "CX5432112345DS",
"documentType": "ID_CARD"
},
"paymentRequestToken": "string",
"additionalInformationFieldAssignments": [
{
"additionalInformationFieldId": 1234567890,
"value": "string"
}
]
}
}'{ "customerId": 1000 }
The pre use date of the contract. If not provided, it will be evaluated based on contract offer configuration.
The selected modules from the available selectable modules
The selected modules from the available optional modules
This token identifies a pre-authorized payment request. It acts as a reference to the payment session initiated by the user. It's not needed for preview endpoints.
- Demo tenant
https://open-api-demo.open-api.perfectgym.com/v1/memberships/customers/{customerId}/add-membership/preview
- Mock server
https://redocly.sportalliance.com/_mock/apis/perfectgym/openapi/openapi/v1/memberships/customers/{customerId}/add-membership/preview
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
'https://open-api-demo.open-api.perfectgym.com/v1/memberships/customers/{customerId}/add-membership/preview' \
-H 'Content-Type: application/json' \
-H 'X-API-KEY: YOUR_API_KEY_HERE' \
-d '{
"contractOfferTermId": 1000,
"startDate": "2026-02-01",
"preuseDate": "2026-01-01",
"notes": "Some notes",
"thirdPartyId": "1000a",
"employeeId": 1239812733,
"referralCode": "A500D",
"selectedSelectableModuleIds": [
0
],
"selectedOptionalModuleIds": [
0
],
"initialPaymentRequestToken": "3JtyH5sakfn2V22vB0napNC2zWMlpFwS9gPQawuk7Jw1F00atOD0BA",
"contractSignature": {
"base64SvgSignature": "string"
},
"textBlockSignatures": [
{
"base64SvgSignature": "string",
"textBlockId": 0
}
],
"voucherCode": 123
}'OK
Base price of contract
Type of a voucher, if a valid voucher code has been provided
| Enum Value | Description |
|---|---|
| CREDIT | Represents a credit voucher |
| CHECKIN | Represents a check-in voucher |
| COMPANY_FEE_SPLIT | Represents a company fee split voucher |
| CONTRACT | Represents a contract voucher |
| DISCOUNT | Represents a discount voucher |
Voucher remarks, if a valid voucher code has been provided
List of discount periods for the voucher, if a valid discount voucher code has been provided. Each period has its own discount and effective period.
Discounted pre-use charge, if a valid discount voucher code has been provided
Type of company fee split (percentage or absolute), if a valid company discount voucher code has been provided
| Enum Value | Description |
|---|---|
| ABSOLUTE | Represents an absolute discount |
| PERCENTAGE | Represents a percentage based discount |
Company fee split value, if a valid company discount voucher code has been provided
Name of the company that will pay the company amount, if a valid company discount voucher code has been provided
Amount the company has to pay, if a valid company discount voucher code has been provided. This field is populated when there are 0 or 1 discount periods. For multiple discount periods, use voucherDiscountPeriods[].companyAmount instead to see amounts per discount period.
Amount the member has to pay, if a valid company discount voucher code has been provided. This field is populated when there are 0 or 1 discount periods. For multiple discount periods, use voucherDiscountPeriods[].memberAmount instead to see amounts per discount period.
Amount the company has to pay without discount, if a valid company discount voucher code has been provided
Amount the member has to pay without discount, if a valid company discount voucher code has been provided
Bonus period applied with the discount voucher, if valid a discount voucher has been provided
Voucher related text blocks, if a valid voucher code has been provided
Flat fee previews, including discount if a valid discount voucher code has been provided
Textual representation of the voucher conditions, if a valid voucher code has been provided
An error code, if the voucher code is invalid
| Value | Description |
|---|---|
| INVALID_CODE | Represents an invalid voucher code |
The adjusted price, if age-based discounts are configured and the customer is eligible, null otherwise
Contains the total amount to be paid during the initial runtime of the contract and the average amounts per month and per the rate's payment frequency (e.g. 1 week)
Consent texts for modules that are part of the contract
Optional module contract preview including discount, company split or credit, if a valid voucher code has been provided
Detailed payment preview including schedule and due-on-signing amount
The type of period for which the voucher is applied, if a valid voucher code has been provided. Deprecated: Use voucherDiscountPeriods[].effectivePeriod instead to see periods per discount period.
| Enum Value | Description |
|---|---|
| TIME_BASED | Represents a voucher with a time based effective period |
| UNLIMITED | Represents a voucher with unlimited effective period |
| INITIAL_TERM | Represents a voucher effective during the initial term of the membership |
Effective period: term for which a discount is applied, if type is time based and a valid voucher code has been provided. Deprecated: Use voucherDiscountPeriods[].effectivePeriodTimeBasedTerm instead to see terms per discount period.
Discounted base price, if a valid discount voucher code has been provided. Deprecated: Use voucherDiscountPeriods[].discountedBasePrice instead to see prices per discount period.
Type of discount (percentage or absolute), if a valid discount voucher code has been provided. Deprecated: Use voucherDiscountPeriods[].discountType instead to see discount types per discount period.
| Enum Value | Description |
|---|---|
| ABSOLUTE | Represents an absolute discount |
| PERCENTAGE | Represents a percentage based discount |
{ "basePrice": { "amount": 20, "currency": "EUR" }, "preUseCharge": { "amount": 20, "currency": "EUR" }, "voucherType": "DISCOUNT", "voucherRemarks": "Yoga class not included", "voucherEffectivePeriod": "UNLIMITED", "effectivePeriodTimeBasedTerm": { "value": 2, "unit": "WEEK" }, "discountedBasePrice": { "amount": 20, "currency": "EUR" }, "discountType": "PERCENTAGE", "discountValue": { "amount": 20, "currency": "EUR" }, "voucherDiscountPeriods": [ { … } ], "discountedPreUseCharge": { "amount": 20, "currency": "EUR" }, "creditValue": { "amount": 20, "currency": "EUR" }, "companyFeeSplitType": "ABSOLUTE", "companyFeeSplitValue": { "amount": 20, "currency": "EUR" }, "companyName": "Some company", "companyAmount": { "amount": 20, "currency": "EUR" }, "memberAmount": { "amount": 20, "currency": "EUR" }, "companyAmountWithoutDiscount": { "amount": 20, "currency": "EUR" }, "memberAmountWithoutDiscount": { "amount": 20, "currency": "EUR" }, "voucherBonusPeriod": { "term": { … }, "termStrategy": "CONTRACT_START", "displaySeparately": true, "runtimeExtensionType": "WITH_EXTENSION", "extendsCancellationPeriod": false }, "voucherTextBlocks": [ { … } ], "flatFeePreviews": [ { … } ], "voucherSuccessMessage": "Voucher code \"123\" successfully applied: 5% discount on the membership fee", "voucherErrorCode": "INVALID_CODE", "ageAdjustedPrice": { "amount": 20, "currency": "EUR" }, "contractVolumeInformation": { "totalContractVolume": { … }, "averagePaymentVolumePerMonth": { … }, "averagePaymentVolumePerPaymentFrequencyTerm": { … } }, "moduleConsentTextBlocks": [ { … } ], "selectedOptionalModulesPreviews": [ { … } ], "paymentPreview": { "paymentSchedule": [ … ], "dueOnSigningAmount": { … } } }
The pre use date of the contract. If not provided, it will be evaluated based on contract offer configuration.
The selected modules from the available selectable modules
The selected modules from the available optional modules
This token identifies a pre-authorized payment request. It acts as a reference to the payment session initiated by the user. It's not needed for preview endpoints.
- Demo tenant
https://open-api-demo.open-api.perfectgym.com/v1/memberships/customers/{customerId}/add-membership
- Mock server
https://redocly.sportalliance.com/_mock/apis/perfectgym/openapi/openapi/v1/memberships/customers/{customerId}/add-membership
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
'https://open-api-demo.open-api.perfectgym.com/v1/memberships/customers/{customerId}/add-membership' \
-H 'Content-Type: application/json' \
-H 'X-API-KEY: YOUR_API_KEY_HERE' \
-d '{
"contractOfferTermId": 1000,
"startDate": "2026-02-01",
"preuseDate": "2026-01-01",
"notes": "Some notes",
"thirdPartyId": "1000a",
"employeeId": 1239812733,
"referralCode": "A500D",
"selectedSelectableModuleIds": [
0
],
"selectedOptionalModuleIds": [
0
],
"initialPaymentRequestToken": "3JtyH5sakfn2V22vB0napNC2zWMlpFwS9gPQawuk7Jw1F00atOD0BA",
"contractSignature": {
"base64SvgSignature": "string"
},
"textBlockSignatures": [
{
"base64SvgSignature": "string",
"textBlockId": 0
}
],
"voucherCode": 123
}'- Demo tenant
https://open-api-demo.open-api.perfectgym.com/v1/memberships/{customerId}/membership-switch/configs
- Mock server
https://redocly.sportalliance.com/_mock/apis/perfectgym/openapi/openapi/v1/memberships/{customerId}/membership-switch/configs
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://open-api-demo.open-api.perfectgym.com/v1/memberships/{customerId}/membership-switch/configs?studioId=0' \
-H 'X-API-KEY: YOUR_API_KEY_HERE'[ { "id": 1000, "name": "Premium Membership Upgrade", "presentation": { … }, "sourceContracts": [ … ] } ]
- Demo tenant
https://open-api-demo.open-api.perfectgym.com/v1/memberships/{customerId}/membership-switch/configs/{configId}
- Mock server
https://redocly.sportalliance.com/_mock/apis/perfectgym/openapi/openapi/v1/memberships/{customerId}/membership-switch/configs/{configId}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://open-api-demo.open-api.perfectgym.com/v1/memberships/{customerId}/membership-switch/configs/{configId}?studioId=0' \
-H 'X-API-KEY: YOUR_API_KEY_HERE'OK
Presentation details for the membership switch configuration
List of source contracts for the membership switch
List of destination membership offers
Description of the membership offer.
Name of the membership offer.
Sub description for the membership offer.
Temporary valid download link for rate bundle image. Expires after 2 hours.
Contractual or legal comments to be displayed below the offer.
Contract pre-use type information.
| Enum Value | Description |
|---|---|
| CHARGEABLE | Contract pre-use is chargeable |
| FREE | Contract pre-use is free |
| NOT_AVAILABLE | Contract is not available for pre-use |
Period in which the membership offer is valid.
Rate codes of the membership offer.
List of included modules of this membership offer.
Unique identifier for the membership offer module.
Name of the membership offer module.
Description of the membership offer module.
Image url of membership offer module. Expires after 5hours.
Represents the terms of a membership offer.
Module term extension type
| Enum Value | Description |
|---|---|
| SUBSEQUENT_RATE_DETAIL | Subsequent rate detail |
| TERM_EXTENSION | Term extension |
| NONE | No extension |
Represents a term
Represents the trial period of a membership offer.
Contract text block information.
Indicates if contract signatures are required for this membership offer.
Allowed payment choices for this membership offer.
| Items Enum Value | Description |
|---|---|
| BACS | Payment by BACS direct debit |
| IDEAL | Payment by ideal |
| PAYPAL | Payment by paypal |
| TWINT | Payment by Twint |
| SEPA | Payment by SEPA direct debit |
| BANK_TRANSFER | Payment by bank transfer |
| CH_DD | Payment by CH_DD direct debit |
| CASH | Payment by cash |
| BANCONTACT | Payment by bancontact |
| CREDIT_CARD | Payment by credit card |
Maximum number of selectableModules for this membership offer. If 0, no modules can be selected.
List of contract text blocks that are part of this membership offer.
The unique identifier of the text block
The title of the text block
The text of the text block
The order of the text block in the contract
Text block configuration has a signature field. You have the option to show a signature input field and it will be added in the contract document. It is not a required field in magicline. It is up to your implementation if you add this field.
Text block contains information about the communication privacy options. You are advised to show a matrix with communication settings in combination with this text block.
Indicates the type of attachment for this block
| Enum Value | Description |
|---|---|
| CONTRACT_PDF_PREVIEW | Contract PDF preview |
| NONE | No text block |
| FILE | File information available in |
| URL | Url information available in |
Represents url information.
Represents document information.
The ID of the associated rate bundle module. Only set if this is a module consent text block.
List of selectable modules for this membership offer. Limited by maximumNumberOfSelectableModules.
List of terms that are part of this membership offer.
{ "id": 1000, "name": "Premium Membership Upgrade", "presentation": { "bannerText": "string", "imageUrl": "string" }, "sourceContracts": [ { … } ], "destinationMembershipOffers": [ { … } ] }
Unique ID of the membership switch offer term
Unique ID of the contract which is being switched from
The selected modules from the available selectable modules
The selected modules from the available optional modules
- Demo tenant
https://open-api-demo.open-api.perfectgym.com/v1/memberships/{customerId}/membership-switch/preview
- Mock server
https://redocly.sportalliance.com/_mock/apis/perfectgym/openapi/openapi/v1/memberships/{customerId}/membership-switch/preview
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
'https://open-api-demo.open-api.perfectgym.com/v1/memberships/{customerId}/membership-switch/preview?studioId=0' \
-H 'Content-Type: application/json' \
-H 'X-API-KEY: YOUR_API_KEY_HERE' \
-d '{
"configId": 1234567890,
"membershipOfferTermId": 1234567890,
"sourceContractId": 1234567890,
"startDate": "2025-08-24",
"notes": "Some notes",
"thirdPartyId": "1000a",
"selectedSelectableModuleIds": [
0
],
"selectedOptionalModuleIds": [
0
],
"initialPaymentRequestToken": "3JtyH5sakfn2V22vB0napNC2zWMlpFwS9gPQawuk7Jw1F00atOD0BA"
}'{ "contractVolumeInformation": { "totalContractVolume": { … }, "averagePaymentVolumePerMonth": { … }, "averagePaymentVolumePerPaymentFrequencyTerm": { … } }, "ageAdjustedPrice": { "amount": 20, "currency": "EUR" }, "moduleConsentTextBlocks": [ { … } ], "paymentPreview": { "paymentSchedule": [ … ], "dueOnSigningAmount": { … } } }
Unique ID of the membership switch offer term
Unique ID of the contract which is being switched from
The selected modules from the available selectable modules
The selected modules from the available optional modules
- Demo tenant
https://open-api-demo.open-api.perfectgym.com/v1/memberships/{customerId}/membership-switch
- Mock server
https://redocly.sportalliance.com/_mock/apis/perfectgym/openapi/openapi/v1/memberships/{customerId}/membership-switch
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
'https://open-api-demo.open-api.perfectgym.com/v1/memberships/{customerId}/membership-switch' \
-H 'Content-Type: application/json' \
-H 'X-API-KEY: YOUR_API_KEY_HERE' \
-d '{
"configId": 1234567890,
"membershipOfferTermId": 1234567890,
"sourceContractId": 1234567890,
"startDate": "2025-08-24",
"notes": "Some notes",
"thirdPartyId": "1000a",
"selectedSelectableModuleIds": [
0
],
"selectedOptionalModuleIds": [
0
],
"initialPaymentRequestToken": "3JtyH5sakfn2V22vB0napNC2zWMlpFwS9gPQawuk7Jw1F00atOD0BA"
}'