Download OpenAPI specification:
The Glofox API is a REST API that lets integrations manage members, memberships, credits, classes, bookings, and payments. Responses use JSON.
Include these headers in every API call:
| Header | Description |
|---|---|
x-glofox-branch-id |
Branch ID for the current request. |
x-api-key |
API key for the integration. |
x-glofox-api-token |
API token for the integration. |
Always proxy API key and token requests through a secure backend. Never expose credentials in client-side applications.
Following REST standards, the API may return different HTTP error codes depending on the endpoint and the server’s logic.
| Status Code | Description |
|---|---|
| 400 Bad Request | Indicates an issue with the request data, typically caused by invalid input. |
| 401 Unauthorized | The request is not authenticated. |
| 403 Forbidden | The client does not have permission to access the requested resource. |
| 404 Not Found | The requested resource does not exist. |
| 429 Too Many Requests | The API blocks the request when you exceed the rate limit. |
| 500 Internal Server Error | A generic error indicating a problem on the server side. |
Older endpoints: sometimes return a 200 status code with a success field set to false. That indicates a bad request. Add middleware to map those responses to 400.
Error responses use this JSON shape:
{
"message": "Invalid email format",
"message_code": "INVALID_EMAIL"
}
message — human-readable explanation of the errormessage_code — key you can use on the client sideA branch (a.k.a. studio or location) is a physical location. They will have their own set of members and staff (even roaming ones can be shared). The ID it's the same that is send as a header in x-glofox-api-token
Retrieves locations (branches) associated with an integrator's allowed namespaces. Acts as a proxy to the core Glofox API, filtering access based on the integrator's configured permissions. If no namespaces are provided in the request body, all locations from the integrator's assigned namespaces are returned.
Optional filters for pagination and namespaces. If omitted or empty, all locations from the integrator's assigned namespaces are returned.
| page | integer >= 1 Page number for pagination. If omitted, the core API default is used. |
| limit | integer >= 1 Number of results per page. If omitted, the core API default is used. |
| namespaces | Array of strings Filter to specific namespaces. If omitted, all namespaces assigned to the integrator are used. |
{- "page": 1,
- "limit": 50,
- "namespaces": [
- "namespace1",
- "namespace2"
]
}{- "object": "list",
- "page": 1,
- "limit": 50,
- "has_more": false,
- "total_count": 4,
- "data": {
- "id": "location-id",
- "name": "Location Name",
- "namespace": "namespace-identifier",
- "address": {
- "city": "Dublin",
- "continent": "Europe",
- "country": "Ireland",
- "country_code": "IE",
- "currency": "EUR",
- "district": "Dublin 2",
- "latitude": 53.339,
- "longitude": -6.26,
- "state": "Dublin",
- "street": "123 Main Street",
- "timezone_id": "Europe/Dublin",
- "timezone_name": "Europe/Dublin",
- "location": {
- "lat": 53.339,
- "lng": -6.26
}
}
}, - "model": "location"
}This call is used to get a single branch by it's id
| id required | string^[a-f\d]{24}$ The branch unique identifier |
{- "_id": "string",
- "name": "string",
- "namespace": "string",
- "address": {
- "street": "string",
- "city": "string",
- "state": "string",
- "country_code": "string",
- "district": "string",
- "latitude": 0.1,
- "longitude": 0.1,
- "currency": "string",
- "timezone_id": "string",
- "postal_code": "string"
}, - "phone": "string",
- "email": "string",
- "facebook": "string",
- "instagram": "string",
- "website": "string",
- "about": "string",
- "corporate_id": "string"
}A user is the entity representing one person. These endpoints allow to get the Users data and user lists. Specially focused on the ones of type Member.
Searches for users (members) across an entire namespace by email address, phone number, or both. The namespace is determined by the branch in the x-glofox-branch-id header. Send at least one of email or phone. If you send both, results must match both filters. More than one user may be returned when the same email or phone exists at multiple locations in the namespace. Phone matching is an exact match against the member's normalized E.164 phone; members without a normalized phone are not returned. Phone searches return users of type MEMBER only (including leads and cancelled members). Staff are excluded from phone searches. Pagination defaults to page 1 and limit 20 when omitted.
| email required | string <email> Filter members by email address. Required when |
| phone | string^\+[1-9]\d{1,14}$ Filter members by phone number in E.164 format (leading plus and country code). Required when |
| page | integer >= 1 Default: 1 The page number to retrieve. |
| limit | integer [ 1 .. 100 ] Default: 20 The number of items to return per page. |
{- "page": 1,
- "limit": 20
}{- "page": 1,
- "limit": 20,
- "has_more": false,
- "total_count": 2,
- "data": [
- {
- "id": "507f1f77bcf86cd799439011",
- "namespace": "my-namespace",
- "phone": "+353871234567",
- "type": "MEMBER",
- "branch_id": [
- "507f1f77bcf86cd799439011"
], - "origin_branch_id": "507f1f77bcf86cd799439011"
}, - {
- "id": "507f1f77bcf86cd799439012",
- "namespace": "my-namespace",
- "phone": "+353871234568",
- "type": "STAFF",
- "branch_id": [
- "507f1f77bcf86cd799439012"
], - "origin_branch_id": "507f1f77bcf86cd799439012"
}
]
}Assigns, updates, or clears the access barcode for a user. The user can be a member or staff member. The location (Branch ID) in the x-glofox-branch-id header determines the namespace, and the user must belong to that namespace. The target user must be active; a deactivated user is reported as not found. An assigned barcode must be 5 to 20 alphanumeric characters (^[a-zA-Z0-9]{5,20}$), matching the dashboard assign-barcode rule so staff can still edit it. Send null or an empty string to clear the barcode; clear is not format-validated.
| user_id required | string^[a-f\d]{24}$ Example: 507f1f77bcf86cd799439011 The unique identifier of the user. |
| access_barcode required | string or null^$|^[a-zA-Z0-9]{5,20}$ A non-empty value assigns the barcode and must be 5 to 20 alphanumeric characters. Send |
{- "access_barcode": "ABC123456"
}{- "access_barcode": "ABC123456"
}This call is used to create a lead in a studio. Creating a lead will often put the new user into a sales funnel. If the user you are creating should not go through this flow set the lead status to member (more details below).
| branchId required | string |
| first_name required | string The users first name. |
| last_name required | string The users last name or surname. |
| phone | string The users phone number. |
| password | string Required only for type MEMBER |
| email required | string The users email address. |
| emergency_contact | string The users emergency contact information. This shows in the Details section of the Member profile. Staff can view this field. |
| lead_status required | string The status must be LEAD, MEMBER or COLD. Cold is used for leads with a low conversion prospect so in the majority of cases LEAD is the correct status. Using MEMBER will skip the sales funnel for the user. You can find more info on the status here |
| type required | string Set as "MEMBER" |
| access_barcode | string If the studio uses access control this field can be used to store an identifier for the access software. |
| birth | string Send as "YYYY-MM-DD" |
| image_url | string The URL of the user's profile picture. This field is always populated with an auto-generated URL, even if no image has been uploaded. If the image exists, it will be accessible through the URL. Otherwise, attempting to access it may result in a 403 (Forbidden) response, which is the existing behavior for missing files in S3. 403 responses should be treated as an indication that the user has not uploaded a profile picture. |
object (UserConsent) User communication consent preferences. Each key is a communication channel. Set | |
object (UserMembership) A membership is the main service a user has. The membership lifecycle has 3 main stages: future, current, and ended. The membership status within those are: • Future: FUTURE status, a membership that has not started yet • Current: ACTIVE, LOCKED, PAUSED: transition between these states is unrestricted • Ended: EXPIRED, CANCELLED | |
object (Leads) | |
| joined_at | string <date-time> Represents the date when the user joined the location. Used primarily for imports, integrations, and member transfers to distinguish joining date (which can be set in the past) from created_at (date in which a document was created in Mongo set as today's date) |
{- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "password": "string",
- "email": "string",
- "emergency_contact": "string",
- "lead_status": "string",
- "type": "string",
- "access_barcode": "string",
- "birth": "string",
- "image_url": "string",
- "consent": {
- "email": {
- "active": true
}, - "sms": {
- "active": false
}, - "push": {
- "active": true
}, - "phone_call": {
- "active": false
}, - "whatsapp": {
- "active": true
}
}, - "membership": {
- "type": "string",
- "start_date": 0,
- "expiry_date": 0,
- "status": "string",
- "membership_name": "string",
- "description": "string",
- "membership_plan_name": "string",
- "plan_code": "string",
- "plan_name": "string",
- "plan_price": 0,
- "plan_upfront_fee": 0,
- "starts_on": "string",
- "user_membership_id": "string",
- "branches": [
- "string"
], - "subscription": {
- "subscription_plan_id": "string",
- "interval": "string",
- "interval_count": 0,
- "price": 0,
- "upfront_fee": 0,
- "stripe_id": "string",
- "payment_method_type_id": "string",
- "auto_renewal": true,
- "paused": true,
- "duration": 0,
- "free_time_unit_count": 0
}
}, - "leads": {
- "contact_source": "string",
- "marketing_source": "string"
}, - "joined_at": "2019-08-24T14:15:22Z"
}{- "_id": "string",
- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "email": "string",
- "type": "string",
- "parent_id": "string",
- "emergency_contact": "string",
- "lead_status": null,
- "access_barcode": "string",
- "image_url": "string",
- "account_email": "string",
- "contact_email": "string",
- "consent": {
- "email": {
- "active": true
}, - "sms": {
- "active": false
}, - "push": {
- "active": true
}, - "phone_call": {
- "active": false
}, - "whatsapp": {
- "active": true
}
}, - "membership": {
- "type": "string",
- "start_date": 0,
- "expiry_date": 0,
- "status": "string",
- "membership_name": "string",
- "description": "string",
- "membership_plan_name": "string",
- "plan_code": "string",
- "plan_name": "string",
- "plan_price": 0,
- "plan_upfront_fee": 0,
- "starts_on": "string",
- "user_membership_id": "string",
- "branches": [
- "string"
], - "subscription": {
- "subscription_plan_id": "string",
- "interval": "string",
- "interval_count": 0,
- "price": 0,
- "upfront_fee": 0,
- "stripe_id": "string",
- "payment_method_type_id": "string",
- "auto_renewal": true,
- "paused": true,
- "duration": 0,
- "free_time_unit_count": 0
}
}, - "leads": {
- "contact_source": "string",
- "marketing_source": "string"
}, - "joined_at": "2019-08-24T14:15:22Z",
- "birth": "string"
}This endpoint allows adding a new interaction for a lead in a specific branch
| branchId required | string^[a-f\d]{24}$ The ID of the branch |
| userId required | string^[a-f\d]{24}$ The ID of the lead |
| user_id required | string^[a-f\d]{24}$ |
| type required | string Enum: "NOTE" "MANUAL_EMAIL" |
| description | string <= 500 characters |
{- "user_id": "string",
- "type": "NOTE",
- "description": "string"
}This endpoint allows retrieving the interaction/notes list for a user in a specific branch
| branchId required | string^[a-f\d]{24}$ The branch unique identifier |
| userId required | string^[a-f\d]{24}$ The user unique identifier |
| page required | integer >= 1 Page number. |
{- "data": [
- {
- "_id": "string",
- "branch_id": "string",
- "user_id": "string",
- "description": "string",
- "type": "NOTE",
- "created": 0
}
], - "success": true,
- "meta": {
- "pagination": {
- "count": 10,
- "perPage": 50,
- "currentPage": 1
}
}
}This call is used to update a lead in a studio. You can change personal details about a user using this call. You cannot change membership or payment details using this call, for information reference the memberships and payments sections.
| userId required | string |
Only send the fields you want to change.
Consent: Set each channel as { active: boolean }. Available channels depend on
regional availability. See the UserConsent schema for the full list.
| first_name required | string The users first name. |
| last_name required | string The users last name or surname. |
| phone | string The users phone number. |
| password | string Required only for type MEMBER |
| email required | string The users email address. |
| emergency_contact | string The users emergency contact information. This shows in the Details section of the Member profile. Staff can view this field. |
| lead_status required | string The status must be LEAD, MEMBER or COLD. Cold is used for leads with a low conversion prospect so in the majority of cases LEAD is the correct status. Using MEMBER will skip the sales funnel for the user. You can find more info on the status here |
| type required | string Set as "MEMBER" |
| access_barcode | string If the studio uses access control this field can be used to store an identifier for the access software. |
| birth | string Send as "YYYY-MM-DD" |
| image_url | string The URL of the user's profile picture. This field is always populated with an auto-generated URL, even if no image has been uploaded. If the image exists, it will be accessible through the URL. Otherwise, attempting to access it may result in a 403 (Forbidden) response, which is the existing behavior for missing files in S3. 403 responses should be treated as an indication that the user has not uploaded a profile picture. |
object User communication consent preferences. Each key is a communication channel. Set | |
object (UserMembership) A membership is the main service a user has. The membership lifecycle has 3 main stages: future, current, and ended. The membership status within those are: • Future: FUTURE status, a membership that has not started yet • Current: ACTIVE, LOCKED, PAUSED: transition between these states is unrestricted • Ended: EXPIRED, CANCELLED | |
object (Leads) | |
| joined_at | string <date-time> Represents the date when the user joined the location. Used primarily for imports, integrations, and member transfers to distinguish joining date (which can be set in the past) from created_at (date in which a document was created in Mongo set as today's date) |
object (UserAddress) User address. All fields are required when an address object is sent. |
{- "first_name": "Jane",
- "last_name": "Doe",
- "phone": "+353871234567",
- "consent": {
- "email": {
- "active": true
}, - "sms": {
- "active": false
}, - "push": {
- "active": true
}, - "phone_call": {
- "active": false
}, - "whatsapp": {
- "active": true
}
}
}{- "_id": "5b1e86b68b78a5012f5ccf94",
- "first_name": "Jane",
- "last_name": "Doe",
- "phone": "+353871234567",
- "type": "member",
- "consent": {
- "email": {
- "active": true
}, - "sms": {
- "active": false
}, - "push": {
- "active": true
}, - "phone_call": {
- "active": false
}, - "whatsapp": {
- "active": true
}
}
}This call is used to get one user.
| userId required | string |
{- "_id": "string",
- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "email": "string",
- "type": "string",
- "parent_id": "string",
- "emergency_contact": "string",
- "lead_status": null,
- "access_barcode": "string",
- "image_url": "string",
- "account_email": "string",
- "contact_email": "string",
- "consent": {
- "email": {
- "active": true
}, - "sms": {
- "active": false
}, - "push": {
- "active": true
}, - "phone_call": {
- "active": false
}, - "whatsapp": {
- "active": true
}
}, - "membership": {
- "type": "string",
- "start_date": 0,
- "expiry_date": 0,
- "status": "string",
- "membership_name": "string",
- "description": "string",
- "membership_plan_name": "string",
- "plan_code": "string",
- "plan_name": "string",
- "plan_price": 0,
- "plan_upfront_fee": 0,
- "starts_on": "string",
- "user_membership_id": "string",
- "branches": [
- "string"
], - "subscription": {
- "subscription_plan_id": "string",
- "interval": "string",
- "interval_count": 0,
- "price": 0,
- "upfront_fee": 0,
- "stripe_id": "string",
- "payment_method_type_id": "string",
- "auto_renewal": true,
- "paused": true,
- "duration": 0,
- "free_time_unit_count": 0
}
}, - "leads": {
- "contact_source": "string",
- "marketing_source": "string"
}, - "joined_at": "2019-08-24T14:15:22Z",
- "birth": "string"
}This call is used to get leads in a studio. It is a POST call as you can send filters in the body. These query parameters are optional, if you send no json body all leads in a studio are returned. The results are returned sorted by created date in descending mode.
| branchId required | string |
object (UserFilters) Filters to filter users. | |
object |
{- "data": [
- {
- "name": "string",
- "use_parent_phone": true,
- "use_parent_email": true,
- "branch_id": "string",
- "active": true,
- "namespace": "string",
- "modified": 0,
- "source": [
- "MEMBER_APP"
], - "created": 0,
- "_id": "string",
- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "email": "string",
- "type": "string",
- "parent_id": "string",
- "emergency_contact": "string",
- "lead_status": null,
- "access_barcode": "string",
- "image_url": "string",
- "account_email": "string",
- "contact_email": "string",
- "consent": {
- "email": {
- "active": true
}, - "sms": {
- "active": false
}, - "push": {
- "active": true
}, - "phone_call": {
- "active": false
}, - "whatsapp": {
- "active": true
}
}, - "membership": {
- "type": "string",
- "start_date": 0,
- "expiry_date": 0,
- "status": "string",
- "membership_name": "string",
- "description": "string",
- "membership_plan_name": "string",
- "plan_code": "string",
- "plan_name": "string",
- "plan_price": 0,
- "plan_upfront_fee": 0,
- "starts_on": "string",
- "user_membership_id": "string",
- "branches": [
- "string"
], - "subscription": {
- "subscription_plan_id": "string",
- "interval": "string",
- "interval_count": 0,
- "price": 0,
- "upfront_fee": 0,
- "stripe_id": "string",
- "payment_method_type_id": "string",
- "auto_renewal": true,
- "paused": true,
- "duration": 0,
- "free_time_unit_count": 0
}
}, - "leads": {
- "contact_source": "string",
- "marketing_source": "string"
}, - "joined_at": "2019-08-24T14:15:22Z",
- "birth": 0
}
], - "success": true
}This call is used to get clients in a studio
| page | integer The page which should be returned |
| limit | integer The limit of the data within the page |
| active | string Enum: true false "any" Filters members based on their active status:
|
| utc_modified_start_date | integer Filters members using a UTC timestamp based on their modified field. Includes users where modified >= {value}. |
| utc_modified_end_date | integer Filters members using a UTC timestamp based on their modified field. Includes users where modified <= {value}. |
| home_only | string Enum: true false When |
{- "object": "list",
- "page": 1,
- "limit": 2,
- "has_more": true,
- "total_count": 137,
- "data": [
- {
- "_id": "62d9e7d8e7b7367",
- "first_name": "Canada",
- "last_name": "Address",
- "phone": "848484",
- "access_barcode": null,
- "type": "member",
- "membership": {
- "type": "payg",
- "start_date": 1658444400,
- "user_membership_id": "62d9e7d9cfe49223",
- "status": "ACTIVE"
}, - "branch_id": "6213afee7b0e3574",
- "namespace": "namespace",
- "active": true,
- "origin_branch_id": "6213afe3e7b0e3574",
- "name": "Canada Address",
- "role": "member"
}, - {
- "_id": "62d9e7365c127f6d46",
- "first_name": "Skywalktwo",
- "last_name": "Address",
- "phone": "848484",
- "access_barcode": null,
- "type": "member",
- "membership": {
- "type": "payg",
- "start_date": 1658444400,
- "user_membership_id": "62d9695e264e84",
- "status": "ACTIVE"
}, - "branch_id": "6213aff3e7b0e3574",
- "namespace": "namespace",
- "active": true,
- "origin_branch_id": "6213afed9eade3574",
- "name": "Skywalktwo Address",
- "role": "member",
- "use_parent_email": true,
- "parent_id": "67178691e9494a88c91a405e",
- "use_parent_phone": true,
- "birth": "1998-05-10",
- "consent": {
- "email": {
- "active": false,
- "modified_at": "2023-11-06T17:57:39.696+00:00",
- "modified_by_user_id": "guest",
- "modified_from_ip_address": [
- "54.209.115.53"
], - "message": "Yes, I consent to receive marketing emails about upcoming events and/or promotions."
}, - "sms": {
- "active": false,
- "modified_at": "2023-11-06T17:57:39.697+00:00",
- "modified_by_user_id": "guest",
- "modified_from_ip_address": [
- "54.209.115.53"
], - "message": "Yes, I consent to receive SMS texts to the mobile number that I provided."
}, - "push": {
- "active": true,
- "modified_at": "2023-11-06T17:57:40.411+00:00",
- "modified_by_user_id": "guest",
- "modified_from_ip_address": [
- "54.209.115.53"
]
}, - "phone_call": {
- "active": false,
- "modified_at": "2026-05-18T10:00:00.000+00:00",
- "modified_by_user_id": "guest",
- "modified_from_ip_address": [
- "54.209.115.53"
], - "message": "Yes, I consent to receive marketing phone calls from the studio."
}, - "whatsapp": {
- "active": false,
- "modified_at": "2026-05-18T10:00:00.000+00:00",
- "modified_by_user_id": "guest",
- "modified_from_ip_address": [
- "54.209.115.53"
], - "message": "Yes, I consent to receive WhatsApp messages about upcoming events and/or promotions."
}
}, - "created": 1723013931,
- "emergency_contact": "5656565656",
- "lead_status": "LEAD",
- "modified": 1723013930,
- "source": "DASHBOARD"
}
]
}Emails in Glofox are unique for each studio so you might need to see if an email exists in a studio. This search checks if a full email address exists. It can not be used for searching for part of an email.
| branchId required | string |
| filters[email] required | string |
| page | integer Default: 1 The page number to retrieve. |
| limit | integer Default: 50 The number of results per page. |
{- "_id": "string",
- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "email": "string",
- "type": "string",
- "parent_id": "string",
- "emergency_contact": "string",
- "lead_status": null,
- "access_barcode": "string",
- "image_url": "string",
- "account_email": "string",
- "contact_email": "string",
- "consent": {
- "email": {
- "active": true
}, - "sms": {
- "active": false
}, - "push": {
- "active": true
}, - "phone_call": {
- "active": false
}, - "whatsapp": {
- "active": true
}
}, - "membership": {
- "type": "string",
- "start_date": 0,
- "expiry_date": 0,
- "status": "string",
- "membership_name": "string",
- "description": "string",
- "membership_plan_name": "string",
- "plan_code": "string",
- "plan_name": "string",
- "plan_price": 0,
- "plan_upfront_fee": 0,
- "starts_on": "string",
- "user_membership_id": "string",
- "branches": [
- "string"
], - "subscription": {
- "subscription_plan_id": "string",
- "interval": "string",
- "interval_count": 0,
- "price": 0,
- "upfront_fee": 0,
- "stripe_id": "string",
- "payment_method_type_id": "string",
- "auto_renewal": true,
- "paused": true,
- "duration": 0,
- "free_time_unit_count": 0
}
}, - "leads": {
- "contact_source": "string",
- "marketing_source": "string"
}, - "joined_at": "2019-08-24T14:15:22Z",
- "birth": "string"
}This will send a link to the user from no-reply@glofox.com. This link contains a unique code they need to reset their email.
| branch_id | string The branch_id of the studio. |
string The users email address. |
{- "branch_id": "string",
- "email": "string"
}{- "success": true,
- "message": "string"
}This call is used to get all staff members.
| type | string Enum: "ADMIN" "MEMBER" "RECEPTION" "TRAINER" Example: type=TRAINER Type of staff members. |
| active | string Enum: true false "any" Example: active=false Filters staff users based on their active status:
|
{- "object": "list",
- "page": 1,
- "limit": 50,
- "has_more": false,
- "total_count": 0,
- "data": [
- {
- "_id": "string",
- "branch_id": "string",
- "namespace": "string",
- "active": true,
- "bookable": true,
- "modified": 0,
- "type": "admin",
- "first_name": "string",
- "last_name": "string",
- "description": "string",
- "name": "string",
- "image_url": "string",
- "access_barcode": "string"
}
]
}This call is used to get one staff member.
| staffId required | string^[a-f\d]{24}$ Unique identifier for the staff member. |
{- "_id": "string",
- "branch_id": "string",
- "namespace": "string",
- "active": true,
- "bookable": true,
- "modified": 0,
- "type": "admin",
- "first_name": "string",
- "last_name": "string",
- "description": "string",
- "name": "string",
- "image_url": "string",
- "access_barcode": "string"
}This endpoint is used to register a user account.
Consent: Set each channel as { active: boolean }. Available channels depend on
regional availability. See the UserConsent schema for the full list.
| first_name required | string The first name of the user. |
| last_name required | string The last name of the user. |
| gender | string Enum: "M" "F" "O" "P" The gender of the user. |
| use_parent_phone | boolean Boolean flag to indicate whether to use the parent's phone number for the child account. If it's present and false then the property phone is required.Mandatory when registering a child. |
| phone | string The phone number of the user. |
string The email address of the the user. | |
| use_parent_email | boolean Boolean Flag whether to use the parent's email for the user account. If use_parent_email is true then skip the property email on the payload. If use_parent_email exists and is false then the property email is required. Mandatory when registering a child. |
| birth required | string The user's birth date as a string (YYYY-MM-DD) |
| emergency_contact | string The emergency contact for the user. |
| parent_id | string Mandatory when registering child's account.Unique identifier for the parent's account. |
| no_password | integer When set to 1, the account is created without a password. |
| avatar | string Base64-encoded representation of the image |
| avatarImg | string Data URL containing a base64-encoded WebP format image. |
object (UserConsent) User communication consent preferences. Each key is a communication channel. Set | |
object (Leads) | |
| joined_at | string <date-time> Represents the date when the user joined the location. Used primarily for imports, integrations, and member transfers to distinguish joining date (which can be set in the past) from created_at (date in which a document was created in Mongo set as today's date) |
{- "first_name": "Jane",
- "last_name": "Doe",
- "phone": "+353871234567",
- "birth": "1990-01-15",
- "consent": {
- "email": {
- "active": true
}, - "sms": {
- "active": false
}, - "push": {
- "active": true
}, - "phone_call": {
- "active": false
}, - "whatsapp": {
- "active": true
}
}
}{- "success": true,
- "user": {
- "_id": "5b1e86b68b78a5012f5ccf94",
- "first_name": "Jane",
- "last_name": "Doe",
- "phone": "+353871234567",
- "birth": "1990-01-15",
- "type": "member",
- "consent": {
- "email": {
- "active": true
}, - "sms": {
- "active": false
}, - "push": {
- "active": true
}, - "phone_call": {
- "active": false
}, - "whatsapp": {
- "active": true
}
}
}
}This call returns all linked accounts (child accounts) of a given user (parent account).
| parentId required | string^[a-f\d]{24}$ The parent account id |
{- "data": [
- {
- "_id": "string",
- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "email": "string",
- "type": "string",
- "parent_id": "string"
}
], - "success": true,
- "meta": {
- "pagination": {
- "count": 10,
- "perPage": 50,
- "currentPage": 1
}
}
}This call uploads a profile image for a given user.
| userId required | string^[a-f\d]{24}$ The user id |
| Image required | string <binary> |
{- "success": true,
}Lead sourcing is a key pillar of CRM, providing precise data to optimize marketing spend and target communications more effectively. These endpoints allow access to detailed information about lead sources, including their creation, retrieval, and management.
This call returns the unpaginated list of available marketing sources for a location.
| branchId required | string^[a-f\d]{24}$ The location id |
[- {
- "_id": "string",
- "name": "string",
- "code": "string",
- "active": true,
- "default": true,
- "corporate_id": "string",
- "branch_id": "string"
}
]The /memberships endpoint are the plans groups, what the user can purchase. The private ones can't be purchased by the member itself (usually used for staff memberships, special promotions, or similar).
A membership is the main service that a user can have. A user can have only one current membership at a given single time. It can be for a single period (1 month) or in a subscription way (1 month for 12 months, or 1 month renewed till manually finished). The membership usually means they have unrestricted access to the location. The membership can be unlimited (type: time), so it allows any number of bookings, or restricted (time: time_classes) meaning it has door access for 1 month, but can book up to 10 times in that period. A membership can be a roaming membership, meaning it grants access to more than 1 location. They can as well: • Purchase particular bookings • Purchase an add-on. An add-on is similar to a membership, but it's over an existing membership. It has to have the same billing frequency. For details on membership lifecycle check the
This call is used to get the memberships in a studio.
| private | string Enum: "true" "false" "any" Filters memberships based on their privacy status:
|
{- "object": "list",
- "page": 1,
- "limit": 50,
- "has_more": false,
- "total_count": 0,
- "data": [
- {
- "_id": "string",
- "branch_id": "string",
- "namespace": "string",
- "active": true,
- "name": "string",
- "description": "string",
- "buy_just_once": true,
- "plans": [
- {
- "code": 0,
- "type": "string",
- "duration_time_unit": "string",
- "duration_time_unit_count": 0,
- "starts_on": "string",
- "price": 0,
- "upfront_fee": 0
}
]
}
]
}This call is used to get the memberships in a studio.
| membershipId required | string^[a-f\d]{24}$ |
{- "_id": "string",
- "branch_id": "string",
- "namespace": "string",
- "active": true,
- "name": "string",
- "description": "string",
- "buy_just_once": true,
- "plans": [
- {
- "code": 0,
- "type": "string",
- "duration_time_unit": "string",
- "duration_time_unit_count": 0,
- "starts_on": "string",
- "price": 0,
- "upfront_fee": 0
}
]
}This call is used to purchase a membership for a user. If the user has an active membership the new members will be set to start the date after the active membership expires.
| branchId required | string |
| userId required | string |
| membershipId required | string |
| planCode required | string |
| start_date required | number The date the membership starts in the location's local time in epoch format. |
| promo_code | string The public facing promo code. |
| payment_method | string Specifies the payment method to be used. Must be one of the accepted payment methods defined by the membership configuration. If not provided, the member's default payment method will be used. The value must be provided in lowercase. |
| is_renewal_terms_and_conditions_accepted | boolean Indicates whether the user has opted in to be charged in the future per the terms of the membership they are purchasing. |
{- "start_date": 1725519600,
- "promo_code": "PROMO-123",
- "payment_method": "card",
- "is_renewal_terms_and_conditions_accepted": true
}{- "success": true,
- "message": "string",
- "message_code": "string",
- "status": "PENDING-INTENT",
- "invoice_id": "f4c4edb8-11e0-4b33-bcc1-482dc59ebb32"
}This call is used to forward to payments service the payment method we will use for a flexible payment membership
| branchId required | string |
| chargeId required | string |
| payment_method_type | string The payment method type we want to use to create a charge |
{- "payment_method_type": "string"
}{- "success": true,
- "message": "string",
- "message_code": "string",
- "status": "PENDING-INTENT",
- "invoice_id": "f4c4edb8-11e0-4b33-bcc1-482dc59ebb32"
}This method allows you to cancel an open-ended recurring membership on a specific date.
| userMembershipId required | string The user membership ID we want to cancel |
| x-glofox-impersonated-member-id required | string The ID of the member whose membership is being cancelled. |
| when required | string Enum: "ON_DATE" "NOW" "END_OF_CYCLE" A string indicating when the membership cancellation should take effect. Possible values:
|
| local_date | string When ON_DATE cancellation type is selected. Local date in YYYY-MM-DD format to indicate the date for the cancellation |
| reason required | string Enum: "MEMBERSHIP_CANCELLATION_PRICE" "MEMBERSHIP_CANCELLATION_MOVED" "MEMBERSHIP_CANCELLATION_MOVED" "MEMBERSHIP_CANCELLATION_NO_USAGE" "MEMBERSHIP_CANCELLATION_CUSTOMER_SERVICE" "MEMBERSHIP_CANCELLATION_EVENT_SCHEDULE" "MEMBERSHIP_CANCELLATION_CHANGE_MEMBERSHIP" Cancellation reason, can be an empty string or any of the valid values. |
{- "when": "ON_DATE",
- "local_date": "2026-05-25",
- "reason": "MEMBERSHIP_CANCELLATION_PRICE"
}{- "local_planned_end_date": "2026-05-25"
}A credit pack allows to book for different events. These can be purchased independently or coming from a restricted membership.
Retrieves all credit packs for a user. Results are returned in a paginated list.
When has_more is true, request the next page with the page and limit query parameters.
| user_id required | string The id of the user whose credit packs should be returned. |
| page | integer Default: 1 The page number to retrieve. |
| limit | integer [ 0 .. 100 ] Default: 50 The number of credit packs per page. |
{- "object": "list",
- "page": 1,
- "limit": 50,
- "has_more": false,
- "total_count": 1,
- "data": [
- {
- "_id": "000000000000000000000001",
- "branch_id": "000000000000000000000002",
- "namespace": "your_namespace",
- "active": true,
- "model": "programs",
- "category_id": null,
- "num_sessions": 5,
- "model_ids": null,
- "start_date": 1704067200,
- "user_id": "000000000000000000000003",
- "end_date": 1706745600,
- "modified": 1704067200,
- "created": 1704067200,
- "bookings": [ ],
- "type": "usercredit",
- "available": 5
}
], - "total_value": 5
}This allows management of access to the location, the access can be seen on locations and users, and there are several reports over them. From Glofox perspective, there are 2 things that grants access: an active membership, or a booking within the next hour If an access is created and there is a booking within the hour, attendance to the booking will be marked as well.
Door access is something that's usually implemented on the partner side so it can be implemented with stricter rules if needed
To get the members with door access, use the endpoints in the Users section.
This endpoint is used to store accesses.
It can also be used to check if a user has a valid membership. The response includes a boolean field called valid_on_entry. If this is false access should be denied.
| user_id required | string^[a-f\d]{24}$ Unique identifier for the user. |
| namespace | string The studio's namespace. By default it is taken from the current user token. |
| branch_id | string^[a-f\d]{24}$ The branch_id of the studio. By default it is taken from the current user token. |
| entry_at | integer UTC Timestamp when the user entered the studio. The default value is the current time. |
| status | string Enum: "GRANTED" "FAILED" The status of the access. By default is evaluated based on the user's membership. If the user has valid active membership or upcoming bookings within the nearest hour, then the access is granted. |
| door | string The name of the door that was accessed |
| door_type | string Enum: "external" "internal" The type of door that was accessed (if absent defaults to external) |
{- "user_id": "string",
- "namespace": "string",
- "branch_id": "string",
- "entry_at": 0,
- "status": "GRANTED",
- "door": "string",
- "door_type": "external"
}{- "success": true,
- "access": {
- "_id": "string",
- "user_id": "string",
- "branch_id": "string",
- "namespace": "string",
- "entry_at": 0,
- "status": "string",
- "valid_on_entry": true,
- "door": "string",
- "door_type": "external",
- "created": 0,
- "modified": 0
}
}A program has a set of schedules, those schedules are then instantiated as events for particular dates. In general, any partner works only with events as the relevant data from programs is replicated in that entity. Eventually, using the program_id can be useful to link events that are different instances of the same program.
Deprecated. Use GET /2.0/branches/{branchId}/events/{eventId} instead. This path remains supported; requests may be handled via the branch-scoped implementation.
Returns Event object (Class|Appointment|Facility) by its unique identifier.
| id required | string^[a-f\d]{24}$ The event's unique identifier. |
{- "_id": "string",
- "namespace": "string",
- "branch_id": "string",
- "type": "Class",
- "active": true,
- "name": "string",
- "description": "string",
- "time_start": 0,
- "duration": 0,
- "is_online": true,
- "image_url": "string",
- "size": 0,
- "private": true,
- "booked": 0,
- "waiting": 0,
- "modified": 0,
- "program_id": "string",
- "level": "string",
- "facility": "string",
- "trainers": [
- "string"
], - "status": "string",
- "open_booking_time": 0,
- "close_booking_time": 0
}Deprecated. Use GET /2.0/branches/{branchId}/events with the same query parameters. This path remains supported; requests may be handled via the branch-scoped implementation.
This call is used to retrieve classes in a timeframe. See the Bookings section below for information on booking a user into the classes
If the response contains model_id as null, event._id field as value for model_id in subsequent calls and the model should be events If the response contains a model_id not null, it should be used in subsequent calls.
| start required | string Classes with a start time after this time will be retrieved. Send as UTC Timestamp in seconds. Default value is specified as current Timestamp. |
| end required | string Classes with a start time before this time will be retrieved. Send as UTC Timestamp in seconds. Default value is specified as +1 day to the start value. |
| sort_by | string Default: "-created" Enum: "created" "-created" "time_start" "-time_start" "time_finish" "-time_finish" Sorting order of the returned data. When a "-" is prefixed to a parameter, it will be sorted in descending mode by that field. Note for courses, sorting by time_start and time_finish is not available, as courses have a lengthy duration. |
| limit | integer [ 0 .. 100 ] Default: 50 Count of the limited data returned within 1 page. |
| page | integer Default: 1 Page number. In case of the large amount of data exceeding the default limit, the data have to be requested by pages. |
| active | boolean Default: true Whether active (non deleted) events have to be returned. If active=any is sent, then both active and non active events are returned. |
| private | boolean Default: false Whether private or public events have to be returned. Private events are not available for member side bookings, they could be booked by a Staff only on behalf of a Member. Public events are returned by default. If private=any is sent, then both public and private events are returned. |
| filter | string Default: "event" Enum: "event" "timeslot" "course" The filter by type of the event. To retrieve classes filter=event has to be passed. To retrieve courses filter=course has to be passed. To retrieve appointments and facilities filter=timeslot has to be passed. To retrieve all types filter=event,timeslot,course has to be passed. We recommend to fetch each type of the event in a separate request to narrow the amount of loaded events. |
| programs | string Filer events by the list of program_ids divided by comma.
For example you would like to fetch events associated with the concrete program/programs.
In that case you have to pass programs= |
| facilities | string Filer events by the list of facility_ids divided by comma.
For example you would like to fetch events associated with the concrete facility/facilities.
In that case you have to pass facilities= |
| trainers | string Filer events by the list of trainer_ids divided by comma.
For example you would like to fetch events associated with the concrete trainer/trainers.
In that case you have to pass trainers= |
| model | string Enum: "appointments" "facilities" The model to specify the timeslot subtype To retrieve appointments only parameters filter=timeslot&model=appointments have to be passed. To retrieve facilities only parameters filter=timeslot&model=facilities have to be passed. |
| model_id | string Specifies concrete model_id that need to be fetched.
For example you would like to fetch only appointments slots for the concrete appointment.
In that case you have to pass model_id= |
| utc_modified_start_date | integer Filters events using a UTC timestamp based on their modified time. Where modified >= {value} |
| utc_modified_end_date | integer Filters events using a UTC timestamp based on their modified time. Where modified <= {value} |
{- "object": "list",
- "page": 1,
- "limit": 50,
- "has_more": false,
- "total_count": 0,
- "data": [
- {
- "_id": "string",
- "namespace": "string",
- "branch_id": "string",
- "type": "event",
- "active": true,
- "name": "string",
- "description": "string",
- "time_start": 0,
- "duration": 0,
- "is_online": true,
- "image_url": "string",
- "size": 0,
- "private": true,
- "booked": 0,
- "waiting": 0,
- "modified": 0,
- "program_id": "string",
- "level": "string",
- "facility": "string",
- "trainers": [
- "string"
], - "status": "string",
- "open_booking_time": 0,
- "close_booking_time": 0
}
]
}Retrieves classes, courses, and time slots for a branch within a timeframe. This is the supported replacement for deprecated GET /2.0/events.
This call is used to retrieve classes in a timeframe. See the Bookings section below for information on booking a user into the classes
If the response contains model_id as null, event._id field as value for model_id in subsequent calls and the model should be events If the response contains a model_id not null, it should be used in subsequent calls.
| branchId required | string The branch identifier. |
| start required | string Classes with a start time after this time will be retrieved. Send as UTC Timestamp in seconds. Default value is specified as current Timestamp. |
| end required | string Classes with a start time before this time will be retrieved. Send as UTC Timestamp in seconds. Default value is specified as +1 day to the start value. |
| sort_by | string Default: "-created" Enum: "created" "-created" "time_start" "-time_start" "time_finish" "-time_finish" Sorting order of the returned data. When a "-" is prefixed to a parameter, it will be sorted in descending mode by that field. Note for courses, sorting by time_start and time_finish is not available, as courses have a lengthy duration. |
| limit | integer [ 0 .. 100 ] Default: 50 Count of the limited data returned within 1 page. |
| page | integer Default: 1 Page number. In case of the large amount of data exceeding the default limit, the data have to be requested by pages. |
| active | boolean Default: true Whether active (non deleted) events have to be returned. If active=any is sent, then both active and non active events are returned. |
| private | boolean Default: false Whether private or public events have to be returned. Private events are not available for member side bookings, they could be booked by a Staff only on behalf of a Member. Public events are returned by default. If private=any is sent, then both public and private events are returned. |
| filter | string Default: "event" Enum: "event" "timeslot" "course" The filter by type of the event. To retrieve classes filter=event has to be passed. To retrieve courses filter=course has to be passed. To retrieve appointments and facilities filter=timeslot has to be passed. To retrieve all types filter=event,timeslot,course has to be passed. We recommend to fetch each type of the event in a separate request to narrow the amount of loaded events. |
| programs | string Filer events by the list of program_ids divided by comma.
For example you would like to fetch events associated with the concrete program/programs.
In that case you have to pass programs= |
| facilities | string Filer events by the list of facility_ids divided by comma.
For example you would like to fetch events associated with the concrete facility/facilities.
In that case you have to pass facilities= |
| trainers | string Filer events by the list of trainer_ids divided by comma.
For example you would like to fetch events associated with the concrete trainer/trainers.
In that case you have to pass trainers= |
| model | string Enum: "appointments" "facilities" The model to specify the timeslot subtype To retrieve appointments only parameters filter=timeslot&model=appointments have to be passed. To retrieve facilities only parameters filter=timeslot&model=facilities have to be passed. |
| model_id | string Specifies concrete model_id that need to be fetched.
For example you would like to fetch only appointments slots for the concrete appointment.
In that case you have to pass model_id= |
| utc_modified_start_date | integer Filters events using a UTC timestamp based on their modified time. Where modified >= {value} |
| utc_modified_end_date | integer Filters events using a UTC timestamp based on their modified time. Where modified <= {value} |
{- "object": "list",
- "page": 1,
- "limit": 50,
- "has_more": false,
- "total_count": 0,
- "data": [
- {
- "_id": "string",
- "namespace": "string",
- "branch_id": "string",
- "type": "event",
- "active": true,
- "name": "string",
- "description": "string",
- "time_start": 0,
- "duration": 0,
- "is_online": true,
- "image_url": "string",
- "size": 0,
- "private": true,
- "booked": 0,
- "waiting": 0,
- "modified": 0,
- "program_id": "string",
- "level": "string",
- "facility": "string",
- "trainers": [
- "string"
], - "status": "string",
- "open_booking_time": 0,
- "close_booking_time": 0
}
]
}Returns an event (class, course, appointment, or facility time slot) for the given branch and event identifier. Prefer this endpoint over deprecated GET /2.0/events/{id}.
| branchId required | string The branch identifier. |
| eventId required | string^[a-f\d]{24}$ The event's unique identifier. |
{- "_id": "string",
- "namespace": "string",
- "branch_id": "string",
- "type": "Class",
- "active": true,
- "name": "string",
- "description": "string",
- "time_start": 0,
- "duration": 0,
- "is_online": true,
- "image_url": "string",
- "size": 0,
- "private": true,
- "booked": 0,
- "waiting": 0,
- "modified": 0,
- "program_id": "string",
- "level": "string",
- "facility": "string",
- "trainers": [
- "string"
], - "status": "string",
- "open_booking_time": 0,
- "close_booking_time": 0
}A Booking is the result of a particular member booking in an event. After the booking has passed it will have the attendance for it inside.
Use this call to book a user into a class. If a class is full the user will be added to a wait-list if there are spaces remaining on the waitlist. If the booking fails it returns and an error code and reason for failure. You can check a list of possible errors in 'Responses' (use the 'Examples' drop-down list).
| branch_id | string The ID of the branch the booking ID made for. Required only for Admin side booking. |
| staff_id | string In case of booking an appointment, this field should be passed. |
| user_id required | string The ID of the user the booking is being made for. |
| model required | string Enum: "event" "timeslot" "course" Model specifies the type of the booking. For classes model=event, for courses model=course, for appointments and facilities model=timeslot. |
| model_id required | string The ID of the event the booking is being made for. |
| create_slot | string This parameter has to be set as appointment when attempt to book an available appointment. |
| payment_method | string Enum: "cash" "credit_card" "bank_transfer" "wallet" "pay_gym" The payment method used to pay booking. Required only for Admin side booking. pay_gym payment method is used for the late payments. The payment will be charged later by the Studio's staff. Integrators should use credit_card as the only valid payment method. |
| price | number <float> When the request is done by a staff, the price to be charged could be passed. If price is not provided, the credits and membership will be considered |
| schedule_id | integer The ID of the session (schedule) for course booking. Required only for Admin side course booking. This could be found in |
| charge | boolean Default: true This parameter is specifically for integrators. When it is set to true, the system will first try to charge the user using their available credits. If the user does not have enough credits, then the system will attempt to charge with the provided payment method. Only credit card is accepted, other payment methods will be rejected. If the payment method is not set in the payload, the system will default to credit card. If the user credits and the credit card attempts both fail, the booking will not be processed and an error will be returned. When set to false, the system will not attempt to charge the user thus making the booking free of charge. Charge will default to true if it is not included in the payload. |
{- "branch_id": "string",
- "staff_id": "string",
- "user_id": "string",
- "model": "event",
- "model_id": "string",
- "create_slot": "string",
- "payment_method": "cash",
- "price": 0.1,
- "schedule_id": 0,
- "charge": true
}{- "success": true,
- "Booking": {
- "namespace": "namespace",
- "branch_id": "branch_id",
- "user_id": "user_id",
- "user_name": "user_name",
- "program_id": "program_id",
- "schedule_code": "schedule_code",
- "event_id": "event_id",
- "event_name": "event_name",
- "model_name": "Sweat1000",
- "membership_name": null,
- "plan_name": null,
- "plan_code": null,
- "status": "BOOKED",
- "confirmed": true,
- "type": "events",
- "time_start": 1723266000,
- "guest_bookings": 0,
- "timezone": "Europe/Dublin",
- "modified": 1723013930,
- "created": 1723013930,
- "created_user_id": "created_user_id",
- "_id": "_id",
- "duration": 60,
- "image_url": "image_url"
}
}This call returns the bookings for one user. The results are paginated with the limit set to 50 bookings.
| branchId required | string Unique branch ID the user belongs to. |
| user_id required | string Unique user ID. |
| sort_by | string Default: "-created" Enum: "created" "-created" "time_start" "-time_start" "time_finish" "-time_finish" Sorting order of the returned data. If put "-" before parameter it will be sorted in descending mode. |
| limit | integer [ 0 .. 100 ] Default: 50 Count of the limited data returned within 1 page. |
| page | integer Default: 1 Page number. In case of the large amount of data exceeding the default limit, the data have to be requested by pages. |
| time_start | integer Start time of bookings in UTC Timestamp in seconds format. Default value is specified as current Timestamp. |
| time_end | string End time of bookings in UTC Timestamp in seconds format. Default value is specified as +1 day to the start value. |
| exclude_cancelled | boolean Default: false Should cancelled bookings be excluded from the result. |
| event_id | string The id of the event you would like to get bookings for. event_id specifies a concrete class slot on the calendar. |
| program_id | string The id of the program you would like to get bookings for. The program_id is the id of the class definition. If you provide it, you will get all bookings for the concrete program. |
| model | string Enum: "appointments" "facilities" "courses" The type of the model you need to get bookings for. For instance, you need to fetch all bookings for the appointments only, then pass model=appointments. |
| model_id | string The id of the booking model. If you need to fetch bookings fof the appointment, you have have to provide it's id. The same is for the facility and course. |
| time_slot_id | string The id of the time slot you need to get booking for. time_slot_id works only for appointments and facilities bookings.
Let's say, you need to get the booking for the appointment slot, then you have to send parameters in the request:
model=appointments&time_slot_id= |
{- "object": "list",
- "page": 1,
- "limit": 50,
- "has_more": false,
- "total_count": 0,
- "data": [
- {
- "_id": "string",
- "branch_id": "string",
- "namespace": "string",
- "user_id": "string",
- "user_name": "string",
- "status": "BOOKED",
- "attended": true,
- "time_start": 0,
- "duration": 0,
- "paid": true,
- "guest_bookings": 0,
- "description": "string",
- "image_url": "string",
- "model": "event",
- "model_id": "string",
- "model_name": "string",
- "event_name": "string",
- "created": 0,
- "modified": 0,
- "is_free": true
}
]
}This call cancels a booking. In some cases, a booking cannot be cancelled due to the rules set up in the studio. If this happens you will receive a message in the response detailing why.
| bookingId required | string |
| userId required | string |
{- "data": "string"
}This call returns a list of bookings in a studio.
| branchId required | string |
| limit | integer [ 0 .. 100 ] Default: 50 Count of the limited data returned within 1 page. |
| page | integer Default: 1 Page number. In case of the large amount of data exceeding the default limit, the data have to be requested by pages. |
| start_date | integer Filters bookings using a UTC timestamp based on their created time. Where created >= {value}. |
| end_date | integer Filters bookings using a UTC timestamp based on their created time. Where created <= {value} |
| modified_start_date | integer Filters bookings using a UTC timestamp based on their modified time. Where modified >= {value} |
| modified_end_date | integer Filters bookings using a UTC timestamp based on their modified time. Where modified <= {value} |
| time_start_start_date | integer Filters bookings using a local timestamp based on their time_start. Where time_start >= {value} |
| time_start_end_date | integer Filters bookings using a local timestamp based on their time_start. Where time_start <= {value} |
| time_finish_start_date | integer Filters bookings using a local timestamp based on their time_finish. Where time_finish >= {value} |
| time_finish_end_date | integer Filters bookings using a local timestamp based on their time_finish. Where time_finish <= {value} |
| status | string Enum: "BOOKED" "WAITING" "CANCELED" "RESERVED" "FAILED" Filters bookings based on their status |
| event_type | string Enum: "events" "courses" "facilities" "users" "appointments" Filters bookings based on their underline event type |
| event_id | string Filters bookings based on their event id |
| course_id | string Filters bookings based on their course id |
{- "success": true,
- "meta": {
- "totalCount": 0,
- "page": 1,
- "limit": 50
}, - "data": [
- {
- "_id": "string",
- "branch_id": "string",
- "namespace": "string",
- "user_id": "string",
- "user_name": "string",
- "status": "BOOKED",
- "type": "events",
- "program_id": "string",
- "event_id": "string",
- "event_name": "string",
- "time_slot_id": "string",
- "model": "facilities",
- "model_id": "string",
- "model_name": "string",
- "course_id": "string",
- "session_id": "string",
- "guest_bookings": 0,
- "attended": true,
- "paid": true,
- "is_from_waiting_list": true,
- "is_late_cancellation": true,
- "payment_method": "string",
- "time_start": "string",
- "time_finish": "string",
- "is_first": true,
- "canceled_at": "string",
- "modified": "string",
- "created": "string",
- "batch_id": "string"
}
]
}Use this call to book a user into a class, appointment, course or facility. In case of booking a full class, and the join_waiting_list parameter is passed as true, the user will be added to the waiting list. If the booking fails it returns a 400 status code with details of the failure.
| branchId required | string |
| x-glofox-impersonated-member-id | string The ID of a member who is being impersonated. Impersonated requests are allowed for integrators only and are valuable when an integrator needs to make a booking on behalf of a member. In such cases, the system abides by all booking settings and rejects requests if a member has exceeded set booking limitations. |
| model required | string Value: "event" The type of the booked event. |
| model_id required | string The ID of the class. |
| guest_bookings | integer Default: 0 The number of guests the user is booking for. |
| join_waiting_list | boolean Default: false Whether the user should be added to the waiting list. Send this parameter to |
| charge | boolean Default: true Whether the booking payment should be delayed. |
{- "model": "event",
- "model_id": "string",
- "guest_bookings": 0,
- "join_waiting_list": false,
- "charge": true
}{- "OK - Successful booking": {
- "value": {
- "success": true,
- "Booking": {
- "namespace": "namespace",
- "branch_id": "branch_id",
- "user_id": "user_id",
- "user_name": "user_name",
- "program_id": "program_id",
- "schedule_code": "schedule_code",
- "event_id": "event_id",
- "event_name": "event_name",
- "model_name": "Sweat1000",
- "membership_name": null,
- "plan_name": null,
- "plan_code": null,
- "status": "BOOKED",
- "confirmed": true,
- "type": "events",
- "time_start": 1723266000,
- "guest_bookings": 0,
- "timezone": "Europe/Dublin",
- "modified": 1723013930,
- "created": 1723013930,
- "created_user_id": "created_user_id",
- "_id": "_id",
- "duration": 60,
- "image_url": "image_url"
}
}
}
}This call cancels a booking.
| branchId required | string |
| bookingId required | string |
| x-glofox-impersonated-member-id | string The ID of a member who is being impersonated. Impersonated requests are allowed for integrators only and are valuable when an integrator needs to make a booking on behalf of a member. In such cases, the system abides by all booking settings and rejects requests if a member has exceeded set booking limitations. |
{- "success": false,
- "message": "string",
- "message_code": "string",
- "message_data": [
- "string"
], - "errors": [
- "string"
]
}This call marks a booking (or bookings) as attended.
| model | string Value: "bookings" The model specifies the type of the attendance need to be saved. You have to send model=bookings to save bookings attendance. |
| model_ids | Array of strings |
{- "model": "bookings",
- "model_ids": [
- "string"
]
}{- "success": true,
- "model_ids": [
- "string"
]
}Use this call to find out if a class is available for a user and the price they will pay. Classes can be restricted to certain memberships and different memberships have different prices to pay for a booking.
| branchId required | string |
| eventId required | string |
| for required | string The user id who is intending to book the class |
| guestBookings required | integer A user can book more than once space. This is used if they want to bring a friend to the class. Each extra booking multiplies the cost. |
{- "_id": "string",
- "branch_id": "string",
- "namespace": "string",
- "user_id": "string",
- "user_name": "string",
- "status": "BOOKED",
- "attended": true,
- "time_start": 0,
- "duration": 0,
- "paid": true,
- "guest_bookings": 0,
- "description": "string",
- "image_url": "string",
- "model": "events",
- "model_id": "string",
- "model_name": "string",
- "event_name": "string",
- "created": 0,
- "modified": 0
}A branch can have several payment methods, like CARD, DIRECT_DEBIT (ACH), CASH, etc. When doing a purchase, the payment method can be specified as well. Member-facing payment collection includes listing overdue subscription invoices and retrieving a payment link for a retriable invoice.
This call returns a list of all available payment methods for this branch.
| branchId required | string |
| includes required | string Set to 'includes=provider,iframe' |
{- "_id": "string",
- "branch_id": "string",
- "active": true,
- "staff_only": true,
- "type_id": {
- "_id": "string",
- "name": "string",
- "charge_percentage": 0,
- "fixed_charge": 0,
- "publishable_key": "string",
- "account_id": "string",
- "tokenization_handler": "string"
}, - "iframe": {
- "parameters": {
- "color_accent": "string",
- "color_background": "string",
- "color_text": "string"
}, - "domain": "string",
- "full_path": "string"
}
}Retrieves the payment link details for a given invoice. Validates that the invoice exists, is currently retriable, and returns the payment link details if applicable.
Requires a valid JWT with member role (Authorization header).
| invoiceID required | string Invoice ID |
| Authorization required | string Bearer JWT with member role. |
{- "invoice_id": "string",
- "is_retriable": true,
- "invoice_summary": "string",
- "invoice_amount": 5000,
- "invoice_currency": "EUR",
- "utc_invoice_timestamp": "string"
}Retrieve overdue subscription Invoices by user ID.
Requires a valid JWT with member role (Authorization header). Results are sorted by due date descending (newest first) and silently truncated to a maximum of 20 invoices.
| userID required | string The user id |
| Authorization required | string Bearer JWT with member role. |
{- "data": [
- {
- "invoice_id": "string",
- "due_date_utc": "string"
}
]
}Returns all transactions in a time frame for a studio. Set the start and end fields in the filter to set the timeframe.
filter.CompareToRanges is set to true, the secondStart and secondEnd fields must be provided to define the secondary date range.start and end fields define the primary date range.| branch_id | string The branch_id of the studio. |
| namespace | string The namespace of the studio. |
| start | string UNIX timestamp (string) for the start of the primary date range. |
| end | string UNIX timestamp (string) for the end of the primary date range. |
| secondStart | integer <int64> UNIX timestamp (string) for the secondary date range. Required if |
| secondEnd | integer <int64> UNIX timestamp (string) for the secondary date range. Required if |
| model | string Set to |
object |
{- "model": "TransactionsList",
- "branch_id": "Branch ID",
- "namespace": "Customer's namespace",
- "start": "1773187200",
- "end": "1773791999",
- "secondStart": "1773187200",
- "secondEnd": "1773791999",
- "filter": {
- "ReportByMembers": false,
- "CompareToRanges": false,
- "PaymentMethods": [
- {
- "id": "cash"
}, - {
- "id": "credit_card"
}, - {
- "id": "bank_transfer"
}, - {
- "id": "paypal"
}, - {
- "id": "direct_debit"
}, - {
- "id": "complimentary"
}, - {
- "id": "wallet"
}
]
}
}{- "TransactionsList": {
- "details": [
- {
- "_id": "string",
- "id": "string",
- "transaction_status": "string",
- "transaction_provider_id": "string",
- "amount": 0,
- "currency": "string",
- "paid": true,
- "description": "string",
- "sold_by_user_id": "string",
- "created": "string",
- "modified": "string",
- "metadata": {
- "namespace": "string",
- "branch_id": "string",
- "glofox_event": "string",
- "payment_method": "string"
}
}
]
}
}This returns all trainers in a studio and the number of events they were assigned to in a time period.
| start required | string Events after this time will be reported on |
| end required | string Events before this time will be reported on |
{- "success": true,
- "report": {
- "trainer_id": {
- "_id": true,
- "name": "string",
- "type": "string",
- "active": "string",
- "programs": {
- "events": 0,
- "bookings": 0,
- "attendance": 0,
- "capacity": 0
}, - "appointments": {
- "events": 0,
- "bookings": 0,
- "attendance": 0,
- "capacity": 0
}
}
}
}A user can have the need to sign different electronic contracts. Operations to get those and force the send email for those are exposed here.
This call returns the waivers for a studio. If you are integrating electronic agreements the first waiver to use is 'type = member.authenticated'
[- {
- "_id": "string",
- "branch_id": "string",
- "namespace": "string",
- "type": "string"
}
]This call emails a document to a user to sign.
| branchId required | string^[a-f\d]{24}$ |
| userId required | string^[a-f\d]{24}$ |
| trigger required | string Enum: "member.authenticated" "membership.purchased" The type of document. If integrating electronic agreements the first waiver to use is 'trigger = member.authenticated'. For membership terms and conditions the waiver to use is 'trigger = membership.purchased' |
{- "trigger": "member.authenticated"
}Fetches a list of agreements for a specific user within a branch.
| branchId required | string^[a-f\d]{24}$ |
| userId required | string^[a-f\d]{24}$ |
{- "success": true,
- "agreements": [
- {
- "id": "string",
- "member_id": "string",
- "studio_id": "string",
- "document_id": "string",
- "status": "outstanding",
- "external_reference": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Fetch the latest agreement template for a given branch based on the specified trigger. Member-authenticated refers to Waivers, while membership-purchased refers to Terms and Conditions.
| branchId required | string^[a-zA-Z0-9]+$ |
| trigger required | string Enum: "member-authenticated" "membership-purchased" The trigger event (member-authenticated or membership-purchased) |
| userId required | string^[a-zA-Z0-9]+$ The user ID related to the request |
| membershipId required | string^[a-zA-Z0-9]+$ The membership ID related to the request (must be empty for member-authenticated) |
| planCode required | string^[0-9]+$ The plan code related to the request (must be empty for member-authenticated) |
{- "version": 1,
- "created_at": "2025-04-03T16:53:04.253Z",
- "updated_at": "2025-04-03T16:53:04.253Z",
- "template": "string"
}This endpoint sends an agreement to a user by the agreement's ID. Use this to resend agreements that need to be signed again.
| branchId required | string^[a-f\d]{24}$ |
| userId required | string^[a-f\d]{24}$ |
| agreementId required | string |
| agreementMetaData | string For memberships agreements it's the user membership ID |
{- "agreementMetaData": "string"
}{- "success": true,
- "message": "string"
}Operations from the purchase flow to know how much a user will be charged for a particular purchase.
Calls price calculator service to determine the breakdown for a product(s) including discounts and taxes.
The example response is for a branch with exclusive tax set. If the branch is using inclusive tax you will note a few differences:
taxes.products[n].net_price This would be the discounted price minus the total tax (taxes are included in the product price).taxes.products[n].total_price This would be the same as discounted price (again because taxes are included the price would remain the same).Price calculator does not determine prorated amounts, or the validity of whether a discount/promo code can be used for a particular item. It is up to client to determine this.
discount_ids: This parameter can only be used by staff/integrators.promo_code: This parameter can be used by any user.The discount_ids and promo_code parameters should only ever be used mutually exclusively.
| branchId required | string |
Array of objects (PriceBreakdownRequestProduct) |
{- "products": [
- {
- "price": 2,
- "unit_price": 1,
- "quantity": 2,
- "promo_code": "PROMO-123",
- "discount_ids": [
- "string"
], - "service_type": "products",
- "service_id": "product-id-123",
- "sub_service_id": "product-presentation-id-123"
}
]
}{- "discounts": {
- "products": [
- {
- "applied_discounts": [
- {
- "discount_amount": 0.4,
- "id": "discount-id-1",
- "name": "10% Off Special",
- "promo_code": {
- "id": "string",
- "code": "string"
}, - "rate_type": "percentage",
- "rate_value": 10
}
], - "discounted_price": 1.6,
- "discounts_total": 0.4,
- "product_price": 2
}
]
}, - "taxes": {
- "products": [
- {
- "applied_taxes": [
- {
- "id": "id-123",
- "name": "City tax",
- "price": 0.19,
- "rate": 12
}
], - "net_price": 1.6,
- "product_price": 1.6,
- "tax_total": 0.19,
- "total_price": 1.79
}
]
}
}This endpoint calculates the price of an appointment for a specific member.
| branchId required | string |
| appointmentId required | string |
| member_id required | string |
| time_start required | integer |
{- "member_id": "string",
- "time_start": 0
}{- "success": true,
- "data": [
- {
- "credits": 0,
- "price": 0,
- "currency": "string"
}
]
}This endpoint calculates the price of a facility for a specific member.
| branchId required | string |
| facilityId required | string |
| member_id required | string |
| time_start required | integer |
{- "member_id": "string",
- "time_start": 0
}{- "success": true,
- "data": [
- {
- "credits": 0,
- "price": 0,
- "currency": "string"
}
]
}This endpoint calculates the price of a course for a specific member.
| branchId required | string |
| courseId required | string |
| member_id required | string |
| number_of_bookings required | integer |
{- "member_id": "string",
- "number_of_bookings": 0
}{- "success": true,
- "data": [
- {
- "credits": 0,
- "price": 0,
- "currency": "string"
}
]
}This endpoint calculates the price of an event for a specific member.
| branchId required | string |
| eventId required | string |
| member_id required | string |
| number_of_bookings required | integer |
{- "member_id": "string",
- "number_of_bookings": 0
}{- "success": true,
- "data": [
- {
- "credits": 0,
- "price": 0,
- "currency": "string"
}
]
}This endpoint is to virtually generate appointment slots based on the trainers availabilities.
Please note that filtering by start-time and finish-time may result in different values than if you do not filter by any time range, since this endpoint only returns availabilities that start and end in the requested range.
Time parameter validation rules - Both start-time and finish-time must be provided together when filtering by time. You can provide both parameters together, or omit both parameters (system defaults to today's availability window). Providing only one parameter will result in a validation error. When both are provided, finish-time must be after start-time.
| branchId required | string The id of the branch. |
| trainer-id | string Example: trainer-id=6744468fafce2a52b5d50aea The id of the trainer to filter availability. |
| start-time | string <datetime> Example: start-time=2024-09-01T12:00:00Z This parameter sets the initial point to generate the slots. |
| finish-time | string <datetime> Example: finish-time=2024-09-01T20:00:00Z This parameter sets the final point to generate the slots. |
{- "data": [
- {
- "id": "string",
- "image_url": "string",
- "name": "string",
- "description": "string",
- "type": "string",
- "model_id": "string",
- "size": 0,
- "time_start": 0,
- "time_start_iso": "2019-08-24T14:15:22Z",
- "duration": 0,
- "trainer": {
- "id": "string",
- "image_url": "string",
- "first_name": "string",
- "last_name": "string",
- "description": "string"
}
}
]
}Operations to manage a cart, a cart is a temporary storage of the items that a member wants to purchase.
Validates the member can purchase the line items supplied and returns a detailed price breakdown, including both the immediate charge and any future recurring charges.
The response is split into two items: due_today and future_charges:
The response includes:
Notes:
| x-glofox-impersonated-member-id required | string The ID of a member who's pre-checkout cart values are being calculated. |
Array of objects (LineItems) non-empty The items to be purchased |
{- "line_items": [
- {
- "attributes": {
- "membership": {
- "utc_start_date": "string"
}
}, - "promo_code": "string",
- "service_id": "string",
- "service_type": "memberships",
- "quantity": 1,
- "sub_service_id": "string"
}
]
}{- "currency": "string",
- "due_today": {
- "accepted_payment_methods": [
- "string"
], - "amount": 0,
- "discounts": [
- {
- "id": "string",
- "name": "string",
- "num_cycles": 0,
- "rate": 0,
- "total_applied": 0,
- "type": "string"
}
], - "line_items": [
- {
- "amount": 0,
- "metadata": {
- "addon": {
- "credit": {
- "count": 0,
- "is_carry_over": true
}, - "duration": {
- "count": 0,
- "duration_unit": "string",
- "has_end_date": true,
- "total_num_cycles": 0
}, - "is_credit_based": true,
- "is_recurring": true,
- "plan_id": "string",
- "plan_name": "string",
- "type": "string"
}, - "membership": {
- "auto_renewal": true,
- "duration_time_unit": "string",
- "duration_time_unit_count": 0,
- "free_time_unit_time": 0,
- "has_end": true,
- "is_group_membership": true,
- "is_prorated": true,
- "min_price": 0,
- "payment_methods": {
- "active": true,
- "type_id": "string"
}, - "plan_code": "string",
- "plan_name": "string",
- "starts_on": "string",
- "subscription_plan_duration": "string",
- "subscription_plan_id": "string",
- "type": "string",
- "upfront_fee": 0
}, - "product": {
- "presentation_id": "string",
- "presentation_name": "string",
- "product_name": "string",
- "stock": 0
}, - "recurring_fee": {
- "fee_name": "string",
- "price": 0
}
}, - "service_id": "string",
- "service_name": "string",
- "service_sub_type": "string",
- "service_type": "string",
- "sub_service_id": "string",
- "sub_service_name": "string"
}
], - "net_price": 0,
- "taxes": [
- {
- "id": "string",
- "name": "string",
- "rate": 0,
- "total_applied": 0
}
], - "total_discounts": 0,
- "total_taxes": 0
}, - "future_charges": [
- {
- "accepted_payment_methods": [
- "string"
], - "amount": 0,
- "category": "RECURRING_CHARGE_MEMBERSHIP",
- "delay_charge_days": 0,
- "discounts": [
- {
- "id": "string",
- "name": "string",
- "num_cycles": 0,
- "rate": 0,
- "total_applied": 0,
- "type": "string"
}
], - "duration_time_unit": "DAY",
- "duration_time_unit_count": 0,
- "line_items": [
- {
- "amount": 0,
- "metadata": {
- "addon": {
- "credit": {
- "count": 0,
- "is_carry_over": true
}, - "duration": {
- "count": 0,
- "duration_unit": "string",
- "has_end_date": true,
- "total_num_cycles": 0
}, - "is_credit_based": true,
- "is_recurring": true,
- "plan_id": "string",
- "plan_name": "string",
- "type": "string"
}, - "membership": {
- "auto_renewal": true,
- "duration_time_unit": "string",
- "duration_time_unit_count": 0,
- "free_time_unit_time": 0,
- "has_end": true,
- "is_group_membership": true,
- "is_prorated": true,
- "min_price": 0,
- "payment_methods": {
- "active": true,
- "type_id": "string"
}, - "plan_code": "string",
- "plan_name": "string",
- "starts_on": "string",
- "subscription_plan_duration": "string",
- "subscription_plan_id": "string",
- "type": "string",
- "upfront_fee": 0
}, - "product": {
- "presentation_id": "string",
- "presentation_name": "string",
- "product_name": "string",
- "stock": 0
}, - "recurring_fee": {
- "fee_name": "string",
- "price": 0
}
}, - "service_id": "string",
- "service_name": "string",
- "service_sub_type": "string",
- "service_type": "string",
- "sub_service_id": "string",
- "sub_service_name": "string"
}
], - "net_price": 0,
- "taxes": [
- {
- "id": "string",
- "name": "string",
- "rate": 0,
- "total_applied": 0
}
], - "total_discounts": 0,
- "total_taxes": 0
}
], - "location_id": "string",
- "member_id": "string",
- "tax_mode": "exclusive"
}Validates the cart and initiates the checkout process. Returns the updated cart status and payment details.
| cartID required | string Unique identifier of the cart to be checked out. |
| x-glofox-impersonated-member-id required | string The ID of a member who's pre-checkout cart values are being calculated. |
{- "cart_status": "CHECKED_OUT",
- "invoice_id": "f4c4edb8-11e0-4b33-bcc1-482dc59ebb32",
- "invoice_status": "PAID",
- "payment_method": "CARD",
- "payment_status": "SUCCESS"
}Initializes a new cart with the provided line items and returns the cart details along with a detailed price breakdown. Validates that the authenticated user is allowed to purchase the specified line items and it returns a full cart object. The price_breakdown section includes:
| x-glofox-impersonated-member-id required | string The ID of a member who's cart is being created. |
required | Array of objects (CartRequestLineItem) non-empty The items to be purchased. |
| payment_method | string The payment method to be used for the cart. |
{- "line_items": [
- {
- "attributes": {
- "membership": {
- "utc_start_date": "string"
}
}, - "promo_code": "string",
- "service_id": "string",
- "service_type": "memberships",
- "sub_service_id": "string",
- "quantity": 1
}
], - "payment_method": "CARD"
}{- "id": "string",
- "location_id": "string",
- "member_id": "string",
- "payment_method": "CARD",
- "utc_created_at": "2023-05-25T12:00:00Z",
- "line_items": [
- {
- "id": "string",
- "service_id": "string",
- "service_type": "memberships",
- "sub_service_id": "string",
- "quantity": 1
}
], - "price_breakdown": {
- "currency": "USD",
- "due_today": {
- "accepted_payment_methods": [
- "CARD",
- "DIRECT_DEBIT"
], - "amount": 1120,
- "net_price": 1000,
- "taxes": [
- {
- "id": "string",
- "name": "string",
- "rate": 12000,
- "total_applied": 120
}
], - "total_taxes": 120
}, - "tax_mode": "exclusive"
}
}Updates an existing cart. Only the payment method can be updated.
| cartID required | string Unique identifier of the cart to be updated. |
| x-glofox-impersonated-member-id required | string The ID of a member who's cart is being updated. |
| payment_method | string Enum: "CARD" "CASH" "COMPLIMENTARY" "DIRECT_DEBIT" "POS_TERMINAL" "WALLET" "BANK_TRANSFER" "UNKNOWN" The new payment method associated with the cart. |
{- "payment_method": "CARD"
}{- "code": "ERROR_CODE",
- "message": "internal server error"
}This call returns all facilities for a given location.
| locationId required | string^[a-f\d]{24}$ The ID of the location for which to retrieve facilities. |
| page | integer >= 1 Default: 1 |
| limit | integer [ 1 .. 100 ] Default: 50 |
| sort-by | string field | -field (name, created_at) |
{- "object": "list",
- "page": 1,
- "limit": 50,
- "has_more": false,
- "total_count": 0
}This endpoint returns a filtered courses list
| locationId required | string^[a-f\d]{24}$ The ID of the location for which to retrieve courses. |
| page | integer Default: 1 The page number used to paginate course listings |
| limit | integer [ 1 .. 100 ] Default: 50 The number of results to return per page |
| sort-by | string Sort order for results (name, namespace, description, schedule_code, start_date, end_date) |
{- "object": "list",
- "page": 1,
- "limit": 50,
- "has_more": false,
- "total_count": 0
}This endpoint returns a filtered program list for an specific location
| locationId required | string^[a-f\d]{24}$ The ID of the location for which to retrieve programs. |
| page | integer The page number used to paginate course listings |
| limit | integer [ 1 .. 100 ] Default: 50 The number of results to return per page |
| sort_by | string Sort order for results (name, date_start, date_finish) |
| facility_ids | string Comma-separated list of facility IDs to filter programs by |
| has_facilities | boolean Filter programs that have facilities assigned |
{- "page": 0,
- "limit": 50,
- "sort_by": "string",
- "facility_ids": "string",
- "has_facilities": true
}{- "object": "list",
- "page": 1,
- "limit": 50,
- "has_more": false,
- "total_count": 0
}This endpoint returns a filtered product list for a specific location.
| locationId required | string^[a-f\d]{24}$ The ID of the location for which to retrieve products. |
| page | integer Default: 1 The page number used to paginate course listings. |
| limit | integer [ 1 .. 100 ] Default: 50 The number of results to return per page. |
| sort-by | string Sort order for results (created, modified). |
| name | string Filter by product name. |
| description | string Filter by product description. |
| featured | boolean Filter by featured products. |
{- "object": "list",
- "page": 1,
- "limit": 50,
- "has_more": false,
- "total_count": 0
}Endpoints for registering devices and retrieving push notification history for members.
Register a new mobile device to receive push notifications. Registering a new device overrides any previously registered device for the same user.
| x-glofox-branch-id required | string |
| x-api-key required | string |
| x-glofox-api-token required | string |
| x-glofox-impersonated-member-id required | string |
| bundle | string The application bundle/package identifier. Provided by Glofox. |
| device_id | string The unique device identifier or push token used to target the device. |
| os | string The device operating system, e.g. |
object (DeviceVersion) |
{- "bundle": "string",
- "device_id": "string",
- "os": "string",
- "version": {
- "major": 0,
- "minor": 0,
- "revision": 0
}
}{- "bundle": "string",
- "device_id": "string",
- "location_id": "string",
- "os": "string",
- "user_id": "string",
- "version": {
- "major": 0,
- "minor": 0,
- "revision": 0
}
}Unregisters all devices for the authenticated member.
| x-glofox-branch-id required | string |
| x-api-key required | string |
| x-glofox-api-token required | string |
| x-glofox-impersonated-member-id required | string |
{- "code": "string",
- "message": "string"
}Returns paginated push notifications for the member. Branch and user IDs are taken from the token.
| userID required | string Member user ID |
| page | integer Page index, 1-based (default 1) |
| limit | integer Page size (default 20, min 1, max 100) |
| x-glofox-branch-id required | string |
| x-api-key required | string |
| x-glofox-api-token required | string |
| x-glofox-impersonated-member-id required | string |
{- "notifications": [
- {
- "_id": "string",
- "branch_id": "string",
- "type": "string",
- "user_id": "string",
- "is_marketing": true,
- "message": "string",
- "created": 0,
- "transaction": {
- "id": "string",
- "model": "string",
- "operation": "string"
}
}
], - "pagination": {
- "count": 0,
- "perPage": 0,
- "currentPage": 0
}
}Inbound webhook payloads delivered as HTTP POST requests to your configured endpoint.
Each webhook includes a signature header for HMAC-SHA256 validation.
For delivery timeouts, retries, idempotency, and signature validation, see the Webhooks guide. Each operation below documents event-specific behaviour and payload schemas for that webhook type.
Notifies your integration when a member creates or updates a barcode. Use it to keep barcode identifiers in sync with access hardware or third-party apps that rely on the current barcode value.
Event types: MEMBER_ACCESS_INFO_CREATED, MEMBER_ACCESS_INFO_UPDATED.
This webhook covers barcode create and update events. It does not fire when the system grants or denies access.
| signature | string A HMAC-SHA256 hash verifying the authenticity of Glofox webhook. The hash is a hexadecimal string. In short Signature = Hex( HMAC-SHA256( YourSecretKey, StringToSign )) |
| Type required | string Enum: "MEMBER_ACCESS_INFO_CREATED" "MEMBER_ACCESS_INFO_UPDATED" The payload event type. |
required | object |
| Timestamp required | string <date-time> The timestamp when the event occurred. |
required | object |
{- "Type": "MEMBER_ACCESS_INFO_CREATED",
- "Metadata": {
- "trace_id": "string",
- "location_id": "string",
- "version": "string"
}, - "Timestamp": "2019-08-24T14:15:22Z",
- "Payload": {
- "user_id": "string",
- "identifiers": {
- "barcode": "string",
- "fob_id": "string"
}
}
}{- "status": "string"
}Booking is the result of a particular member booking an event. After the booking has passed it will contain the attendance. There are 3 types of events (BOOKING_CREATED, BOOKING_DELETED, BOOKING_UPDATED).
| signature | string A HMAC-SHA256 hash verifying the authenticity of Glofox webhook. The hash is a hexadecimal string. In short Signature = Hex( HMAC-SHA256( YourSecretKey, StringToSign )) |
| Type required | string Enum: "BOOKING_CREATED" "BOOKING_DELETED" "BOOKING_UPDATED" The payload event type. |
required | object |
| Timestamp required | string <date-time> The timestamp when the event occurred. |
required | object |
{- "Type": "BOOKING_CREATED",
- "Metadata": {
- "trace_id": "string",
- "location_id": "string",
- "version": "string"
}, - "Timestamp": "2019-08-24T14:15:22Z",
- "Payload": {
- "id": "string",
- "user_id": "string",
- "status": "BOOKED",
- "time_start": "2025-01-16T15:00:00Z",
- "time_finish": "2025-01-16T16:00:00Z",
- "guest_bookings": 0,
- "model": "appointments",
- "model_id": "string",
- "paid": true,
- "attended": true,
- "course_session_id": "string",
- "created": "2025-01-15T16:12:00Z",
- "modified": "2025-01-15T17:18:30Z"
}
}{- "status": "string"
}A course booking event represents the booking of a course by a user. There are 2 types of events (COURSE_BOOKING_CREATED, COURSE_BOOKING_DELETED).
| signature | string A HMAC-SHA256 hash verifying the authenticity of Glofox webhook. The hash is a hexadecimal string. In short Signature = Hex( HMAC-SHA256( YourSecretKey, StringToSign )) |
| Type required | string Enum: "COURSE_BOOKING_CREATED" "COURSE_BOOKING_DELETED" The payload event type. |
required | object |
| Timestamp required | string <date-time> The timestamp when the event occurred |
required | object |
{- "Type": "COURSE_BOOKING_CREATED",
- "Metadata": {
- "trace_id": "string",
- "location_id": "string",
- "version": "string"
}, - "Timestamp": "2019-08-24T14:15:22Z",
- "Payload": {
- "id": "string",
- "user_id": "string",
- "course_id": "string",
- "status": "BOOKED",
- "date_start": "2025-01-16",
- "date_finish": "2025-01-16",
- "guest_bookings": 0,
- "paid": true,
- "schedule": [
- {
- "day_of_week": 0,
- "day_name": "SUN",
- "slots": [
- {
- "time_start": "string",
- "time_end": "string"
}
]
}
], - "created": "2025-01-15T16:12:00Z",
- "modified": "2025-01-15T17:18:30Z"
}
}{- "status": "string"
}An eagreement event represents the acceptance by a user of a studio's waiver and/or terms & conditions for services purchased. There is 2 types of event (EAGREEMENT_CREATED, EAGREEMENT_UPDATED).
| signature | string A HMAC-SHA256 hash verifying the authenticity of Glofox webhook. The hash is a hexadecimal string. In short Signature = Hex( HMAC-SHA256( YourSecretKey, StringToSign )) |
| Type required | string Enum: "EAGREEMENT_CREATED," "EAGREEMENT_UPDATED," The payload event type |
required | object |
| Timestamp required | string <date-time> The timestamp when the event occurred |
required | object |
{- "Type": "EAGREEMENT_CREATED,",
- "Metadata": {
- "trace_id": "string",
- "location_id": "string",
- "version": "string"
}, - "Timestamp": "2019-08-24T14:15:22Z",
- "Payload": {
- "user_id": "string",
- "resource_id": "string",
- "trigger": "member_authenticated",
- "status": "outstanding",
- "created": "2019-08-24T14:15:22Z",
- "modified": "2019-08-24T14:15:22Z"
}
}{- "status": "string"
}An event represents the occurrence of a class at a specific date and time. There are 3 types of events (EVENT_CREATED, EVENT_UPDATED, EVENT_DELETED).
| signature | string A HMAC-SHA256 hash verifying the authenticity of Glofox webhook. The hash is a hexadecimal string. In short Signature = Hex( HMAC-SHA256( YourSecretKey, StringToSign )) |
| Type required | string Enum: "EVENT_CREATED" "EVENT_UPDATED" "EVENT_DELETED" The payload event type |
required | object |
| Timestamp required | string <date-time> The timestamp when the event occurred |
required | object |
{- "Type": "EVENT_CREATED",
- "Metadata": {
- "trace_id": "string",
- "location_id": "string",
- "version": "string"
}, - "Timestamp": "2019-08-24T14:15:22Z",
- "Payload": {
- "id": "string",
- "namespace": "string",
- "type": "string",
- "active": true,
- "name": "string",
- "description": "string",
- "time_start": "2019-08-24T14:15:22Z",
- "time_finish": "2019-08-24T14:15:22Z",
- "is_online": true,
- "size": 0,
- "private": true,
- "booked": 0,
- "waiting": 0,
- "program_id": "string",
- "level": "string",
- "facility": "string",
- "trainers": [
- "string"
], - "status": "string",
- "model": "facilities",
- "model_id": "string",
- "created": "2019-08-24T14:15:22Z",
- "modified": "2019-08-24T14:15:22Z"
}
}{- "status": "string"
}An invoice represents an itemized commercial document that records the products or services delivered to the customer and the total amount due. There are 1 type of event (INVOICE_UPDATED).
| signature | string A HMAC-SHA256 hash verifying the authenticity of Glofox webhook. The hash is a hexadecimal string. In short Signature = Hex( HMAC-SHA256( YourSecretKey, StringToSign )) |
| type | string Value: "INVOICE_UPDATED" The payload event type |
required | object |
| Timestamp required | string <date-time> The timestamp when the event occurred |
required | object |
{- "type": "INVOICE_UPDATED",
- "Metadata": {
- "trace_id": "string",
- "location_id": "string",
- "version": "string"
}, - "Timestamp": "2019-08-24T14:15:22Z",
- "Payload": {
- "id": "string",
- "sold_by_user": {
- "id": "string"
}, - "user": {
- "id": "string",
- "first_name": "string",
- "last_name": "string",
- "phone": "string",
- "tax_id": "string",
- "address": {
- "street": "string",
- "city": "string",
- "state": "string",
- "country": "string",
- "postal_code": "string"
}
}, - "date": "2019-08-24T14:15:22Z",
- "line_items": [
- {
- "name": "string",
- "unit_price": 0,
- "quantity": 0,
- "gross_amount": 0,
- "applied_taxes": [
- {
- "tax_amount": 0,
- "rate": 0,
- "tax_base": 0
}
], - "applied_discounts": [
- {
- "discount_amount": 0,
- "rate_type": "string",
- "rate_value": 0
}
], - "type": "APPOINTMENTS",
- "sub_type": "BOOK_TIME_SLOT"
}
], - "total": 0,
- "currency": "string",
- "document_type": "string",
- "payment_method": "CARD",
- "status": "PAID",
- "created": "2019-08-24T14:15:22Z",
- "modified": "2019-08-24T14:15:22Z"
}
}{- "status": "string"
}Notifies your integration when a member is created or updated.
Event types: MEMBER_CREATED, MEMBER_UPDATED.
Glofox does not emit a MEMBER_DELETED event. Deleting a member is a soft delete
that sets active to false, delivered as MEMBER_UPDATED. Treat MEMBER_UPDATED
events where active is false as a member becoming inactive, not as a permanent
removal. Soft-deleted members can be restored by staff or reactivated when the member
re-registers (active set back to true, delivered as a further MEMBER_UPDATED
event). Do not permanently purge member data based solely on active: false.
| signature | string A HMAC-SHA256 hash verifying the authenticity of Glofox webhook. The hash is a hexadecimal string. In short Signature = Hex( HMAC-SHA256( YourSecretKey, StringToSign )) |
| type | string Enum: "MEMBER_CREATED" "MEMBER_UPDATED" The payload event type |
required | object |
| Timestamp required | string <date-time> The timestamp when the event occurred |
required | object |
{- "type": "MEMBER_CREATED",
- "Metadata": {
- "trace_id": "string",
- "location_id": "string",
- "version": "string"
}, - "Timestamp": "2019-08-24T14:15:22Z",
- "Payload": {
- "id": "string",
- "first_name": "string",
- "last_name": "string",
- "email": "string",
- "home_location_id": "string",
- "gender": "MALE",
- "birth": "2019-08-24",
- "phone": "string",
- "role": "MEMBER",
- "active": true,
- "emergency_contact": "string",
- "namespace": "string",
- "parent_id": "string",
- "contact_email": "string",
- "image_url": "string",
- "created": "2019-08-24T14:15:22Z",
- "modified": "2019-08-24T14:15:22Z"
}
}{- "status": "string"
}A membership is the main service that a user can have. A user can only have one membership at a given time. There are 3 types of events (MEMBERSHIP_CREATED, MEMBERSHIP_UPDATED, MEMBERSHIP_DELETED).
| signature | string A HMAC-SHA256 hash verifying the authenticity of Glofox webhook. The hash is a hexadecimal string. In short Signature = Hex( HMAC-SHA256( YourSecretKey, StringToSign )) |
| Type required | string Enum: "MEMBERSHIP_CREATED" "MEMBERSHIP_UPDATED" "MEMBERSHIP_DELETED" The payload event type |
required | object |
| Timestamp required | string <date-time> The timestamp when the event occurred |
required | object |
{- "Type": "MEMBERSHIP_CREATED",
- "Metadata": {
- "trace_id": "string",
- "location_id": "string",
- "version": "string"
}, - "Timestamp": "2019-08-24T14:15:22Z",
- "Payload": {
- "id": "string",
- "user_id": "string",
- "membership_definition": {
- "id": "string",
- "name": "string",
- "plan_code": "string",
- "plan_name": "string",
- "roaming_enabled": true,
- "trial": true,
- "starts_on": "PURCHASE_DATE",
- "type": "time",
- "roaming_branches": [
- "string"
]
}, - "price": 0,
- "upfront_fee": 0,
- "contract": {
- "start_date": "2019-08-24T14:15:22Z",
- "end_date": "2019-08-24T14:15:22Z",
- "conclusion_date": "2019-08-24T14:15:22Z"
}, - "cycle": {
- "start_date": "2019-08-24T14:15:22Z",
- "end_date": "2019-08-24T14:15:22Z",
- "next_payment_date": "2019-08-24T14:15:22Z"
}, - "status": "FUTURE",
- "group": {
- "id": "string",
- "is_primary": true
}, - "created": "2019-08-24T14:15:22Z",
- "modified": "2019-08-24T14:15:22Z"
}
}{- "status": "string"
}A service is a product that a user can purchase. There are 3 types of service events (SERVICE_CREATED, SERVICE_UPDATED, SERVICE_DELETED).
| signature | string A HMAC-SHA256 hash verifying the authenticity of Glofox webhook. The hash is a hexadecimal string. In short Signature = Hex( HMAC-SHA256( YourSecretKey, StringToSign )) |
| type | string Enum: "SERVICE_CREATED" "SERVICE_UPDATED" "SERVICE_DELETED" The payload event type |
object | |
| timestamp | string <date-time> The timestamp when the event occurred |
object |
{- "type": "SERVICE_CREATED",
- "metadata": {
- "trace_id": "string",
- "location_id": "string",
- "version": "string"
}, - "timestamp": "2019-08-24T14:15:22Z",
- "payload": {
- "id": "string",
- "definition": {
- "id": "string",
- "version": 0,
- "name": "string",
- "type": "string",
- "description": "string",
- "plan": [
- {
- "id": "string",
- "name": "string",
- "price": 0,
- "credit": {
- "count": "string",
- "is_carry_over": "string"
}, - "duration": {
- "count": 0,
- "has_end_date": true,
- "total_no_of_cycles": 0,
- "duration_unit": "string"
}, - "is_recurring": true,
- "is_credit_based": true
}
]
}, - "planned_start_date": "2019-08-24T14:15:22Z",
- "planned_end_date": "2019-08-24T14:15:22Z",
- "next_payment_date": "2019-08-24T14:15:22Z",
- "purchased": "2019-08-24T14:15:22Z",
- "member_ids": [
- "string"
], - "price": 0,
- "concluded": "2019-08-24T14:15:22Z",
- "commenced": "2019-08-24T14:15:22Z",
- "cycles": [
- {
- "start_date": "2019-08-24T14:15:22Z",
- "end_date": "2019-08-24T14:15:22Z"
}
], - "membership_id": "string",
- "status": "string",
- "pause": {
- "start_date": "2019-08-24T14:15:22Z",
- "duration_unit": "DAY",
- "duration_amount": 0,
- "resume_date": "2019-08-24T14:15:22Z"
}, - "available_credits": 0,
- "external_resource_id": "string",
- "membership_external_resource_id": "string",
- "created": "2019-08-24T14:15:22Z",
- "modified": "2019-08-24T14:15:22Z"
}
}{- "status": "string"
}A push notification event represents a push message sent to one or more member devices. There is 1 type of event (PUSH_NOTIFICATION_CREATED).
| signature | string A HMAC-SHA256 hash verifying the authenticity of Glofox webhook. The hash is a hexadecimal string. In short Signature = Hex( HMAC-SHA256( YourSecretKey, StringToSign )) |
| Type required | string Value: "PUSH_NOTIFICATION_CREATED" The payload event type. |
required | object |
| Timestamp required | string <date-time> The timestamp when the event occurred. |
required | object |
{- "Type": "PUSH_NOTIFICATION_CREATED",
- "Metadata": {
- "trace_id": "string",
- "location_id": "string",
- "version": "string"
}, - "Timestamp": "2019-08-24T14:15:22Z",
- "Payload": {
- "to": [
- {
- "user_id": "string",
- "device_id": "string"
}
], - "notification": {
- "title": "string",
- "body": "string"
}
}
}{- "status": "string"
}