Customer API v1.0.0
Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.
Mariana Tek's Customer API gives you the power to build custom booking and buying experiences for fitness customers. It can also be used to extend the functionality already offered by the Mariana Tek Web Integrations and mobile applications to keep your users engaged.
Email: Support
Authentication
-
oAuth2 authentication.
The Customer API uses bearer auth to authenticate requests. You should obtain the access token for making authenticated requests using OAuth2.0. For more information, check out our authentication documentation.- Flow: authorizationCode
- Authorization URL = https://{BRAND}.marianatek.com/o/authorize
- Token URL = https://{BRAND}.marianatek.com/o/token
Brand Config
Configuration details for the brand.
Get configuration info
Code samples
# You can also use wget
curl -X GET /api/customer/v1/config \
-H 'Accept: application/json'
GET /api/customer/v1/config HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/config',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/config',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/config', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/config', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/config");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/config", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/config
View configuration information for a brand.
Example responses
200 Response
{
"california_privacy_policy": "https://marianatek.com/california-privacy",
"email_marketing_opt_in_copy": "Opt-in to receive emails from us about upcoming classes, special events, promotions, and more. You can opt out at any time by editing the communication settings on your account profile.",
"privacy_policy": "https://marianatek.com/privacy",
"sms_marketing_opt_in_copy": "Opt-in to receive text messages from us about upcoming classes, special events, promotions, and more. You can opt out at any time by replying STOP or editing the communication settings on your account profile.",
"legal_documents": [
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false
}
],
"terms_of_service": "https://marianatek.com/terms",
"tracking_consent_copy": {
"android": {
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
},
"ios": {
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
},
"web-integrations": {
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
}
},
"are_optional_cookies_enabled_by_default": true,
"are_pronouns_enabled": true,
"are_purchase_agreements_enabled": false,
"brand_name": "Ohami Yogi",
"brand_url": "https://mydomain.com/",
"facebook_pixel_id": "123456789",
"google_tag_manager_id": "GTM-XXXX",
"ios_is_in_app_purchase_enabled": false,
"is_cookie_banner_enabled": false,
"is_multi_currency": false,
"is_pre_checked_newsletter_subscription_enabled": false,
"is_research_opt_in_enabled": false,
"is_sms_opt_in_enabled": false,
"is_guest_email_required": false,
"limit_complimentary_account_balance_by_location_enabled": false,
"limit_cash_backed_account_balance_by_location_enabled": false,
"locale_settings": {
"date_input_format": "M/d/y",
"date_input_placeholder": "MM/DD/YYYY",
"time_input_format": "h:mm a"
},
"mobile_app_tabs": [
{
"is_active": true,
"page_name": "My Awesome Page",
"page_url": "https://www.google.com",
"tab_name": "My Great Tab",
"tab_icon_ios": "gift-box",
"tab_icon_android": "exclamation-point"
}
],
"process_deferred_orders_offset": 60,
"schema_name": "ohami_yoga"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Config |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Get legal info
Code samples
# You can also use wget
curl -X GET /api/customer/v1/legal \
-H 'Accept: application/json'
GET /api/customer/v1/legal HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/legal',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/legal',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/legal', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/legal', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/legal");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/legal", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/legal
View legal configuration information for a brand.
Example responses
200 Response
{
"california_privacy_policy": "https://marianatek.com/california-privacy",
"email_marketing_opt_in_copy": "Opt-in to receive emails from us about upcoming classes, special events, promotions, and more. You can opt out at any time by editing the communication settings on your account profile.",
"privacy_policy": "https://marianatek.com/privacy",
"sms_marketing_opt_in_copy": "Opt-in to receive text messages from us about upcoming classes, special events, promotions, and more. You can opt out at any time by replying STOP or editing the communication settings on your account profile.",
"legal_documents": [
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false
}
],
"terms_of_service": "https://marianatek.com/terms",
"tracking_consent_copy": {
"android": {
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
},
"ios": {
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
},
"web-integrations": {
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Legal |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Get brand theme
Code samples
# You can also use wget
curl -X GET /api/customer/v1/theme \
-H 'Accept: application/json'
GET /api/customer/v1/theme HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/theme',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/theme',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/theme', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/theme', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/theme");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/theme", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/theme
View branding information that can be used for styling applications.
Example responses
200 Response
{
"are_booking_windows_public": true,
"dark_logo": "https://mydomain.com/media/logo-dark.png",
"dark_mark": "https://mydomain.com/media/mark-dark.png",
"is_dark_mode": false,
"is_location_nav_enabled": true,
"is_mt_attribution_enabled": true,
"light_logo": "https://mydomain.com/media/logo-light.png",
"light_mark": "https://mydomain.com/media/mark-light.png",
"primary_color": "#FFFFFF",
"primary_font": {
"css_source": "https://fonts.googleapis.com/css?family=Lato:300,400,700",
"font_family": "Helvetica Neue"
},
"primary_foreground_color": "#FFFFFF",
"schedule": {
"is_class_cell_location_enabled": true,
"is_class_cell_room_enabled": true,
"is_class_type_filter_enabled": true,
"is_instructor_filter_enabled": true,
"is_room_filter_enabled": true
},
"secondary_color": "#FFFFFF",
"secondary_font": {
"css_source": "https://fonts.googleapis.com/css?family=Lato:300,400,700",
"font_family": "Helvetica Neue"
},
"secondary_foreground_color": "#FFFFFF",
"tab_bar_image": "https://mydomain.com/media/tab-bar.png"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Theme |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
List app version metadata for customer applications (Android & iOS).
Code samples
# You can also use wget
curl -X GET /api/customer/v1/app_version_metadatas \
-H 'Accept: application/json'
GET /api/customer/v1/app_version_metadatas HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/app_version_metadatas',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/app_version_metadatas',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/app_version_metadatas', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/app_version_metadatas', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/app_version_metadatas");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/app_version_metadatas", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/app_version_metadatas
View a list of the latest version details for Mariana Tek mobile applications, including if an update is mandatory for a given application.
Example responses
200 Response
{
"results": [
{
"id": "123",
"app_name": "ios",
"app_version": "2.0.0",
"is_mandatory": "true"
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | AppVersionMetadataList |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve version metadata for a customer application.
Code samples
# You can also use wget
curl -X GET /api/customer/v1/app_version_metadatas/{app_version_metadata_id} \
-H 'Accept: application/json'
GET /api/customer/v1/app_version_metadatas/{app_version_metadata_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/app_version_metadatas/{app_version_metadata_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/app_version_metadatas/{app_version_metadata_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/app_version_metadatas/{app_version_metadata_id}', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/app_version_metadatas/{app_version_metadata_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/app_version_metadatas/{app_version_metadata_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/app_version_metadatas/{app_version_metadata_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/app_version_metadatas/{app_version_metadata_id}
Get version metadata details about a single customer application, including version number.
Example responses
200 Response
{
"id": "123",
"app_name": "ios",
"app_version": "2.0.0",
"is_mandatory": "true"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | AppVersionMetadata |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Account
Retreive and update details about the current user's account.
Get account details
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/account \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/account HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/account',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/account',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/account', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/account', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/account");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/account", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/account
View account details for the current user.
Example responses
200 Response
{
"id": "123",
"account_balance": [
{
"amount": "100.00",
"currency": "USD",
"locations": []
},
{
"amount": "50.00",
"currency": "USD",
"locations": [
{
"id": "123",
"name": "Dupont Circle"
}
]
}
],
"address_line_one": "123 Main Street",
"address_line_two": "Apt 1",
"address_line_three": "Townland",
"address_sorting_code": "134-A",
"birth_date": "1936-08-18",
"city": "Jackson Hole",
"company_name": "Mariana Tek",
"completed_class_count": 99,
"country": "US",
"credit_cards": [
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"postal_code": "12345",
"state_province": "DC",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
],
"email": "wednesday@example.com",
"emergency_contact_email": "morticia@example.com",
"emergency_contact_name": "Morticia Addams",
"emergency_contact_phone": "123-456-7890",
"emergency_contact_relationship": "Mother",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"full_name": "Wednesday Addams",
"gender": "female",
"home_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"is_balance_used_for_fees": true,
"is_marketing_allowed": true,
"is_opted_in_to_sms": true,
"is_waiver_signed": true,
"join_datetime": "2018-08-23T08:09:59.124612Z",
"last_name": "Addams",
"postal_code": "83001",
"phone_number": "123-456-7890",
"profile_image": null,
"pronouns": "they/them",
"required_legal_documents": [
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false,
"is_signed": true,
"signed_datetime": "2021-08-23T08:09:59.124612Z",
"broker_id": "12345",
"source": "Customer Application",
"legal_document": "61a995e3-b484-485a-9799-b873a93e83c6"
}
],
"state_province": "Wyoming"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | User |
401 | Unauthorized | Authorization information is missing or invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Update account details
Code samples
# You can also use wget
curl -X PATCH /api/customer/v1/me/account \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
PATCH /api/customer/v1/me/account HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"emergency_contact_email": "emergency@example.com"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/account',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch '/api/customer/v1/me/account',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('/api/customer/v1/me/account', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','/api/customer/v1/me/account', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/account");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "/api/customer/v1/me/account", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /api/customer/v1/me/account
Update profile information for the current user.
Note: there is a limitation in Widdershins that will not allow multiple examples to be shown. Please read customer-api.yaml
for a change password example request body.
Body parameter
{
"emergency_contact_email": "emergency@example.com"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | User | false | none |
Example responses
200 Response
{
"id": "123",
"account_balance": [
{
"amount": "100.00",
"currency": "USD",
"locations": []
},
{
"amount": "50.00",
"currency": "USD",
"locations": [
{
"id": "123",
"name": "Dupont Circle"
}
]
}
],
"address_line_one": "123 Main Street",
"address_line_two": "Apt 1",
"address_line_three": "Townland",
"address_sorting_code": "134-A",
"birth_date": "1936-08-18",
"city": "Jackson Hole",
"company_name": "Mariana Tek",
"completed_class_count": 99,
"country": "US",
"credit_cards": [
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"postal_code": "12345",
"state_province": "DC",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
],
"email": "wednesday@example.com",
"emergency_contact_email": "morticia@example.com",
"emergency_contact_name": "Morticia Addams",
"emergency_contact_phone": "123-456-7890",
"emergency_contact_relationship": "Mother",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"full_name": "Wednesday Addams",
"gender": "female",
"home_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"is_balance_used_for_fees": true,
"is_marketing_allowed": true,
"is_opted_in_to_sms": true,
"is_waiver_signed": true,
"join_datetime": "2018-08-23T08:09:59.124612Z",
"last_name": "Addams",
"postal_code": "83001",
"phone_number": "123-456-7890",
"profile_image": null,
"pronouns": "they/them",
"required_legal_documents": [
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false,
"is_signed": true,
"signed_datetime": "2021-08-23T08:09:59.124612Z",
"broker_id": "12345",
"source": "Customer Application",
"legal_document": "61a995e3-b484-485a-9799-b873a93e83c6"
}
],
"state_province": "Wyoming"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | User |
401 | Unauthorized | Authorization information is missing or invalid. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Create an account
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/account \
-H 'Content-Type: application/json' \
-H 'Accept: application/json'
POST /api/customer/v1/me/account HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"first_name": "tommy",
"last_name": "napkin",
"email": "tnapkin@example.com",
"password": "superSecret",
"phone_number": "1231231234",
"birth_date": "1911-11-11",
"home_location": {
"id": "12345"
},
"is_marketing_allowed": false,
"is_waiver_signed": true
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json'
};
fetch('/api/customer/v1/me/account',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json'
}
result = RestClient.post '/api/customer/v1/me/account',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
r = requests.post('/api/customer/v1/me/account', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/account', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/account");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/account", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/account
After a new user is created, your application should use OAuth2.0 to obtain an access token for this user. To make sure this user does not have to enter their credentials during the OAuth flow, a short-lived token is returned in the response headers, for example X-Ephemeral-Token={EPHEMERAL}
. This can be used with the query parameter ephemeral_token
in the /o/authorize
request to bypass the login step. Ephemeral tokens only remain active for a few minutes and can only be used once.
Body parameter
{
"first_name": "tommy",
"last_name": "napkin",
"email": "tnapkin@example.com",
"password": "superSecret",
"phone_number": "1231231234",
"birth_date": "1911-11-11",
"home_location": {
"id": "12345"
},
"is_marketing_allowed": false,
"is_waiver_signed": true
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | any | false | none |
Example responses
201 Response
{
"id": "123",
"account_balance": [
{
"amount": "100.00",
"currency": "USD",
"locations": []
},
{
"amount": "50.00",
"currency": "USD",
"locations": [
{
"id": "123",
"name": "Dupont Circle"
}
]
}
],
"address_line_one": "123 Main Street",
"address_line_two": "Apt 1",
"address_line_three": "Townland",
"address_sorting_code": "134-A",
"birth_date": "1936-08-18",
"city": "Jackson Hole",
"company_name": "Mariana Tek",
"completed_class_count": 99,
"country": "US",
"credit_cards": [
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"postal_code": "12345",
"state_province": "DC",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
],
"email": "wednesday@example.com",
"emergency_contact_email": "morticia@example.com",
"emergency_contact_name": "Morticia Addams",
"emergency_contact_phone": "123-456-7890",
"emergency_contact_relationship": "Mother",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"full_name": "Wednesday Addams",
"gender": "female",
"home_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"is_balance_used_for_fees": true,
"is_marketing_allowed": true,
"is_opted_in_to_sms": true,
"is_waiver_signed": true,
"join_datetime": "2018-08-23T08:09:59.124612Z",
"last_name": "Addams",
"postal_code": "83001",
"phone_number": "123-456-7890",
"profile_image": null,
"pronouns": "they/them",
"required_legal_documents": [
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false,
"is_signed": true,
"signed_datetime": "2021-08-23T08:09:59.124612Z",
"broker_id": "12345",
"source": "Customer Application",
"legal_document": "61a995e3-b484-485a-9799-b873a93e83c6"
}
],
"state_province": "Wyoming"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Success. | User |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Delete own user account
Code samples
# You can also use wget
curl -X DELETE /api/customer/v1/me/account \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {access-token}'
DELETE /api/customer/v1/me/account HTTP/1.1
Content-Type: application/json
const inputBody = '{
"current_password": "user_attempt_password"
}';
const headers = {
'Content-Type':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/account',
{
method: 'DELETE',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.delete '/api/customer/v1/me/account',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.delete('/api/customer/v1/me/account', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','/api/customer/v1/me/account', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/account");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("DELETE", "/api/customer/v1/me/account", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /api/customer/v1/me/account
Deleting a user's own account, requires the user to submit password to continue.
Body parameter
{
"current_password": "user_attempt_password"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | any | false | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Success. | None |
401 | Unauthorized | Authorization information is missing or invalid. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Upload a profile image
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/account/upload_profile_image \
-H 'Content-Type: multipart/form-data' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/account/upload_profile_image HTTP/1.1
Content-Type: multipart/form-data
Accept: application/json
const inputBody = '{
"profile_image_file": "/image/file.png"
}';
const headers = {
'Content-Type':'multipart/form-data',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/account/upload_profile_image',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'multipart/form-data',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/account/upload_profile_image',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'multipart/form-data',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/account/upload_profile_image', headers = headers)
print(r.json())
'multipart/form-data',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/account/upload_profile_image', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/account/upload_profile_image");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"multipart/form-data"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/account/upload_profile_image", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/account/upload_profile_image
Uploading a profile image to a user's account (as multipart/form-data
). Image file size should be no larger than 1MB. Supported file types - ico, gif, jpg, jpeg, png, svg.
Body parameter
profile_image_file: /image/file.png
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | UploadProfileImageRequest | false | none |
Example responses
200 Response
{
"id": "123",
"account_balance": [
{
"amount": "100.00",
"currency": "USD",
"locations": []
},
{
"amount": "50.00",
"currency": "USD",
"locations": [
{
"id": "123",
"name": "Dupont Circle"
}
]
}
],
"address_line_one": "123 Main Street",
"address_line_two": "Apt 1",
"address_line_three": "Townland",
"address_sorting_code": "134-A",
"birth_date": "1936-08-18",
"city": "Jackson Hole",
"company_name": "Mariana Tek",
"completed_class_count": 99,
"country": "US",
"credit_cards": [
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"postal_code": "12345",
"state_province": "DC",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
],
"email": "wednesday@example.com",
"emergency_contact_email": "morticia@example.com",
"emergency_contact_name": "Morticia Addams",
"emergency_contact_phone": "123-456-7890",
"emergency_contact_relationship": "Mother",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"full_name": "Wednesday Addams",
"gender": "female",
"home_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"is_balance_used_for_fees": true,
"is_marketing_allowed": true,
"is_opted_in_to_sms": true,
"is_waiver_signed": true,
"join_datetime": "2018-08-23T08:09:59.124612Z",
"last_name": "Addams",
"postal_code": "83001",
"phone_number": "123-456-7890",
"profile_image": null,
"pronouns": "they/them",
"required_legal_documents": [
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false,
"is_signed": true,
"signed_datetime": "2021-08-23T08:09:59.124612Z",
"broker_id": "12345",
"source": "Customer Application",
"legal_document": "61a995e3-b484-485a-9799-b873a93e83c6"
}
],
"state_province": "Wyoming"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | User |
401 | Unauthorized | Authorization information is missing or invalid. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Update communication preferences
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/account/update_communications_preferences \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/account/update_communications_preferences HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"marketing_type": "sms",
"opt_in_value": true,
"phone_number": "123-456-7890",
"marketing_log_source": "System reprompt",
"opt_in_copy": "By selecting this option, you agree to receive marketing communications via text."
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/account/update_communications_preferences',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/account/update_communications_preferences',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/account/update_communications_preferences', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/account/update_communications_preferences', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/account/update_communications_preferences");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/account/update_communications_preferences", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/account/update_communications_preferences
Opt a user in or out of SMS communications.
Body parameter
{
"marketing_type": "sms",
"opt_in_value": true,
"phone_number": "123-456-7890",
"marketing_log_source": "System reprompt",
"opt_in_copy": "By selecting this option, you agree to receive marketing communications via text."
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | UpdateCommunicationsPreferencesRequest | true | none |
Example responses
200 Response
{
"id": "123",
"account_balance": [
{
"amount": "100.00",
"currency": "USD",
"locations": []
},
{
"amount": "50.00",
"currency": "USD",
"locations": [
{
"id": "123",
"name": "Dupont Circle"
}
]
}
],
"address_line_one": "123 Main Street",
"address_line_two": "Apt 1",
"address_line_three": "Townland",
"address_sorting_code": "134-A",
"birth_date": "1936-08-18",
"city": "Jackson Hole",
"company_name": "Mariana Tek",
"completed_class_count": 99,
"country": "US",
"credit_cards": [
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"postal_code": "12345",
"state_province": "DC",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
],
"email": "wednesday@example.com",
"emergency_contact_email": "morticia@example.com",
"emergency_contact_name": "Morticia Addams",
"emergency_contact_phone": "123-456-7890",
"emergency_contact_relationship": "Mother",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"full_name": "Wednesday Addams",
"gender": "female",
"home_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"is_balance_used_for_fees": true,
"is_marketing_allowed": true,
"is_opted_in_to_sms": true,
"is_waiver_signed": true,
"join_datetime": "2018-08-23T08:09:59.124612Z",
"last_name": "Addams",
"postal_code": "83001",
"phone_number": "123-456-7890",
"profile_image": null,
"pronouns": "they/them",
"required_legal_documents": [
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false,
"is_signed": true,
"signed_datetime": "2021-08-23T08:09:59.124612Z",
"broker_id": "12345",
"source": "Customer Application",
"legal_document": "61a995e3-b484-485a-9799-b873a93e83c6"
}
],
"state_province": "Wyoming"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | User |
401 | Unauthorized | Authorization information is missing or invalid. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Get user achievements
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/achievements \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/achievements HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/achievements',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/achievements',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/achievements', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/achievements', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/achievements");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/achievements", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/achievements
View achievement details for the current user.
Example responses
200 Response
{
"classes_completed": 3,
"instructors_taken": 2,
"member_since": "2020-09-21T20:06:02.099891Z",
"most_visited_studio": "North Boulder",
"number_of_studios_visited": 1
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | UserAchievements |
401 | Unauthorized | Authorization information is missing or invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Payment Methods
View and manage credit cards and gift cards for the current user.
List countries
Code samples
# You can also use wget
curl -X GET /api/customer/v1/countries \
-H 'Accept: application/json'
GET /api/customer/v1/countries HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/countries',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/countries',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/countries', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/countries', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/countries");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/countries", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/countries
View a list of countries that can be associated with user addresses.
Example responses
200 Response
{
"results": [
{
"iso_3166_1_a2": "US",
"iso_3166_1_a3": "USA",
"name": "United States of America",
"printable_name": "United States",
"address_format": {
"address_fields": [
{
"field": "address_line_one",
"label": "Address Line 1"
},
{
"field": "address_line_two",
"label": "Address Line 2"
},
{
"field": "city",
"label": "City"
},
{
"field": "state_province",
"label": "State"
},
{
"field": "postal_code",
"label": "ZIP Code"
}
]
}
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | CountryList |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve a country
Code samples
# You can also use wget
curl -X GET /api/customer/v1/countries/{iso_3166_1_a2} \
-H 'Accept: application/json'
GET /api/customer/v1/countries/{iso_3166_1_a2} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/countries/{iso_3166_1_a2}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/countries/{iso_3166_1_a2}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/countries/{iso_3166_1_a2}', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/countries/{iso_3166_1_a2}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/countries/{iso_3166_1_a2}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/countries/{iso_3166_1_a2}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/countries/{iso_3166_1_a2}
View information about a single country.
Example responses
200 Response
{
"iso_3166_1_a2": "US",
"iso_3166_1_a3": "USA",
"name": "United States of America",
"printable_name": "United States",
"address_format": {
"address_fields": [
{
"field": "address_line_one",
"label": "Address Line 1"
},
{
"field": "address_line_two",
"label": "Address Line 2"
},
{
"field": "city",
"label": "City"
},
{
"field": "state_province",
"label": "State"
},
{
"field": "postal_code",
"label": "ZIP Code"
}
]
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Country |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Redeem a gift card
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/account/redeem_giftcard \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/account/redeem_giftcard HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"redemption_code": "COOLCODE"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/account/redeem_giftcard',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/account/redeem_giftcard',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/account/redeem_giftcard', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/account/redeem_giftcard', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/account/redeem_giftcard");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/account/redeem_giftcard", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/account/redeem_giftcard
Redeeming a gift card will add the full value of the card with the matching redemption code to the user's account balance.
Body parameter
{
"redemption_code": "COOLCODE"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | any | false | none |
Example responses
200 Response
{
"id": "123",
"account_balance": [
{
"amount": "100.00",
"currency": "USD",
"locations": []
},
{
"amount": "50.00",
"currency": "USD",
"locations": [
{
"id": "123",
"name": "Dupont Circle"
}
]
}
],
"address_line_one": "123 Main Street",
"address_line_two": "Apt 1",
"address_line_three": "Townland",
"address_sorting_code": "134-A",
"birth_date": "1936-08-18",
"city": "Jackson Hole",
"company_name": "Mariana Tek",
"completed_class_count": 99,
"country": "US",
"credit_cards": [
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"postal_code": "12345",
"state_province": "DC",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
],
"email": "wednesday@example.com",
"emergency_contact_email": "morticia@example.com",
"emergency_contact_name": "Morticia Addams",
"emergency_contact_phone": "123-456-7890",
"emergency_contact_relationship": "Mother",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"full_name": "Wednesday Addams",
"gender": "female",
"home_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"is_balance_used_for_fees": true,
"is_marketing_allowed": true,
"is_opted_in_to_sms": true,
"is_waiver_signed": true,
"join_datetime": "2018-08-23T08:09:59.124612Z",
"last_name": "Addams",
"postal_code": "83001",
"phone_number": "123-456-7890",
"profile_image": null,
"pronouns": "they/them",
"required_legal_documents": [
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false,
"is_signed": true,
"signed_datetime": "2021-08-23T08:09:59.124612Z",
"broker_id": "12345",
"source": "Customer Application",
"legal_document": "61a995e3-b484-485a-9799-b873a93e83c6"
}
],
"state_province": "Wyoming"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | User |
401 | Unauthorized | Authorization information is missing or invalid. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
List saved credit cards
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/credit_cards \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/credit_cards HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/credit_cards',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/credit_cards',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/credit_cards', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/credit_cards', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/credit_cards");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/credit_cards", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/credit_cards
Get a paginated list of the current user's saved credit cards.
Example responses
200 Response
{
"results": [
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"postal_code": "12345",
"state_province": "DC",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | CreditCardList |
401 | Unauthorized | Authorization information is missing or invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Add a new credit card
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/credit_cards \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/credit_cards HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"ccv": "123",
"expiration_month": "11",
"expiration_year": "2030",
"name": "Tommy Napkin",
"number": "4111111111111111",
"postal_code": "12345",
"usage_location": "9876",
"card_type": "visa",
"partner_reference": "1"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/credit_cards',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/credit_cards',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/credit_cards', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/credit_cards', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/credit_cards");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/credit_cards", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/credit_cards
Save a credit card to the current user's account that can be used for future purchases.
Body parameter
{
"ccv": "123",
"expiration_month": "11",
"expiration_year": "2030",
"name": "Tommy Napkin",
"number": "4111111111111111",
"postal_code": "12345",
"usage_location": "9876",
"card_type": "visa",
"partner_reference": "1"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | any | false | none |
Example responses
201 Response
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"postal_code": "12345",
"state_province": "DC",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Success. | CreditCard |
401 | Unauthorized | Authorization information is missing or invalid. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Update a credit card
Code samples
# You can also use wget
curl -X PATCH /api/customer/v1/me/credit_cards/{credit_card_id} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
PATCH /api/customer/v1/me/credit_cards/{credit_card_id} HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"postal_code": "98765"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/credit_cards/{credit_card_id}',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch '/api/customer/v1/me/credit_cards/{credit_card_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('/api/customer/v1/me/credit_cards/{credit_card_id}', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','/api/customer/v1/me/credit_cards/{credit_card_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/credit_cards/{credit_card_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "/api/customer/v1/me/credit_cards/{credit_card_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
PATCH /api/customer/v1/me/credit_cards/{credit_card_id}
Update the billing address details for a saved credit card. To update fields unrelated to the billing address, such as expiration month, you'll need to delete this card and add a new one.
Body parameter
{
"postal_code": "98765"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | any | false | none |
Example responses
200 Response
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"postal_code": "12345",
"state_province": "DC",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | CreditCard |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve a credit card
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/credit_cards/{credit_card_id} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/credit_cards/{credit_card_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/credit_cards/{credit_card_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/credit_cards/{credit_card_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/credit_cards/{credit_card_id}', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/credit_cards/{credit_card_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/credit_cards/{credit_card_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/credit_cards/{credit_card_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/credit_cards/{credit_card_id}
Retrieve one of the current user's saved credit cards.
Example responses
200 Response
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"postal_code": "12345",
"state_province": "DC",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | CreditCard |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Delete a credit card
Code samples
# You can also use wget
curl -X DELETE /api/customer/v1/me/credit_cards/{credit_card_id} \
-H 'Authorization: Bearer {access-token}'
DELETE /api/customer/v1/me/credit_cards/{credit_card_id} HTTP/1.1
const headers = {
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/credit_cards/{credit_card_id}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.delete '/api/customer/v1/me/credit_cards/{credit_card_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Authorization': 'Bearer {access-token}'
}
r = requests.delete('/api/customer/v1/me/credit_cards/{credit_card_id}', headers = headers)
print(r.json())
'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','/api/customer/v1/me/credit_cards/{credit_card_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/credit_cards/{credit_card_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("DELETE", "/api/customer/v1/me/credit_cards/{credit_card_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
DELETE /api/customer/v1/me/credit_cards/{credit_card_id}
Remove one of the current user's saved credit cards from their account. This action will not be allowed if a user has an active membership.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Success. | None |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Regions & Locations
A location is a physical or virtual studio where classes take place. A region is a collection of studios which are typically in a similar geographic area. It can be helpful to use locations and regions as filters so that users only see the most relevant data.
List locations
Code samples
# You can also use wget
curl -X GET /api/customer/v1/locations \
-H 'Accept: application/json'
GET /api/customer/v1/locations HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/locations',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/locations',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/locations', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/locations', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/locations", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/locations
View details about each of the active locations at a brand.
Example responses
200 Response
{
"results": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | LocationList |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve a location
Code samples
# You can also use wget
curl -X GET /api/customer/v1/locations/{location_id} \
-H 'Accept: application/json'
GET /api/customer/v1/locations/{location_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/locations/{location_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/locations/{location_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/locations/{location_id}', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/locations/{location_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/locations/{location_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/locations/{location_id}
View details about a single location.
Example responses
200 Response
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | LocationWithRegion |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
List regions
Code samples
# You can also use wget
curl -X GET /api/customer/v1/regions \
-H 'Accept: application/json'
GET /api/customer/v1/regions HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/regions',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/regions',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/regions', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/regions', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/regions");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/regions", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/regions
View details about active regions and each of their locations.
Example responses
200 Response
{
"results": [
{
"id": "123",
"name": "Washington, DC",
"locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | RegionList |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve a region
Code samples
# You can also use wget
curl -X GET /api/customer/v1/regions/{region_id} \
-H 'Accept: application/json'
GET /api/customer/v1/regions/{region_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/regions/{region_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/regions/{region_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/regions/{region_id}', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/regions/{region_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/regions/{region_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/regions/{region_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/regions/{region_id}
View details about a single region.
Example responses
200 Response
{
"id": "123",
"name": "Washington, DC",
"locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Region |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Class Schedules
Information about upcoming and historical classes.
List classes
Code samples
# You can also use wget
curl -X GET /api/customer/v1/classes \
-H 'Accept: application/json'
GET /api/customer/v1/classes HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/classes',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/classes',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/classes', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/classes', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/classes");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/classes", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/classes
View a paginated list of classes. Does not include private classes.
Filter the class list using a chain of one or more of the following query parameters min_start_date
, max_start_date
, min_start_time
, max_start_time
, region
, location
, is_live_stream
, classroom
, instructor
.
eg. api/customer/v1/classes?location={location_id}&max_start_date={datetime_string}
Example responses
200 Response
{
"results": [
{
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3,
"reservations": [
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3
}
]
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | ClassList |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve a class
Code samples
# You can also use wget
curl -X GET /api/customer/v1/classes/{class_id} \
-H 'Accept: application/json'
GET /api/customer/v1/classes/{class_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/classes/{class_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/classes/{class_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/classes/{class_id}', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/classes/{class_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/classes/{class_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/classes/{class_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/classes/{class_id}
View details about a single class. If this is a pick-a-spot class, the response will include layout data that can be used to render a map of the class.
Example responses
200 Response
{
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3,
"reservations": [
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3
}
],
"layout": {
"id": "1278",
"name": "Big Spin Layout",
"spots": [
{
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0,
"is_available": true
}
]
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | ClassWithReservationsAndLayout |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Get schedule filters for a location
Code samples
# You can also use wget
curl -X GET /api/customer/v1/locations/{location_id}/schedule_filters \
-H 'Accept: application/json'
GET /api/customer/v1/locations/{location_id}/schedule_filters HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/locations/{location_id}/schedule_filters',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/locations/{location_id}/schedule_filters',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/locations/{location_id}/schedule_filters', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/locations/{location_id}/schedule_filters', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/schedule_filters");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/locations/{location_id}/schedule_filters", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/locations/{location_id}/schedule_filters
View the class types, classrooms, and instructors for all classes at this location.
Example responses
200 Response
{
"class_types": [
{
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
}
],
"classrooms": [
{
"id": "678",
"name": "Spin Room"
}
],
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | ScheduleFilters |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Get schedule filters for a region
Code samples
# You can also use wget
curl -X GET /api/customer/v1/regions/{region_id}/schedule_filters \
-H 'Accept: application/json'
GET /api/customer/v1/regions/{region_id}/schedule_filters HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/regions/{region_id}/schedule_filters',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/regions/{region_id}/schedule_filters',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/regions/{region_id}/schedule_filters', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/regions/{region_id}/schedule_filters', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/regions/{region_id}/schedule_filters");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/regions/{region_id}/schedule_filters", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/regions/{region_id}/schedule_filters
View the class types, classrooms, and instructors for all classes in this region.
Example responses
200 Response
{
"class_types": [
{
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
}
],
"classrooms": [
{
"id": "678",
"name": "Spin Room"
}
],
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | ScheduleFilters |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
List locations with schedule details
Code samples
# You can also use wget
curl -X GET /api/customer/v1/schedule_locations \
-H 'Accept: application/json'
GET /api/customer/v1/schedule_locations HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/schedule_locations',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/schedule_locations',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/schedule_locations', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/schedule_locations', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/schedule_locations");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/schedule_locations", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/schedule_locations
View a list of active locations along with information relevant to their class schedules.
Example responses
200 Response
{
"results": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
},
"class_types": [
{
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
}
],
"classrooms": [
{
"id": "678",
"name": "Spin Room"
}
],
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
]
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | ScheduleLocationList |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve a location with schedule details
Code samples
# You can also use wget
curl -X GET /api/customer/v1/schedule_locations/{location_id} \
-H 'Accept: application/json'
GET /api/customer/v1/schedule_locations/{location_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/schedule_locations/{location_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/schedule_locations/{location_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/schedule_locations/{location_id}', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/schedule_locations/{location_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/schedule_locations/{location_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/schedule_locations/{location_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/schedule_locations/{location_id}
Get details about a single location along with information needed to display its class schedule, including class types, classrooms, and instructors.
Example responses
200 Response
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
},
"class_types": [
{
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
}
],
"classrooms": [
{
"id": "678",
"name": "Spin Room"
}
],
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | ScheduleLocation |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
List regions with schedule details
Code samples
# You can also use wget
curl -X GET /api/customer/v1/schedule_regions \
-H 'Accept: application/json'
GET /api/customer/v1/schedule_regions HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/schedule_regions',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/schedule_regions',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/schedule_regions', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/schedule_regions', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/schedule_regions");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/schedule_regions", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/schedule_regions
View a list of active regions along with information relevant to their class schedules.
Example responses
200 Response
{
"results": [
{
"id": "123",
"name": "Washington, DC",
"locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
],
"class_types": [
{
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
}
],
"classrooms": [
{
"id": "678",
"name": "Spin Room"
}
],
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
]
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | ScheduleRegionList |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve a region with schedule details
Code samples
# You can also use wget
curl -X GET /api/customer/v1/schedule_regions/{region_id} \
-H 'Accept: application/json'
GET /api/customer/v1/schedule_regions/{region_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/schedule_regions/{region_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/schedule_regions/{region_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/schedule_regions/{region_id}', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/schedule_regions/{region_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/schedule_regions/{region_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/schedule_regions/{region_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/schedule_regions/{region_id}
Get details about a single region along with information needed to display its class schedule, including class types, classrooms, and instructors.
Example responses
200 Response
{
"id": "123",
"name": "Washington, DC",
"locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
],
"class_types": [
{
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
}
],
"classrooms": [
{
"id": "678",
"name": "Spin Room"
}
],
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | ScheduleRegion |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Class Payment Options
View the credits and memberships that the user has on file to book classes.
Get class payment options
Code samples
# You can also use wget
curl -X GET /api/customer/v1/classes/{class_id}/payment_options \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/classes/{class_id}/payment_options HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/classes/{class_id}/payment_options',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/classes/{class_id}/payment_options',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/classes/{class_id}/payment_options', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/classes/{class_id}/payment_options', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/classes/{class_id}/payment_options");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/classes/{class_id}/payment_options", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/classes/{class_id}/payment_options
View all of the payment options the user currently has that can be used to book into this class. Each payment option listed will either be a membership or a credit, and will contain either nested membership payment data or nested credit payment data respectively. If an error message is present, then the payment option cannot be used towards this class for a reason that should be visible to the user. If no user is authenticated, the lists of available payment options will be empty.
Example responses
200 Response
{
"user_payment_options": [
{
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
],
"guest_payment_options": [
{
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | PaymentOptions |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
List credits
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/credits \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/credits HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/credits',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/credits',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/credits', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/credits', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/credits");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/credits", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/credits
View all credit packages that the user has purchased. To filter out credits that can no longer be used, use the query parameter is_active=True
. Similarly, the query parameter is_active=False
will return only packages that have been completely used or have expired.
Example responses
200 Response
{
"results": [
{
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | CreditList |
401 | Unauthorized | Authorization information is missing or invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve a credit
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/credits/{credit_id} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/credits/{credit_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/credits/{credit_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/credits/{credit_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/credits/{credit_id}', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/credits/{credit_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/credits/{credit_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/credits/{credit_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/credits/{credit_id}
View details about a single credit package belonging to the current user.
Example responses
200 Response
{
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Credit |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
List memberships
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/memberships \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/memberships HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/memberships',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/memberships',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/memberships', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/memberships', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/memberships");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/memberships", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/memberships
View all memberships that the current user has purchased. To filter out memberships that can no longer be used, use the query parameter is_active=True
. Similarly, the query parameter is_active=False
will return only memberships that have expired.
Example responses
200 Response
{
"results": [
{
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | MembershipList |
401 | Unauthorized | Authorization information is missing or invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve a membership
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/memberships/{membership_id} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/memberships/{membership_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/memberships/{membership_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/memberships/{membership_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/memberships/{membership_id}', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/memberships/{membership_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/memberships/{membership_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/memberships/{membership_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/memberships/{membership_id}
View details about a single membership belonging to the current user.
Example responses
200 Response
{
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Membership |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Reservations
View and manage reservation details for the current user.
Create a reservation
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/reservations \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/reservations HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"reservation_type": "standard",
"is_booked_for_me": true,
"class_session": {
"id": "123"
},
"payment_option": {
"id": "credit-456"
}
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/reservations',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/reservations', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/reservations', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/reservations", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/reservations
NOTE: The Customer API docs only support displaying one example. Please review ReservationRequestBody
to view all available parameters and options.
reservation_type
accepts one of three defined values: standard
, standby
, and waitlist
.
guest_email
is optional and should only be sent when is_booked_for_me
is set to true
.
A spot
object is only needed when creating a reservation for a pick-a-spot class.
Body parameter
{
"reservation_type": "standard",
"is_booked_for_me": true,
"class_session": {
"id": "123"
},
"payment_option": {
"id": "credit-456"
}
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | ReservationRequestBody | true | none |
Example responses
200 Response
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3,
"are_add_ons_available": true,
"booked_by": "Wednesday Addams",
"class_session": {
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3
},
"guest_email": "pugsley@example.com",
"is_change_spots_enabled": false,
"is_upcoming": false,
"live_stream_url": "https://meet.google.com/abc-def-ghi",
"live_stream_window": 20,
"payment_option": {
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Reservation |
401 | Unauthorized | Authorization information is missing or invalid. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
List reservations
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/reservations \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/reservations HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/reservations',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/reservations', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/reservations', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/reservations", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/reservations
View details about this user's reservation history.
Example responses
200 Response
{
"results": [
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3,
"are_add_ons_available": true,
"booked_by": "Wednesday Addams",
"class_session": {
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3
},
"guest_email": "pugsley@example.com",
"is_change_spots_enabled": false,
"is_upcoming": false,
"live_stream_url": "https://meet.google.com/abc-def-ghi",
"live_stream_window": 20,
"payment_option": {
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | ReservationList |
401 | Unauthorized | Authorization information is missing or invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve a reservation
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/reservations/{reservation_id} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/reservations/{reservation_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations/{reservation_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/reservations/{reservation_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/reservations/{reservation_id}', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/reservations/{reservation_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations/{reservation_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/reservations/{reservation_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/reservations/{reservation_id}
View details about one of the current user's reservations.
Example responses
200 Response
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3,
"are_add_ons_available": true,
"booked_by": "Wednesday Addams",
"class_session": {
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3
},
"guest_email": "pugsley@example.com",
"is_change_spots_enabled": false,
"is_upcoming": false,
"live_stream_url": "https://meet.google.com/abc-def-ghi",
"live_stream_window": 20,
"payment_option": {
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Reservation |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Cancel a reservation
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/reservations/{reservation_id}/cancel \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/reservations/{reservation_id}/cancel HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations/{reservation_id}/cancel',
{
method: 'POST',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/reservations/{reservation_id}/cancel',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/reservations/{reservation_id}/cancel', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/reservations/{reservation_id}/cancel', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations/{reservation_id}/cancel");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/reservations/{reservation_id}/cancel", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/reservations/{reservation_id}/cancel
Cancel a reservation previously booked by the current user.
Example responses
200 Response
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3,
"are_add_ons_available": true,
"booked_by": "Wednesday Addams",
"class_session": {
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3
},
"guest_email": "pugsley@example.com",
"is_change_spots_enabled": false,
"is_upcoming": false,
"live_stream_url": "https://meet.google.com/abc-def-ghi",
"live_stream_window": 20,
"payment_option": {
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Reservation |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Get cancel penalty details
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/reservations/{reservation_id}/cancel_penalty \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/reservations/{reservation_id}/cancel_penalty HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations/{reservation_id}/cancel_penalty',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/reservations/{reservation_id}/cancel_penalty',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/reservations/{reservation_id}/cancel_penalty', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/reservations/{reservation_id}/cancel_penalty', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations/{reservation_id}/cancel_penalty");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/reservations/{reservation_id}/cancel_penalty", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/reservations/{reservation_id}/cancel_penalty
Check whether the user will incur a penalty if they choose to cancel at the current time. Users should always be notified if there is a cancellation fee.
Example responses
200 Response
{
"is_penalty_cancel": true,
"message": "You will lose a credit for cancelling this reservation."
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | CancelPenalty |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Check-in a reservation
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/reservations/{reservation_id}/check_in \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/reservations/{reservation_id}/check_in HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations/{reservation_id}/check_in',
{
method: 'POST',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/reservations/{reservation_id}/check_in',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/reservations/{reservation_id}/check_in', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/reservations/{reservation_id}/check_in', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations/{reservation_id}/check_in");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/reservations/{reservation_id}/check_in", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/reservations/{reservation_id}/check_in
Check-in the user for a previously booked reservation. If geo check-in is enabled for a tenant, check-in actions are validated against the associated class session's geo check-in window.
Example responses
200 Response
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3,
"are_add_ons_available": true,
"booked_by": "Wednesday Addams",
"class_session": {
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3
},
"guest_email": "pugsley@example.com",
"is_change_spots_enabled": false,
"is_upcoming": false,
"live_stream_url": "https://meet.google.com/abc-def-ghi",
"live_stream_window": 20,
"payment_option": {
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Reservation |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Swap spots for a reservation
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/reservations/{reservation_id}/swap_spots \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/reservations/{reservation_id}/swap_spots HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"spot": "101"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations/{reservation_id}/swap_spots',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/reservations/{reservation_id}/swap_spots',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/reservations/{reservation_id}/swap_spots', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/reservations/{reservation_id}/swap_spots', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations/{reservation_id}/swap_spots");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/reservations/{reservation_id}/swap_spots", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/reservations/{reservation_id}/swap_spots
For a given reservation, swap its current spot with a different spot.
Body parameter
{
"spot": "101"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | any | true | The spot ID of the spot the user is swapping into. |
Example responses
200 Response
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3,
"are_add_ons_available": true,
"booked_by": "Wednesday Addams",
"class_session": {
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3
},
"guest_email": "pugsley@example.com",
"is_change_spots_enabled": false,
"is_upcoming": false,
"live_stream_url": "https://meet.google.com/abc-def-ghi",
"live_stream_window": 20,
"payment_option": {
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Reservation |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Buy Pages
Data to display products and promotions that can be purchased at a location.
Retrieve a buy page
Code samples
# You can also use wget
curl -X GET /api/customer/v1/locations/{location_id}/buy-page \
-H 'Accept: application/json'
GET /api/customer/v1/locations/{location_id}/buy-page HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/locations/{location_id}/buy-page',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/locations/{location_id}/buy-page',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/locations/{location_id}/buy-page', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/locations/{location_id}/buy-page', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/buy-page");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/locations/{location_id}/buy-page", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/locations/{location_id}/buy-page
Retrieve data for the buy page associated with this location.
Example responses
200 Response
{
"id": "123",
"buy_page_sections": [
{
"id": "123",
"name": "Intro Offers",
"product_listings": [
{
"id": "123",
"banner": "New Item!!",
"currency_code": "USD",
"description": "Farm to table credits to get you into class.",
"is_in_stock": true,
"is_live_stream": true,
"is_promoted": true,
"is_valid_promo_for_user": true,
"name": "Farm to Table Credit",
"num_in_stock": 20,
"price": 200,
"price_incl_tax": 220,
"product_type": "credits",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
]
}
],
"name": "New York Buy Page"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | BuyPage |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Add-Ons Buy Pages
Data to display products and promotions that can be purchased at a location when associated with a reservation.
Retrieve an add-ons buy page
Code samples
# You can also use wget
curl -X GET /api/customer/v1/locations/{location_id}/add_ons_buy_page \
-H 'Accept: application/json'
GET /api/customer/v1/locations/{location_id}/add_ons_buy_page HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/locations/{location_id}/add_ons_buy_page',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/locations/{location_id}/add_ons_buy_page',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/locations/{location_id}/add_ons_buy_page', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/locations/{location_id}/add_ons_buy_page', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/add_ons_buy_page");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/locations/{location_id}/add_ons_buy_page", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/locations/{location_id}/add_ons_buy_page
Retrieve data for the add-ons buy page associated with this location without specifying its ID.
Example responses
200 Response
{
"id": "123",
"buy_page_sections": [
{
"id": "123",
"name": "Intro Offers",
"product_listings": [
{
"id": "123",
"banner": "New Item!!",
"currency_code": "USD",
"description": "Farm to table credits to get you into class.",
"is_in_stock": true,
"is_live_stream": true,
"is_promoted": true,
"is_valid_promo_for_user": true,
"name": "Farm to Table Credit",
"num_in_stock": 20,
"price": 200,
"price_incl_tax": 220,
"product_type": "credits",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false,
"variants": [
{
"id": "123",
"currency_code": "USD",
"is_in_stock": true,
"num_in_stock": 1,
"price": 9.99,
"price_incl_tax": "10.99",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
]
}
]
}
],
"name": "Add-Ons Buy Page"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | AddOnsBuyPage |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve an add-ons buy page by ID
Code samples
# You can also use wget
curl -X GET /api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id} \
-H 'Accept: application/json'
GET /api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}
Retrieve data for the add-ons buy page associated with this location by its ID.
Example responses
200 Response
{
"id": "123",
"buy_page_sections": [
{
"id": "123",
"name": "Intro Offers",
"product_listings": [
{
"id": "123",
"banner": "New Item!!",
"currency_code": "USD",
"description": "Farm to table credits to get you into class.",
"is_in_stock": true,
"is_live_stream": true,
"is_promoted": true,
"is_valid_promo_for_user": true,
"name": "Farm to Table Credit",
"num_in_stock": 20,
"price": 200,
"price_incl_tax": 220,
"product_type": "credits",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false,
"variants": [
{
"id": "123",
"currency_code": "USD",
"is_in_stock": true,
"num_in_stock": 1,
"price": 9.99,
"price_incl_tax": "10.99",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
]
}
]
}
],
"name": "Add-Ons Buy Page"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | AddOnsBuyPage |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve an add-ons buy page section by ID
Code samples
# You can also use wget
curl -X GET /api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id} \
-H 'Accept: application/json'
GET /api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}
Retrieve data for a section of an add-ons buy page by ID.
Example responses
200 Response
{
"id": "123",
"name": "Intro Offers",
"product_listings": [
{
"id": "123",
"banner": "New Item!!",
"currency_code": "USD",
"description": "Farm to table credits to get you into class.",
"is_in_stock": true,
"is_live_stream": true,
"is_promoted": true,
"is_valid_promo_for_user": true,
"name": "Farm to Table Credit",
"num_in_stock": 20,
"price": 200,
"price_incl_tax": 220,
"product_type": "credits",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false,
"variants": [
{
"id": "123",
"currency_code": "USD",
"is_in_stock": true,
"num_in_stock": 1,
"price": 9.99,
"price_incl_tax": "10.99",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
]
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | AddOnsBuyPageSection |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve an add-ons product listing by ID
Code samples
# You can also use wget
curl -X GET /api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id} \
-H 'Accept: application/json'
GET /api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}
Retrieve data for a product listing within a section of an add-ons buy page by ID.
Example responses
200 Response
{
"id": "123",
"banner": "New Item!!",
"currency_code": "USD",
"description": "Farm to table credits to get you into class.",
"is_in_stock": true,
"is_live_stream": true,
"is_promoted": true,
"is_valid_promo_for_user": true,
"name": "Farm to Table Credit",
"num_in_stock": 20,
"price": 200,
"price_incl_tax": 220,
"product_type": "credits",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false,
"variants": [
{
"id": "123",
"currency_code": "USD",
"is_in_stock": true,
"num_in_stock": 1,
"price": 9.99,
"price_incl_tax": "10.99",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | AddOnsBuyPageProductListingWithVariants |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve variants for an add-ons product listing
Code samples
# You can also use wget
curl -X GET /api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}/variants \
-H 'Accept: application/json'
GET /api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}/variants HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json'
};
fetch('/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}/variants',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get '/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}/variants',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}/variants', headers = headers)
print(r.json())
'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}/variants', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}/variants");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}/variants", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/locations/{location_id}/add_ons_buy_page/{buy_page_id}/section/{section_id}/product_listing/{product_listing_id}/variants
Retrieve data for the variants of a product listing on an add-ons buy page.
Example responses
200 Response
{
"id": "123",
"banner": "New Item!!",
"currency_code": "USD",
"description": "Farm to table credits to get you into class.",
"is_in_stock": true,
"is_live_stream": true,
"is_promoted": true,
"is_valid_promo_for_user": true,
"name": "Farm to Table Credit",
"num_in_stock": 20,
"price": 200,
"price_incl_tax": 220,
"product_type": "credits",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false,
"variants": [
{
"id": "123",
"currency_code": "USD",
"is_in_stock": true,
"num_in_stock": 1,
"price": 9.99,
"price_incl_tax": "10.99",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | AddOnsBuyPageProductListingWithVariants |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Carts
View and manage open carts for the current user.
Get an open cart
Code samples
# You can also use wget
curl -X GET /api/customer/v1/locations/{location_id}/cart \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/locations/{location_id}/cart HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/locations/{location_id}/cart',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/locations/{location_id}/cart',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/locations/{location_id}/cart', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/locations/{location_id}/cart', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/cart");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/locations/{location_id}/cart", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/locations/{location_id}/cart
Retrieve an open cart for the current user relevant to the given location.
Example responses
200 Response
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 200,
"deferred_item_total_incl_tax": 200,
"discounts": [
{
"name": "10% Off",
"amount": "19.99",
"code": "TAKE10",
"is_automatic": false
}
],
"has_deferred_payments": true,
"is_charged_immediately": true,
"line_items": [
{
"id": "2345",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": true,
"display_message": "$200.00, plus applicable taxes and discounts, will be charged on January 1, 2025.",
"gift_card_options": null,
"is_payment_deferred": true,
"line_subtotal": 200,
"line_subtotal_incl_tax": "230.00",
"line_total": "230.00",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 1,
"required_purchase_agreement_count_for_product": 1,
"signed_purchase_agreement_count": 1,
"unit_price": "200.00",
"unit_price_incl_tax": "230.00",
"variant": {
"id": "3434",
"name": "Future-Activated Membership",
"display_attributes": ""
}
},
{
"id": "3456",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 199.98,
"line_subtotal_incl_tax": "229.98",
"line_total": "206.99",
"pending_purchase_agreement_count": 1,
"quantity": 2,
"required_purchase_agreement_count_for_line": 2,
"required_purchase_agreement_count_for_product": 1,
"signed_purchase_agreement_count": 1,
"unit_price": "99.99",
"unit_price_incl_tax": "114.99",
"variant": {
"id": "5656",
"name": "10 Guest Only Credits",
"display_attributes": ""
}
},
{
"id": "4567",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": {
"recipient_email": "best@friend.com",
"recipient_name": "My Best Friend",
"message": "Work out with me!"
},
"is_payment_deferred": false,
"line_subtotal": 50,
"line_subtotal_incl_tax": "50.00",
"line_total": "50.00",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "50.00",
"unit_price_incl_tax": "50.00",
"variant": {
"id": "7878",
"name": "$50 Email Gift Card",
"display_attributes": ""
}
}
],
"payment_gateway_type": "stripe",
"pending_purchase_agreement_count": 1,
"required_purchase_agreement_count": 3,
"requires_new_saved_card": true,
"should_display_price_incl_tax": false,
"signed_purchase_agreement_count": 2,
"subtotal": "249.98",
"subtotal_incl_tax": "279.98",
"taxes": [
{
"name": "Gritty City Tax",
"amount": "9.00"
},
{
"name": "Great State Tax",
"amount": "18.00"
}
],
"total": "256.99",
"total_discount": "19.99",
"total_tax": "27.00"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Cart |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Add a product listing
Code samples
# You can also use wget
curl -X POST /api/customer/v1/locations/{location_id}/cart/add_product_listing \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/locations/{location_id}/cart/add_product_listing HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"product_listing_id": "credits-123",
"quantity": 1
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/locations/{location_id}/cart/add_product_listing',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/locations/{location_id}/cart/add_product_listing',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/locations/{location_id}/cart/add_product_listing', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/locations/{location_id}/cart/add_product_listing', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/cart/add_product_listing");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/locations/{location_id}/cart/add_product_listing", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/locations/{location_id}/cart/add_product_listing
Add a product listing to the current user's open cart.
Body parameter
{
"product_listing_id": "credits-123",
"quantity": 1
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
Example responses
200 Response
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 200,
"deferred_item_total_incl_tax": 200,
"discounts": [
{
"name": "10% Off",
"amount": "19.99",
"code": "TAKE10",
"is_automatic": false
}
],
"has_deferred_payments": true,
"is_charged_immediately": true,
"line_items": [
{
"id": "2345",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": true,
"display_message": "$200.00, plus applicable taxes and discounts, will be charged on January 1, 2025.",
"gift_card_options": null,
"is_payment_deferred": true,
"line_subtotal": 200,
"line_subtotal_incl_tax": "230.00",
"line_total": "230.00",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 1,
"required_purchase_agreement_count_for_product": 1,
"signed_purchase_agreement_count": 1,
"unit_price": "200.00",
"unit_price_incl_tax": "230.00",
"variant": {
"id": "3434",
"name": "Future-Activated Membership",
"display_attributes": ""
}
},
{
"id": "3456",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 199.98,
"line_subtotal_incl_tax": "229.98",
"line_total": "206.99",
"pending_purchase_agreement_count": 1,
"quantity": 2,
"required_purchase_agreement_count_for_line": 2,
"required_purchase_agreement_count_for_product": 1,
"signed_purchase_agreement_count": 1,
"unit_price": "99.99",
"unit_price_incl_tax": "114.99",
"variant": {
"id": "5656",
"name": "10 Guest Only Credits",
"display_attributes": ""
}
},
{
"id": "4567",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": {
"recipient_email": "best@friend.com",
"recipient_name": "My Best Friend",
"message": "Work out with me!"
},
"is_payment_deferred": false,
"line_subtotal": 50,
"line_subtotal_incl_tax": "50.00",
"line_total": "50.00",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "50.00",
"unit_price_incl_tax": "50.00",
"variant": {
"id": "7878",
"name": "$50 Email Gift Card",
"display_attributes": ""
}
}
],
"payment_gateway_type": "stripe",
"pending_purchase_agreement_count": 1,
"required_purchase_agreement_count": 3,
"requires_new_saved_card": true,
"should_display_price_incl_tax": false,
"signed_purchase_agreement_count": 2,
"subtotal": "249.98",
"subtotal_incl_tax": "279.98",
"taxes": [
{
"name": "Gritty City Tax",
"amount": "9.00"
},
{
"name": "Great State Tax",
"amount": "18.00"
}
],
"total": "256.99",
"total_discount": "19.99",
"total_tax": "27.00"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Cart |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Adjust line item quantity
Code samples
# You can also use wget
curl -X POST /api/customer/v1/locations/{location_id}/cart/adjust_quantity \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/locations/{location_id}/cart/adjust_quantity HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"line_item_id": "123",
"quantity": 1
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/locations/{location_id}/cart/adjust_quantity',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/locations/{location_id}/cart/adjust_quantity',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/locations/{location_id}/cart/adjust_quantity', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/locations/{location_id}/cart/adjust_quantity', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/cart/adjust_quantity");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/locations/{location_id}/cart/adjust_quantity", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/locations/{location_id}/cart/adjust_quantity
Increase or decrease the quantity of a product within a cart.
Body parameter
{
"line_item_id": "123",
"quantity": 1
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
Example responses
200 Response
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 200,
"deferred_item_total_incl_tax": 200,
"discounts": [
{
"name": "10% Off",
"amount": "19.99",
"code": "TAKE10",
"is_automatic": false
}
],
"has_deferred_payments": true,
"is_charged_immediately": true,
"line_items": [
{
"id": "2345",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": true,
"display_message": "$200.00, plus applicable taxes and discounts, will be charged on January 1, 2025.",
"gift_card_options": null,
"is_payment_deferred": true,
"line_subtotal": 200,
"line_subtotal_incl_tax": "230.00",
"line_total": "230.00",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 1,
"required_purchase_agreement_count_for_product": 1,
"signed_purchase_agreement_count": 1,
"unit_price": "200.00",
"unit_price_incl_tax": "230.00",
"variant": {
"id": "3434",
"name": "Future-Activated Membership",
"display_attributes": ""
}
},
{
"id": "3456",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 199.98,
"line_subtotal_incl_tax": "229.98",
"line_total": "206.99",
"pending_purchase_agreement_count": 1,
"quantity": 2,
"required_purchase_agreement_count_for_line": 2,
"required_purchase_agreement_count_for_product": 1,
"signed_purchase_agreement_count": 1,
"unit_price": "99.99",
"unit_price_incl_tax": "114.99",
"variant": {
"id": "5656",
"name": "10 Guest Only Credits",
"display_attributes": ""
}
},
{
"id": "4567",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": {
"recipient_email": "best@friend.com",
"recipient_name": "My Best Friend",
"message": "Work out with me!"
},
"is_payment_deferred": false,
"line_subtotal": 50,
"line_subtotal_incl_tax": "50.00",
"line_total": "50.00",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "50.00",
"unit_price_incl_tax": "50.00",
"variant": {
"id": "7878",
"name": "$50 Email Gift Card",
"display_attributes": ""
}
}
],
"payment_gateway_type": "stripe",
"pending_purchase_agreement_count": 1,
"required_purchase_agreement_count": 3,
"requires_new_saved_card": true,
"should_display_price_incl_tax": false,
"signed_purchase_agreement_count": 2,
"subtotal": "249.98",
"subtotal_incl_tax": "279.98",
"taxes": [
{
"name": "Gritty City Tax",
"amount": "9.00"
},
{
"name": "Great State Tax",
"amount": "18.00"
}
],
"total": "256.99",
"total_discount": "19.99",
"total_tax": "27.00"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Cart |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Apply a discount code
Code samples
# You can also use wget
curl -X POST /api/customer/v1/locations/{location_id}/cart/apply_discount_code \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/locations/{location_id}/cart/apply_discount_code HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"code": "COOLCODE"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/locations/{location_id}/cart/apply_discount_code',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/locations/{location_id}/cart/apply_discount_code',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/locations/{location_id}/cart/apply_discount_code', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/locations/{location_id}/cart/apply_discount_code', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/cart/apply_discount_code");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/locations/{location_id}/cart/apply_discount_code", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/locations/{location_id}/cart/apply_discount_code
Apply a discount code to a cart.
Body parameter
{
"code": "COOLCODE"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
Example responses
200 Response
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 200,
"deferred_item_total_incl_tax": 200,
"discounts": [
{
"name": "10% Off",
"amount": "19.99",
"code": "TAKE10",
"is_automatic": false
}
],
"has_deferred_payments": true,
"is_charged_immediately": true,
"line_items": [
{
"id": "2345",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": true,
"display_message": "$200.00, plus applicable taxes and discounts, will be charged on January 1, 2025.",
"gift_card_options": null,
"is_payment_deferred": true,
"line_subtotal": 200,
"line_subtotal_incl_tax": "230.00",
"line_total": "230.00",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 1,
"required_purchase_agreement_count_for_product": 1,
"signed_purchase_agreement_count": 1,
"unit_price": "200.00",
"unit_price_incl_tax": "230.00",
"variant": {
"id": "3434",
"name": "Future-Activated Membership",
"display_attributes": ""
}
},
{
"id": "3456",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 199.98,
"line_subtotal_incl_tax": "229.98",
"line_total": "206.99",
"pending_purchase_agreement_count": 1,
"quantity": 2,
"required_purchase_agreement_count_for_line": 2,
"required_purchase_agreement_count_for_product": 1,
"signed_purchase_agreement_count": 1,
"unit_price": "99.99",
"unit_price_incl_tax": "114.99",
"variant": {
"id": "5656",
"name": "10 Guest Only Credits",
"display_attributes": ""
}
},
{
"id": "4567",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": {
"recipient_email": "best@friend.com",
"recipient_name": "My Best Friend",
"message": "Work out with me!"
},
"is_payment_deferred": false,
"line_subtotal": 50,
"line_subtotal_incl_tax": "50.00",
"line_total": "50.00",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "50.00",
"unit_price_incl_tax": "50.00",
"variant": {
"id": "7878",
"name": "$50 Email Gift Card",
"display_attributes": ""
}
}
],
"payment_gateway_type": "stripe",
"pending_purchase_agreement_count": 1,
"required_purchase_agreement_count": 3,
"requires_new_saved_card": true,
"should_display_price_incl_tax": false,
"signed_purchase_agreement_count": 2,
"subtotal": "249.98",
"subtotal_incl_tax": "279.98",
"taxes": [
{
"name": "Gritty City Tax",
"amount": "9.00"
},
{
"name": "Great State Tax",
"amount": "18.00"
}
],
"total": "256.99",
"total_discount": "19.99",
"total_tax": "27.00"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Cart |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Check out a cart
Code samples
# You can also use wget
curl -X POST /api/customer/v1/locations/{location_id}/cart/checkout \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/locations/{location_id}/cart/checkout HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '[
{
"amount": 20,
"payment_method_type": "account"
},
{
"amount": 193.78,
"payment_method_type": "bankcard",
"payment_method": {
"id": "123",
"store": false
}
},
{
"amount": 30,
"payment_method_type": "bankcard",
"payment_method": {
"card": {
"ccv": "123",
"expiration_month": "11",
"expiration_year": "2222",
"number": 4111111111111111,
"name": "Wednesday Addams",
"postal_code": "90210",
"last_four": "4111",
"usage_location": "456"
},
"store": false
}
}
]';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/locations/{location_id}/cart/checkout',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/locations/{location_id}/cart/checkout',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/locations/{location_id}/cart/checkout', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/locations/{location_id}/cart/checkout', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/cart/checkout");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/locations/{location_id}/cart/checkout", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/locations/{location_id}/cart/checkout
Submit payment for a cart, resulting in the creation of an order.
Body parameter
[
{
"amount": 20,
"payment_method_type": "account"
},
{
"amount": 193.78,
"payment_method_type": "bankcard",
"payment_method": {
"id": "123",
"store": false
}
},
{
"amount": 30,
"payment_method_type": "bankcard",
"payment_method": {
"card": {
"ccv": "123",
"expiration_month": "11",
"expiration_year": "2222",
"number": 4111111111111111,
"name": "Wednesday Addams",
"postal_code": "90210",
"last_four": "4111",
"usage_location": "456"
},
"store": false
}
}
]
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | PaymentList | false | none |
Example responses
200 Response
{
"id": "123",
"number": "7SV3-QC27-42RD",
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 100,
"deferred_item_total_incl_tax": 105,
"is_cancellation_allowed": true,
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"net_total": "200.75",
"order_lines": [
{
"id": "123",
"display_message": "",
"is_payment_deferred": false,
"product_name": "Cool Product",
"product_type": "Credit",
"product_display_attributes": "Blue, XL",
"quantity": 2,
"status": "Pending",
"subtotal": "122.40",
"subtotal_excl_discounts": "136.00",
"subtotal_incl_tax": "144.16",
"total_tax": "7.34",
"total": "129.74",
"unit_price": "68.00",
"unit_price_incl_tax": "72.08"
}
],
"payment_sources": [
{
"id": "123",
"amount_paid": "9.99",
"amount_refunded": "0.00",
"name": "Visa ending in 1111",
"payment_type": "Visa"
}
],
"placed_datetime": "2020-08-24T20:09:31.868685Z",
"refund_total": "0.00",
"should_display_price_incl_tax": false,
"status": "Completed",
"subtotal": "237.50",
"subtotal_excl_discounts": "250.00",
"subtotal_incl_tax": "265.00",
"taxes": [
{
"name": "A Tax",
"value": "13.79"
}
],
"total": "251.75",
"total_discount": "12.50",
"total_tax": "14.25"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Order |
401 | Unauthorized | Unauthenticated | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Clear a cart
Code samples
# You can also use wget
curl -X POST /api/customer/v1/locations/{location_id}/cart/clear \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/locations/{location_id}/cart/clear HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/locations/{location_id}/cart/clear',
{
method: 'POST',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/locations/{location_id}/cart/clear',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/locations/{location_id}/cart/clear', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/locations/{location_id}/cart/clear', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/cart/clear");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/locations/{location_id}/cart/clear", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/locations/{location_id}/cart/clear
Remove all items from a cart.
Example responses
200 Response
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 0,
"deferred_item_total": 0,
"deferred_item_total_incl_tax": 0,
"discounts": [],
"has_deferred_payments": false,
"is_charged_immediately": true,
"line_items": [],
"payment_gateway_type": "stripe",
"pending_purchase_agreement_count": 0,
"required_purchase_agreement_count": 0,
"requires_new_saved_card": false,
"should_display_price_incl_tax": false,
"signed_purchase_agreement_count": 0,
"subtotal": 0,
"subtotal_incl_tax": "0.00",
"taxes": [],
"total": "0.00",
"total_discount": "0.00",
"total_tax": "0.00"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | EmptyCart |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Clear a discount code
Code samples
# You can also use wget
curl -X POST /api/customer/v1/locations/{location_id}/cart/clear_discount_codes \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/locations/{location_id}/cart/clear_discount_codes HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/locations/{location_id}/cart/clear_discount_codes',
{
method: 'POST',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/locations/{location_id}/cart/clear_discount_codes',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/locations/{location_id}/cart/clear_discount_codes', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/locations/{location_id}/cart/clear_discount_codes', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/locations/{location_id}/cart/clear_discount_codes");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/locations/{location_id}/cart/clear_discount_codes", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/locations/{location_id}/cart/clear_discount_codes
Remove a discount code that has been applied to a cart.
Example responses
200 Response
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 0,
"deferred_item_total": 0,
"deferred_item_total_incl_tax": 0,
"discounts": [],
"has_deferred_payments": false,
"is_charged_immediately": false,
"line_items": [
{
"id": "123",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 200,
"line_subtotal_incl_tax": "240.00",
"line_total": "240.00",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "200.00",
"unit_price_incl_tax": "240.00",
"variant": {
"id": "3445",
"name": "Monthly Activated Membership",
"display_attributes": ""
}
}
],
"payment_gateway_type": "stripe",
"pending_purchase_agreement_count": 0,
"required_purchase_agreement_count": 0,
"requires_new_saved_card": false,
"should_display_price_incl_tax": false,
"signed_purchase_agreement_count": 0,
"subtotal": "200.00",
"subtotal_incl_tax": "240.00",
"taxes": [
{
"name": "20% Tax",
"value": "40.00"
}
],
"total": "240.00",
"total_discount": "0.00",
"total_tax": "40.00"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | CartClearedDiscounts |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Add-Ons Carts
Add-ons carts can be used to pre-order items that will be picked up in studio at the time of the reservation, such as a bottle of water or a mat rental. The payment for these orders will be charged one hour before class begins.
Get an open add-ons cart
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/reservations/{reservation_id}/cart \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/reservations/{reservation_id}/cart HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations/{reservation_id}/cart',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/reservations/{reservation_id}/cart',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/reservations/{reservation_id}/cart', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/reservations/{reservation_id}/cart', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations/{reservation_id}/cart");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/reservations/{reservation_id}/cart", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/reservations/{reservation_id}/cart
Retrieve an open cart for an add-ons order for the given reservation.
Example responses
200 Response
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 0,
"deferred_item_total": 0,
"deferred_item_total_incl_tax": 0,
"discounts": [
{
"name": "Half Off Shoe Rental",
"amount": "2.50",
"code": "BIGFOOT",
"is_automatic": false
}
],
"has_deferred_payments": false,
"is_charged_immediately": false,
"line_items": [
{
"id": "1234",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 4,
"line_subtotal_incl_tax": "4.24",
"line_total": "4.24",
"pending_purchase_agreement_count": 0,
"quantity": 2,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "2.00",
"unit_price_incl_tax": "2.12",
"variant": {
"id": "1212",
"name": "Bottled Water",
"display_attributes": "Large"
}
},
{
"id": "2345",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 5,
"line_subtotal_incl_tax": "5.30",
"line_total": "2.65",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "5.00",
"unit_price_incl_tax": "5.30",
"variant": {
"id": "3434",
"name": "Shoe Rental",
"display_attributes": "Size 8"
}
}
],
"payment_gateway_type": "legacy",
"pending_purchase_agreement_count": 0,
"required_purchase_agreement_count": 0,
"requires_new_saved_card": true,
"should_display_price_include_tax": false,
"signed_purchase_agreement_count": 0,
"subtotal": "9.00",
"subtotal_incl_tax": "9.54",
"taxes": {
"name": "Local Retail Tax",
"value": "0.39"
},
"total": "6.89",
"total_discount": "2.50",
"total_tax": "0.39"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | AddOnsCart |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Add an add-ons product listing
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/reservations/{reservation_id}/cart/add_product_listing \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/reservations/{reservation_id}/cart/add_product_listing HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"product_listing_id": "foodandbeverage-123",
"quantity": 1
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations/{reservation_id}/cart/add_product_listing',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/reservations/{reservation_id}/cart/add_product_listing',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/reservations/{reservation_id}/cart/add_product_listing', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/reservations/{reservation_id}/cart/add_product_listing', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations/{reservation_id}/cart/add_product_listing");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/reservations/{reservation_id}/cart/add_product_listing", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/reservations/{reservation_id}/cart/add_product_listing
Add a product listing to the current user's add-ons cart.
Body parameter
{
"product_listing_id": "foodandbeverage-123",
"quantity": 1
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
Example responses
200 Response
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 0,
"deferred_item_total": 0,
"deferred_item_total_incl_tax": 0,
"discounts": [
{
"name": "Half Off Shoe Rental",
"amount": "2.50",
"code": "BIGFOOT",
"is_automatic": false
}
],
"has_deferred_payments": false,
"is_charged_immediately": false,
"line_items": [
{
"id": "1234",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 4,
"line_subtotal_incl_tax": "4.24",
"line_total": "4.24",
"pending_purchase_agreement_count": 0,
"quantity": 2,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "2.00",
"unit_price_incl_tax": "2.12",
"variant": {
"id": "1212",
"name": "Bottled Water",
"display_attributes": "Large"
}
},
{
"id": "2345",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 5,
"line_subtotal_incl_tax": "5.30",
"line_total": "2.65",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "5.00",
"unit_price_incl_tax": "5.30",
"variant": {
"id": "3434",
"name": "Shoe Rental",
"display_attributes": "Size 8"
}
}
],
"payment_gateway_type": "legacy",
"pending_purchase_agreement_count": 0,
"required_purchase_agreement_count": 0,
"requires_new_saved_card": true,
"should_display_price_include_tax": false,
"signed_purchase_agreement_count": 0,
"subtotal": "9.00",
"subtotal_incl_tax": "9.54",
"taxes": {
"name": "Local Retail Tax",
"value": "0.39"
},
"total": "6.89",
"total_discount": "2.50",
"total_tax": "0.39"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | AddOnsCart |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Adjust line item quantity
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/reservations/{reservation_id}/cart/adjust_quantity \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/reservations/{reservation_id}/cart/adjust_quantity HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"line_item_id": "123",
"quantity": 1
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations/{reservation_id}/cart/adjust_quantity',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/reservations/{reservation_id}/cart/adjust_quantity',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/reservations/{reservation_id}/cart/adjust_quantity', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/reservations/{reservation_id}/cart/adjust_quantity', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations/{reservation_id}/cart/adjust_quantity");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/reservations/{reservation_id}/cart/adjust_quantity", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/reservations/{reservation_id}/cart/adjust_quantity
Increase or decrease the quantity of a product within an open add-ons cart.
Body parameter
{
"line_item_id": "123",
"quantity": 1
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
Example responses
200 Response
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 0,
"deferred_item_total": 0,
"deferred_item_total_incl_tax": 0,
"discounts": [
{
"name": "Half Off Shoe Rental",
"amount": "2.50",
"code": "BIGFOOT",
"is_automatic": false
}
],
"has_deferred_payments": false,
"is_charged_immediately": false,
"line_items": [
{
"id": "1234",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 4,
"line_subtotal_incl_tax": "4.24",
"line_total": "4.24",
"pending_purchase_agreement_count": 0,
"quantity": 2,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "2.00",
"unit_price_incl_tax": "2.12",
"variant": {
"id": "1212",
"name": "Bottled Water",
"display_attributes": "Large"
}
},
{
"id": "2345",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 5,
"line_subtotal_incl_tax": "5.30",
"line_total": "2.65",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "5.00",
"unit_price_incl_tax": "5.30",
"variant": {
"id": "3434",
"name": "Shoe Rental",
"display_attributes": "Size 8"
}
}
],
"payment_gateway_type": "legacy",
"pending_purchase_agreement_count": 0,
"required_purchase_agreement_count": 0,
"requires_new_saved_card": true,
"should_display_price_include_tax": false,
"signed_purchase_agreement_count": 0,
"subtotal": "9.00",
"subtotal_incl_tax": "9.54",
"taxes": {
"name": "Local Retail Tax",
"value": "0.39"
},
"total": "6.89",
"total_discount": "2.50",
"total_tax": "0.39"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | AddOnsCart |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Apply a discount code
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/reservations/{reservation_id}/cart/apply_discount_code \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/reservations/{reservation_id}/cart/apply_discount_code HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '{
"code": "COOLCODE"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations/{reservation_id}/cart/apply_discount_code',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/reservations/{reservation_id}/cart/apply_discount_code',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/reservations/{reservation_id}/cart/apply_discount_code', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/reservations/{reservation_id}/cart/apply_discount_code', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations/{reservation_id}/cart/apply_discount_code");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/reservations/{reservation_id}/cart/apply_discount_code", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/reservations/{reservation_id}/cart/apply_discount_code
Apply a discount code to an add-ons cart.
Body parameter
{
"code": "COOLCODE"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
Example responses
200 Response
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 0,
"deferred_item_total": 0,
"deferred_item_total_incl_tax": 0,
"discounts": [
{
"name": "Half Off Shoe Rental",
"amount": "2.50",
"code": "BIGFOOT",
"is_automatic": false
}
],
"has_deferred_payments": false,
"is_charged_immediately": false,
"line_items": [
{
"id": "1234",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 4,
"line_subtotal_incl_tax": "4.24",
"line_total": "4.24",
"pending_purchase_agreement_count": 0,
"quantity": 2,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "2.00",
"unit_price_incl_tax": "2.12",
"variant": {
"id": "1212",
"name": "Bottled Water",
"display_attributes": "Large"
}
},
{
"id": "2345",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 5,
"line_subtotal_incl_tax": "5.30",
"line_total": "2.65",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "5.00",
"unit_price_incl_tax": "5.30",
"variant": {
"id": "3434",
"name": "Shoe Rental",
"display_attributes": "Size 8"
}
}
],
"payment_gateway_type": "legacy",
"pending_purchase_agreement_count": 0,
"required_purchase_agreement_count": 0,
"requires_new_saved_card": true,
"should_display_price_include_tax": false,
"signed_purchase_agreement_count": 0,
"subtotal": "9.00",
"subtotal_incl_tax": "9.54",
"taxes": {
"name": "Local Retail Tax",
"value": "0.39"
},
"total": "6.89",
"total_discount": "2.50",
"total_tax": "0.39"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | AddOnsCart |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Check out an add-ons cart
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/reservations/{reservation_id}/cart/checkout \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/reservations/{reservation_id}/cart/checkout HTTP/1.1
Content-Type: application/json
Accept: application/json
const inputBody = '[
{
"amount": 20,
"payment_method_type": "account"
},
{
"amount": 193.78,
"payment_method_type": "bankcard",
"payment_method": {
"id": "123",
"store": false
}
},
{
"amount": 30,
"payment_method_type": "bankcard",
"payment_method": {
"card": {
"ccv": "123",
"expiration_month": "11",
"expiration_year": "2222",
"number": 4111111111111111,
"name": "Wednesday Addams",
"postal_code": "90210",
"last_four": "4111",
"usage_location": "456"
},
"store": false
}
}
]';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations/{reservation_id}/cart/checkout',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/reservations/{reservation_id}/cart/checkout',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/reservations/{reservation_id}/cart/checkout', headers = headers)
print(r.json())
'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/reservations/{reservation_id}/cart/checkout', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations/{reservation_id}/cart/checkout");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/reservations/{reservation_id}/cart/checkout", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/reservations/{reservation_id}/cart/checkout
Submit payment for an add-ons cart, resulting in the creation of an add-ons order.
Body parameter
[
{
"amount": 20,
"payment_method_type": "account"
},
{
"amount": 193.78,
"payment_method_type": "bankcard",
"payment_method": {
"id": "123",
"store": false
}
},
{
"amount": 30,
"payment_method_type": "bankcard",
"payment_method": {
"card": {
"ccv": "123",
"expiration_month": "11",
"expiration_year": "2222",
"number": 4111111111111111,
"name": "Wednesday Addams",
"postal_code": "90210",
"last_four": "4111",
"usage_location": "456"
},
"store": false
}
}
]
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | PaymentList | false | none |
Example responses
200 Response
{
"id": "123",
"number": "7SV3-QC27-42RD",
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 100,
"deferred_item_total_incl_tax": 105,
"is_cancellation_allowed": true,
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"net_total": "200.75",
"order_lines": [
{
"id": "123",
"display_message": "",
"is_payment_deferred": false,
"product_name": "Cool Product",
"product_type": "Credit",
"product_display_attributes": "Blue, XL",
"quantity": 2,
"status": "Pending",
"subtotal": "122.40",
"subtotal_excl_discounts": "136.00",
"subtotal_incl_tax": "144.16",
"total_tax": "7.34",
"total": "129.74",
"unit_price": "68.00",
"unit_price_incl_tax": "72.08"
}
],
"payment_sources": [
{
"id": "123",
"amount_paid": "9.99",
"amount_refunded": "0.00",
"name": "Visa ending in 1111",
"payment_type": "Visa"
}
],
"placed_datetime": "2020-08-24T20:09:31.868685Z",
"refund_total": "0.00",
"should_display_price_incl_tax": false,
"status": "Completed",
"subtotal": "237.50",
"subtotal_excl_discounts": "250.00",
"subtotal_incl_tax": "265.00",
"taxes": [
{
"name": "A Tax",
"value": "13.79"
}
],
"total": "251.75",
"total_discount": "12.50",
"total_tax": "14.25"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Order |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Clear an add-ons cart
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/reservations/{reservation_id}/cart/clear \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/reservations/{reservation_id}/cart/clear HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations/{reservation_id}/cart/clear',
{
method: 'POST',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/reservations/{reservation_id}/cart/clear',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/reservations/{reservation_id}/cart/clear', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/reservations/{reservation_id}/cart/clear', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations/{reservation_id}/cart/clear");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/reservations/{reservation_id}/cart/clear", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/reservations/{reservation_id}/cart/clear
Remove all items from an add-ons cart.
Example responses
200 Response
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 0,
"deferred_item_total": 0,
"deferred_item_total_incl_tax": 0,
"discounts": [],
"has_deferred_payments": false,
"is_charged_immediately": true,
"line_items": [],
"payment_gateway_type": "stripe",
"pending_purchase_agreement_count": 0,
"required_purchase_agreement_count": 0,
"requires_new_saved_card": false,
"should_display_price_incl_tax": false,
"signed_purchase_agreement_count": 0,
"subtotal": 0,
"subtotal_incl_tax": "0.00",
"taxes": [],
"total": "0.00",
"total_discount": "0.00",
"total_tax": "0.00"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | EmptyCart |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Clear a discount code
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/reservations/{reservation_id}/cart/clear_discount_codes \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/reservations/{reservation_id}/cart/clear_discount_codes HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/reservations/{reservation_id}/cart/clear_discount_codes',
{
method: 'POST',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/reservations/{reservation_id}/cart/clear_discount_codes',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/reservations/{reservation_id}/cart/clear_discount_codes', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/reservations/{reservation_id}/cart/clear_discount_codes', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/reservations/{reservation_id}/cart/clear_discount_codes");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/reservations/{reservation_id}/cart/clear_discount_codes", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/reservations/{reservation_id}/cart/clear_discount_codes
Remove a discount code that has been applied to an add-ons cart.
Example responses
200 Response
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 0,
"deferred_item_total": 0,
"deferred_item_total_incl_tax": 0,
"discounts": [],
"has_deferred_payments": false,
"is_charged_immediately": false,
"line_items": [
{
"id": "1234",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 4,
"line_subtotal_incl_tax": "4.24",
"line_total": "4.24",
"pending_purchase_agreement_count": 0,
"quantity": 2,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "2.00",
"unit_price_incl_tax": "2.12",
"variant": {
"id": "1212",
"name": "Bottled Water",
"display_attributes": "Large"
}
},
{
"id": "2345",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 5,
"line_subtotal_incl_tax": "5.30",
"line_total": "5.30",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "5.00",
"unit_price_incl_tax": "5.30",
"variant": {
"id": "3434",
"name": "Shoe Rental",
"display_attributes": "Size 8"
}
}
],
"payment_gateway_type": "legacy",
"pending_purchase_agreement_count": 0,
"required_purchase_agreement_count": 0,
"requires_new_saved_card": true,
"should_display_price_include_tax": false,
"signed_purchase_agreement_count": 0,
"subtotal": "9.00",
"subtotal_incl_tax": "9.54",
"taxes": {
"name": "Local Retail Tax",
"value": "0.54"
},
"total": "9.54",
"total_discount": "0.00",
"total_tax": "0.54"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | AddOnsCartClearedDiscounts |
401 | Unauthorized | Authorization information is missing or invalid. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Orders
View and manage orders for the current user.
List orders
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/orders \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/orders HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/orders',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/orders',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/orders', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/orders', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/orders");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/orders", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/orders
View the order history for the current user. The following query parameters can be used to assist in filtering orders, status
, exclude_statuses
, and reservation
.
Example responses
200 Response
{
"results": [
{
"id": "123",
"number": "7SV3-QC27-42RD",
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 100,
"deferred_item_total_incl_tax": 105,
"is_cancellation_allowed": true,
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"net_total": "200.75",
"order_lines": [
{
"id": "123",
"display_message": "",
"is_payment_deferred": false,
"product_name": "Cool Product",
"product_type": "Credit",
"product_display_attributes": "Blue, XL",
"quantity": 2,
"status": "Pending",
"subtotal": "122.40",
"subtotal_excl_discounts": "136.00",
"subtotal_incl_tax": "144.16",
"total_tax": "7.34",
"total": "129.74",
"unit_price": "68.00",
"unit_price_incl_tax": "72.08"
}
],
"payment_sources": [
{
"id": "123",
"amount_paid": "9.99",
"amount_refunded": "0.00",
"name": "Visa ending in 1111",
"payment_type": "Visa"
}
],
"placed_datetime": "2020-08-24T20:09:31.868685Z",
"refund_total": "0.00",
"should_display_price_incl_tax": false,
"status": "Completed",
"subtotal": "237.50",
"subtotal_excl_discounts": "250.00",
"subtotal_incl_tax": "265.00",
"taxes": [
{
"name": "A Tax",
"value": "13.79"
}
],
"total": "251.75",
"total_discount": "12.50",
"total_tax": "14.25"
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | OrderList |
401 | Unauthorized | Authorization information is missing or invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Retrieve an order
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/orders/{order_id} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/orders/{order_id} HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/orders/{order_id}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/orders/{order_id}',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/orders/{order_id}', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/orders/{order_id}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/orders/{order_id}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/orders/{order_id}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/orders/{order_id}
View details about a single order.
Example responses
200 Response
{
"id": "123",
"number": "7SV3-QC27-42RD",
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 100,
"deferred_item_total_incl_tax": 105,
"is_cancellation_allowed": true,
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"net_total": "200.75",
"order_lines": [
{
"id": "123",
"display_message": "",
"is_payment_deferred": false,
"product_name": "Cool Product",
"product_type": "Credit",
"product_display_attributes": "Blue, XL",
"quantity": 2,
"status": "Pending",
"subtotal": "122.40",
"subtotal_excl_discounts": "136.00",
"subtotal_incl_tax": "144.16",
"total_tax": "7.34",
"total": "129.74",
"unit_price": "68.00",
"unit_price_incl_tax": "72.08",
"child_orders": [
{
"id": "123",
"number": "7SV3-QC27-42RD"
}
]
}
],
"payment_sources": [
{
"id": "123",
"amount_paid": "9.99",
"amount_refunded": "0.00",
"name": "Visa ending in 1111",
"payment_type": "Visa"
}
],
"placed_datetime": "2020-08-24T20:09:31.868685Z",
"refund_total": "0.00",
"should_display_price_incl_tax": false,
"status": "Completed",
"subtotal": "237.50",
"subtotal_excl_discounts": "250.00",
"subtotal_incl_tax": "265.00",
"taxes": [
{
"name": "A Tax",
"value": "13.79"
}
],
"total": "251.75",
"total_discount": "12.50",
"total_tax": "14.25",
"discounts": [
{
"name": "10% Off",
"amount": "19.99",
"code": "TAKE10",
"is_automatic": false
}
],
"has_all_order_details": true,
"order_details": [
{
"action_datetime": "2021-09-21T17:13:57.958540Z",
"action_display": "created",
"description": "System created this order for 1 item",
"fulfillment_timezone": "Europe/London",
"invoice_pdf_url": "/media/invoice/9/invoice-20210921-2.pdf",
"item_quantity": 1,
"order_event_id": null,
"order_event_index": null,
"parent_order_id": "1735",
"parent_order_number": "JCBA-CUK4-4IQX",
"status": "Pending",
"status_display": "Order created",
"total": "0.00"
}
],
"parent_order": {
"id": "123",
"number": "7SV3-QC27-42RD"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Order details retrieved successfully. | OrderRetrieve |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Cancel an order
Code samples
# You can also use wget
curl -X POST /api/customer/v1/me/orders/{order_id}/cancel \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
POST /api/customer/v1/me/orders/{order_id}/cancel HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/orders/{order_id}/cancel',
{
method: 'POST',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post '/api/customer/v1/me/orders/{order_id}/cancel',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('/api/customer/v1/me/orders/{order_id}/cancel', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','/api/customer/v1/me/orders/{order_id}/cancel', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/orders/{order_id}/cancel");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "/api/customer/v1/me/orders/{order_id}/cancel", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
POST /api/customer/v1/me/orders/{order_id}/cancel
Cancel an order that has not yet been completed.
Example responses
200 Response
{
"id": "123",
"number": "7SV3-QC27-42RD",
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 100,
"deferred_item_total_incl_tax": 105,
"is_cancellation_allowed": true,
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"net_total": "200.75",
"order_lines": [
{
"id": "123",
"display_message": "",
"is_payment_deferred": false,
"product_name": "Cool Product",
"product_type": "Credit",
"product_display_attributes": "Blue, XL",
"quantity": 2,
"status": "Pending",
"subtotal": "122.40",
"subtotal_excl_discounts": "136.00",
"subtotal_incl_tax": "144.16",
"total_tax": "7.34",
"total": "129.74",
"unit_price": "68.00",
"unit_price_incl_tax": "72.08"
}
],
"payment_sources": [
{
"id": "123",
"amount_paid": "9.99",
"amount_refunded": "0.00",
"name": "Visa ending in 1111",
"payment_type": "Visa"
}
],
"placed_datetime": "2020-08-24T20:09:31.868685Z",
"refund_total": "0.00",
"should_display_price_incl_tax": false,
"status": "Completed",
"subtotal": "237.50",
"subtotal_excl_discounts": "250.00",
"subtotal_incl_tax": "265.00",
"taxes": [
{
"name": "A Tax",
"value": "13.79"
}
],
"total": "251.75",
"total_discount": "12.50",
"total_tax": "14.25"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | Order |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Metrics
Set of endpoints that are used to calculate aggregated values of a users reservation history
User class count
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/metrics/class_count \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/metrics/class_count HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/metrics/class_count',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/metrics/class_count',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/metrics/class_count', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/metrics/class_count', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/metrics/class_count");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/metrics/class_count", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/metrics/class_count
Calculates the number of classes taken for a user.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
start_date | query | date | false | Filters classes that started on or after this date. |
end_date | query | date | false | Filters classes that started on or before this date. |
Example responses
200 Response
{
"result": 12
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | None |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Response Schema
User longest weekly streak
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/metrics/longest_weekly_streak \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/metrics/longest_weekly_streak HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/metrics/longest_weekly_streak',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/metrics/longest_weekly_streak',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/metrics/longest_weekly_streak', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/metrics/longest_weekly_streak', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/metrics/longest_weekly_streak");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/metrics/longest_weekly_streak", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/metrics/longest_weekly_streak
Calculates the longest weekly class streak for a user.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
start_date | query | date | false | Filters classes that started on or after this date. |
end_date | query | date | false | Filters classes that started on or before this date. |
Example responses
200 Response
{
"streak_length": 4,
"streak_start_date": "2022-04-01",
"streak_end_date": "2022-04-29"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | None |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Response Schema
User most popular day
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/metrics/most_popular_weekday \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/metrics/most_popular_weekday HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/metrics/most_popular_weekday',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/metrics/most_popular_weekday',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/metrics/most_popular_weekday', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/metrics/most_popular_weekday', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/metrics/most_popular_weekday");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/metrics/most_popular_weekday", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/metrics/most_popular_weekday
Calculates the most popular weekday for a user.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
start_date | query | date | false | Filters classes that started on or after this date. |
end_date | query | date | false | Filters classes that started on or before this date. |
Example responses
200 Response
{
"result": {
"weekday": "Monday",
"reservation_count": 17
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | None |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Response Schema
User top instructors
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/metrics/top_instructors \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/metrics/top_instructors HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/metrics/top_instructors',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/metrics/top_instructors',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/metrics/top_instructors', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/metrics/top_instructors', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/metrics/top_instructors");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/metrics/top_instructors", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/metrics/top_instructors
Calculates the top instructors for a user.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
start_date | query | date | false | Filters classes that started on or after this date. |
end_date | query | date | false | Filters classes that started on or before this date. |
Example responses
200 Response
{
"result": [
{
"instructor_id": 123,
"instructor_full_name": "Jim Nasium",
"total_reservations_for_instructor": 12
},
{
"instructor_id": 234,
"instructor_full_name": "James Baxter",
"total_reservations_for_instructor": 8
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | None |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Response Schema
User top time of day
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/metrics/top_time_of_day \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/metrics/top_time_of_day HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/metrics/top_time_of_day',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/metrics/top_time_of_day',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/metrics/top_time_of_day', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/metrics/top_time_of_day', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/metrics/top_time_of_day");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/metrics/top_time_of_day", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/metrics/top_time_of_day
Calculates the top time of day for a user.
-
Morning threshold: class start date (inclusively) in range 03:00:00 - 11:59:59
-
Afternoon threshold: class start date (inclusively) in range 12:00:00 - 16:59:59
-
Night Owl threshold: class start date (inclusively) in range 17:00:00-02:59:59
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
start_date | query | date | false | Filters classes that started on or after this date. |
end_date | query | date | false | Filters classes that started on or before this date. |
Example responses
200 Response
{
"result": {
"top_time_of_day": "night owl",
"reservation_count": 23
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | None |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Response Schema
User total minutes in class
Code samples
# You can also use wget
curl -X GET /api/customer/v1/me/metrics/total_minutes_in_class \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
GET /api/customer/v1/me/metrics/total_minutes_in_class HTTP/1.1
Accept: application/json
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('/api/customer/v1/me/metrics/total_minutes_in_class',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get '/api/customer/v1/me/metrics/total_minutes_in_class',
params: {
}, headers: headers
p JSON.parse(result)
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('/api/customer/v1/me/metrics/total_minutes_in_class', headers = headers)
print(r.json())
'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','/api/customer/v1/me/metrics/total_minutes_in_class', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
URL obj = new URL("/api/customer/v1/me/metrics/total_minutes_in_class");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "/api/customer/v1/me/metrics/total_minutes_in_class", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
GET /api/customer/v1/me/metrics/total_minutes_in_class
Calculates the total number of number in all classes for a user.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
start_date | query | date | false | Filters classes that started on or after this date. |
end_date | query | date | false | Filters classes that started on or before this date. |
Example responses
200 Response
{
"result": {
"result": 480
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success. | None |
401 | Unauthorized | Authorization information is missing or invalid. | None |
403 | Forbidden | The authenticated user does not have permission to perform this request. | None |
404 | Not Found | The specified resource cannot be found. | None |
422 | Unprocessable Entity | Request is invalid. | None |
503 | Service Unavailable | The server is temporarily unable to handle this request. | None |
Response Schema
Schemas
AddOnsBuyPage
{
"id": "123",
"buy_page_sections": [
{
"id": "123",
"name": "Intro Offers",
"product_listings": [
{
"id": "123",
"banner": "New Item!!",
"currency_code": "USD",
"description": "Farm to table credits to get you into class.",
"is_in_stock": true,
"is_live_stream": true,
"is_promoted": true,
"is_valid_promo_for_user": true,
"name": "Farm to Table Credit",
"num_in_stock": 20,
"price": 200,
"price_incl_tax": 220,
"product_type": "credits",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false,
"variants": [
{
"id": "123",
"currency_code": "USD",
"is_in_stock": true,
"num_in_stock": 1,
"price": 9.99,
"price_incl_tax": "10.99",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
]
}
]
}
],
"name": "Add-Ons Buy Page"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
buy_page_sections | [AddOnsBuyPageSection] | false | read-only | none |
name | string | false | read-only | none |
AddOnsBuyPageProductListingWithVariants
{
"id": "123",
"banner": "New Item!!",
"currency_code": "USD",
"description": "Farm to table credits to get you into class.",
"is_in_stock": true,
"is_live_stream": true,
"is_promoted": true,
"is_valid_promo_for_user": true,
"name": "Farm to Table Credit",
"num_in_stock": 20,
"price": 200,
"price_incl_tax": 220,
"product_type": "credits",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false,
"variants": [
{
"id": "123",
"currency_code": "USD",
"is_in_stock": true,
"num_in_stock": 1,
"price": 9.99,
"price_incl_tax": "10.99",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
]
}
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | ProductListing | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» variants | [AddOnsVariants] | false | read-only | none |
AddOnsBuyPageSection
{
"id": "123",
"name": "Intro Offers",
"product_listings": [
{
"id": "123",
"banner": "New Item!!",
"currency_code": "USD",
"description": "Farm to table credits to get you into class.",
"is_in_stock": true,
"is_live_stream": true,
"is_promoted": true,
"is_valid_promo_for_user": true,
"name": "Farm to Table Credit",
"num_in_stock": 20,
"price": 200,
"price_incl_tax": 220,
"product_type": "credits",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false,
"variants": [
{
"id": "123",
"currency_code": "USD",
"is_in_stock": true,
"num_in_stock": 1,
"price": 9.99,
"price_incl_tax": "10.99",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
]
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
name | string | false | read-only | none |
product_listings | [AddOnsBuyPageProductListingWithVariants] | false | read-only | none |
AddOnsCart
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 0,
"deferred_item_total": 0,
"deferred_item_total_incl_tax": 0,
"discounts": [
{
"name": "Half Off Shoe Rental",
"amount": "2.50",
"code": "BIGFOOT",
"is_automatic": false
}
],
"has_deferred_payments": false,
"is_charged_immediately": false,
"line_items": [
{
"id": "1234",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 4,
"line_subtotal_incl_tax": "4.24",
"line_total": "4.24",
"pending_purchase_agreement_count": 0,
"quantity": 2,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "2.00",
"unit_price_incl_tax": "2.12",
"variant": {
"id": "1212",
"name": "Bottled Water",
"display_attributes": "Large"
}
},
{
"id": "2345",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 5,
"line_subtotal_incl_tax": "5.30",
"line_total": "2.65",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "5.00",
"unit_price_incl_tax": "5.30",
"variant": {
"id": "3434",
"name": "Shoe Rental",
"display_attributes": "Size 8"
}
}
],
"payment_gateway_type": "legacy",
"pending_purchase_agreement_count": 0,
"required_purchase_agreement_count": 0,
"requires_new_saved_card": true,
"should_display_price_include_tax": false,
"signed_purchase_agreement_count": 0,
"subtotal": "9.00",
"subtotal_incl_tax": "9.54",
"taxes": {
"name": "Local Retail Tax",
"value": "0.39"
},
"total": "6.89",
"total_discount": "2.50",
"total_tax": "0.39"
}
Same schema as cart, just with different examples.
Properties
None
AddOnsCartClearedDiscounts
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 0,
"deferred_item_total": 0,
"deferred_item_total_incl_tax": 0,
"discounts": [],
"has_deferred_payments": false,
"is_charged_immediately": false,
"line_items": [
{
"id": "1234",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 4,
"line_subtotal_incl_tax": "4.24",
"line_total": "4.24",
"pending_purchase_agreement_count": 0,
"quantity": 2,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "2.00",
"unit_price_incl_tax": "2.12",
"variant": {
"id": "1212",
"name": "Bottled Water",
"display_attributes": "Large"
}
},
{
"id": "2345",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 5,
"line_subtotal_incl_tax": "5.30",
"line_total": "5.30",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "5.00",
"unit_price_incl_tax": "5.30",
"variant": {
"id": "3434",
"name": "Shoe Rental",
"display_attributes": "Size 8"
}
}
],
"payment_gateway_type": "legacy",
"pending_purchase_agreement_count": 0,
"required_purchase_agreement_count": 0,
"requires_new_saved_card": true,
"should_display_price_include_tax": false,
"signed_purchase_agreement_count": 0,
"subtotal": "9.00",
"subtotal_incl_tax": "9.54",
"taxes": {
"name": "Local Retail Tax",
"value": "0.54"
},
"total": "9.54",
"total_discount": "0.00",
"total_tax": "0.54"
}
Same schema as cart, just with different examples.
Properties
None
AddOnsVariants
{
"id": "123",
"currency_code": "USD",
"is_in_stock": true,
"num_in_stock": 1,
"price": 9.99,
"price_incl_tax": "10.99",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | An ID for the product variant. |
currency_code | string | false | read-only | none |
is_in_stock | boolean | false | read-only | none |
num_in_stock | integer | false | read-only | none |
price | number | false | read-only | none |
price_incl_tax | string | false | read-only | none |
product_display_attributes | [ProductDisplayAttribute] | false | read-only | none |
should_display_price_incl_tax | boolean | false | read-only | Whether to display the product's price as tax-inclusive or tax-exclusive. |
AddressField
{
"field": "postal_code",
"label": "ZIP Code"
}
Form field for address forms that is specific to the associated country.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
field | string | false | none | API field name |
label | string | false | none | The correct term to use in label displayed to users |
AddressFields
[
{
"field": "address_line_one",
"label": "Address Line 1"
},
{
"field": "address_line_two",
"label": "Address Line 2"
},
{
"field": "city",
"label": "City"
},
{
"field": "state_province",
"label": "State"
},
{
"field": "postal_code",
"label": "ZIP Code"
}
]
Form fields for address forms that are specific to the associated country.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [AddressField] | false | read-only | Form fields for address forms that are specific to the associated country. |
AddressFormat
{
"address_fields": [
{
"field": "address_line_one",
"label": "Address Line 1"
},
{
"field": "address_line_two",
"label": "Address Line 2"
},
{
"field": "city",
"label": "City"
},
{
"field": "state_province",
"label": "State"
},
{
"field": "postal_code",
"label": "ZIP Code"
}
]
}
Object containing information for generating address forms with API fields relevant to the country, and the correct terms to use in labels displayed to users.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
address_fields | AddressFields | false | none | Form fields for address forms that are specific to the associated country. |
AppVersionMetadata
{
"id": "123",
"app_name": "ios",
"app_version": "2.0.0",
"is_mandatory": "true"
}
The standard region schema with added information about relevant class types, classrooms, and instructors.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | integer | false | read-only | none |
app_name | string | false | read-only | Name of the customer application. |
app_version | string | false | read-only | The latest version of the customer application. |
is_mandatory | boolean | false | read-only | Whether the app_version is mandatory or not. |
AppVersionMetadataList
{
"results": [
{
"id": "123",
"app_name": "ios",
"app_version": "2.0.0",
"is_mandatory": "true"
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | [AppVersionMetadata] | false | read-only | A list of app version metadatas. |
meta | Meta | false | none | Pagination metadata. |
links | Links | false | none | Links to pages. |
BankcardPayment
{
"ccv": "123",
"expiration_month": "10",
"expiration_year": "22",
"last_four": "1111",
"name": "Wednesday Addams",
"number": 4111111111111111,
"postal_code": "12345",
"usage_location": "123"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
ccv | string | false | none | none |
expiration_month | string | false | none | The month the card expires. Formatted as MM . |
expiration_year | string | false | none | The month the card expires. Formatted as YYYY . |
last_four | string | false | none | The last four digits of the card number. |
name | string | false | none | The name of the card holder. |
number | integer | false | none | Used only when charging or saving new credit cards. |
postal_code | string | false | none | The Zip/Postal code associated with the card's billing address. |
usage_location | string | false | none | Optional. The ID of the location where the card should be saved (if it is being saved). |
BillingCycle
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
start_datetime | string(datetime) | false | read-only | When the billing cycle began or will begin. |
end_datetime | string(datetime) | false | read-only | When the billing cycle ended or will end. |
BuyPage
{
"id": "123",
"buy_page_sections": [
{
"id": "123",
"name": "Intro Offers",
"product_listings": [
{
"id": "123",
"banner": "New Item!!",
"currency_code": "USD",
"description": "Farm to table credits to get you into class.",
"is_in_stock": true,
"is_live_stream": true,
"is_promoted": true,
"is_valid_promo_for_user": true,
"name": "Farm to Table Credit",
"num_in_stock": 20,
"price": 200,
"price_incl_tax": 220,
"product_type": "credits",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
]
}
],
"name": "New York Buy Page"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
buy_page_sections | [BuyPageSection] | false | read-only | none |
name | string | false | read-only | none |
BuyPageSection
{
"id": "123",
"name": "Intro Offers",
"product_listings": [
{
"id": "123",
"banner": "New Item!!",
"currency_code": "USD",
"description": "Farm to table credits to get you into class.",
"is_in_stock": true,
"is_live_stream": true,
"is_promoted": true,
"is_valid_promo_for_user": true,
"name": "Farm to Table Credit",
"num_in_stock": 20,
"price": 200,
"price_incl_tax": 220,
"product_type": "credits",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
name | string | false | read-only | none |
product_listings | [ProductListing] | false | read-only | none |
CancelPenalty
{
"is_penalty_cancel": true,
"message": "You will lose a credit for cancelling this reservation."
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
is_penalty_cancel | boolean | false | read-only | none |
message | string | false | read-only | none |
Cart
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 200,
"deferred_item_total_incl_tax": 200,
"discounts": [
{
"name": "10% Off",
"amount": "19.99",
"code": "TAKE10",
"is_automatic": false
}
],
"has_deferred_payments": true,
"is_charged_immediately": true,
"line_items": [
{
"id": "2345",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": true,
"display_message": "$200.00, plus applicable taxes and discounts, will be charged on January 1, 2025.",
"gift_card_options": null,
"is_payment_deferred": true,
"line_subtotal": 200,
"line_subtotal_incl_tax": "230.00",
"line_total": "230.00",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 1,
"required_purchase_agreement_count_for_product": 1,
"signed_purchase_agreement_count": 1,
"unit_price": "200.00",
"unit_price_incl_tax": "230.00",
"variant": {
"id": "3434",
"name": "Future-Activated Membership",
"display_attributes": ""
}
},
{
"id": "3456",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 199.98,
"line_subtotal_incl_tax": "229.98",
"line_total": "206.99",
"pending_purchase_agreement_count": 1,
"quantity": 2,
"required_purchase_agreement_count_for_line": 2,
"required_purchase_agreement_count_for_product": 1,
"signed_purchase_agreement_count": 1,
"unit_price": "99.99",
"unit_price_incl_tax": "114.99",
"variant": {
"id": "5656",
"name": "10 Guest Only Credits",
"display_attributes": ""
}
},
{
"id": "4567",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": {
"recipient_email": "best@friend.com",
"recipient_name": "My Best Friend",
"message": "Work out with me!"
},
"is_payment_deferred": false,
"line_subtotal": 50,
"line_subtotal_incl_tax": "50.00",
"line_total": "50.00",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "50.00",
"unit_price_incl_tax": "50.00",
"variant": {
"id": "7878",
"name": "$50 Email Gift Card",
"display_attributes": ""
}
}
],
"payment_gateway_type": "stripe",
"pending_purchase_agreement_count": 1,
"required_purchase_agreement_count": 3,
"requires_new_saved_card": true,
"should_display_price_incl_tax": false,
"signed_purchase_agreement_count": 2,
"subtotal": "249.98",
"subtotal_incl_tax": "279.98",
"taxes": [
{
"name": "Gritty City Tax",
"amount": "9.00"
},
{
"name": "Great State Tax",
"amount": "18.00"
}
],
"total": "256.99",
"total_discount": "19.99",
"total_tax": "27.00"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | An ID for the cart. |
applicable_account_balance | string | false | read-only | The total amount of the user's account balance that is valid for the cart. |
are_purchase_agreements_required | boolean | false | read-only | Whether the cart contains any products that require the customer to sign a purchase agreement before purchase. |
are_purchase_agreements_signed | boolean | false | read-only | Whether the customer has signed all required purchase agreements for the cart. Will be false if the cart contains no products that require purchase agreements. |
currency | string | false | read-only | A currency code associated with the cart. |
deferred_item_count | integer | false | read-only | A total count of products within the cart that will be charged at a later date. |
deferred_item_total | number(float) | false | read-only | A total monetary value associated with the deferred products within the cart. |
deferred_item_total_incl_tax | number(float) | false | read-only | A total monetary value, including tax, associated with the deferred products within the cart. |
discounts | [Discount] | false | read-only | A list of discounts applied to the cart. |
has_deferred_payments | boolean | false | read-only | A value denoting whether the cart has any associated deferred payments. |
is_charged_immediately | boolean | false | read-only | Whether payment will be collected immediately upon checkout or at a later date. |
line_items | [CartLine] | false | read-only | An array of cart lines. |
payment_gateway_type | string | false | read-only | A named value provided to denote the associated payment gateway for the cart. |
pending_purchase_agreement_count | integer | false | read-only | The number of purchase agreements awaiting signature by the customer for this cart. |
required_purchase_agreement_count | integer | false | read-only | The number of purchase agreements required for the products in the cart. |
requires_new_saved_card | boolean | false | read-only | A value denoting whether this cart requires a new saved bankcard. |
should_display_price_incl_tax | boolean | false | read-only | Whether to display monetary values as tax-inclusive or tax-exclusive for this cart. |
signed_purchase_agreement_count | integer | false | read-only | The number of purchase agreements signed by the customer for this cart. |
subtotal | string | false | read-only | A cart subtotal excluding taxes and discounts. |
subtotal_incl_tax | string | false | read-only | A cart subtotal including taxes but excluding discounts. |
taxes | [CartTaxes] | false | read-only | A list of cart taxes. |
total | string | false | read-only | A cart total including tax. |
total_discount | string | false | read-only | A total value associated with the applied cart discounts. |
total_tax | string | false | read-only | A total value associated with the applied cart taxes. |
CartClearedDiscounts
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 0,
"deferred_item_total": 0,
"deferred_item_total_incl_tax": 0,
"discounts": [],
"has_deferred_payments": false,
"is_charged_immediately": false,
"line_items": [
{
"id": "123",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"display_message": null,
"gift_card_options": null,
"is_payment_deferred": false,
"line_subtotal": 200,
"line_subtotal_incl_tax": "240.00",
"line_total": "240.00",
"pending_purchase_agreement_count": 0,
"quantity": 1,
"required_purchase_agreement_count_for_line": 0,
"required_purchase_agreement_count_for_product": 0,
"signed_purchase_agreement_count": 0,
"unit_price": "200.00",
"unit_price_incl_tax": "240.00",
"variant": {
"id": "3445",
"name": "Monthly Activated Membership",
"display_attributes": ""
}
}
],
"payment_gateway_type": "stripe",
"pending_purchase_agreement_count": 0,
"required_purchase_agreement_count": 0,
"requires_new_saved_card": false,
"should_display_price_incl_tax": false,
"signed_purchase_agreement_count": 0,
"subtotal": "200.00",
"subtotal_incl_tax": "240.00",
"taxes": [
{
"name": "20% Tax",
"value": "40.00"
}
],
"total": "240.00",
"total_discount": "0.00",
"total_tax": "40.00"
}
Same schema as cart, just with empty discount array.
Properties
None
CartLine
{
"id": "123",
"are_purchase_agreements_required": true,
"are_purchase_agreements_signed": false,
"display_message": "The payment for this product will be collected on a future date.",
"gift_card_options": {
"recipient_email": "first_and_last@emailprovider.com",
"recipient_name": "First A. Last",
"message": "Thought you would love this gift card!"
},
"line_subtotal": 12.9,
"line_subtotal_incl_tax": "13.07",
"line_total": "13.07",
"pending_purchase_agreement_count": 1,
"quantity": 1,
"required_purchase_agreement_count_for_line": 2,
"required_purchase_agreement_count_for_product": 1,
"signed_purchase_agreement_count": 1,
"unit_price": "12.00",
"unit_price_incl_tax": "13.07",
"variant": {
"id": "123",
"name": "Cool Product",
"display_attributes": "Blue, XL"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | An ID for the cart. |
are_purchase_agreements_required | boolean | false | read-only | Whether the product for this cart line requires a customer to sign a purchase agreement before purchase. |
are_purchase_agreements_signed | boolean | false | read-only | Whether the customer has signed all required purchase agreements for this cart line. Will be false if the product does not require any purchase agreements. |
display_message | string | false | read-only | An optional sub-title for the cart line. |
gift_card_options | GiftCardOptions | false | none | An optional representation of associated gift card details. |
line_subtotal | number(float) | false | read-only | A value for the line price excluding tax and discounts. |
line_subtotal_incl_tax | string | false | read-only | A value for the line price including tax, and excluding discounts. |
line_total | string | false | read-only | A value for the line price including tax and discounts. |
pending_purchase_agreement_count | integer | false | read-only | The number of purchase agreements awaiting signature by the customer for this cart line. |
quantity | integer | false | read-only | A total quantity associated with the cart line. |
required_purchase_agreement_count_for_line | integer | false | read-only | The total number of purchase agreements required for this cart line. |
required_purchase_agreement_count_for_product | integer | false | read-only | The number of purchase agreements required for each sale of this product. |
signed_purchase_agreement_count | integer | false | read-only | The number of purchase agreements signed by the customer for this cart line. |
unit_price | string | false | read-only | A price excluding tax and discounts for the product associated with the cart line. |
unit_price_incl_tax | string | false | read-only | A price including tax, and excluding discounts, for the product associated with the cart line. |
variant | Variant | false | none | A representation of the product associated with the cart line. |
CartTaxes
{
"name": "A Tax",
"amount": "13.79"
}
A representation of taxes associated with the cart.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
name | string | false | read-only | A name given to the tax. |
amount | string | false | read-only | A numeric value associated with the tax. |
Class
{
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | The ID of the class. |
available_spot_count | integer | false | read-only | The total number of primary and secondary spot that are available to be booked. |
booking_start_datetime | string(datetime) | false | read-only | A timestamp indicating when booking for this class opens. This may vary depending on which active payment options a user has in their account. |
is_late_cancel_overridden | boolean | false | read-only | Detects whether or not there is a late cancel window override set on a class. |
is_free_class | boolean | false | read-only | Describes whether or not a class is free. |
capacity | integer | false | read-only | The total number of primary and secondary spots in the class. |
class_tags | [ClassTag] | false | read-only | A list of the tags associated with this class. |
class_type | ClassType | false | none | Class type information. |
classroom | Classroom | false | none | Classroon information. |
classroom_name | string | false | read-only | The name of the classroom where the class will be held. |
geo_check_in_end_datetime | string(datetime) | false | read-only | A timestamp indicating when the class geo check-in window ends. |
geo_check_in_start_datetime | string(datetime) | false | read-only | A timestamp indicating when the class geo check-in window begins. |
instructors | [Instructor] | false | read-only | A list of the instructors that are teaching this class. This list does not include instructors that have been substituted. |
in_live_stream_window | boolean | false | read-only | none |
is_cancelled | boolean | false | read-only | Whether the class has been cancelled by the studio. |
is_remaining_spot_count_public | boolean | false | read-only | Whether the remaining spot count is public for this class. |
is_user_guest_reserved | boolean | false | read-only | Whether the current user has booked a reservation for another user in the class. |
is_user_reserved | boolean | false | read-only | Whether the current user has a standard or standby reservation in the class. |
is_user_waitlisted | boolean | false | none | Whether the current user has a waitlist reservation in the class. |
layout_format | string | false | read-only | The type of layout that is being used for this class. The options for this field are pick-a-spot and first-come-first-serve . If the class is using a pick a spot layout, then the spots in the class will have x and y coordinates that can be used to create a map of the class. For first come first serve classes, spot information is not relevant for booking. |
location | LocationWithRegion | false | none | none |
name | string | false | read-only | This is either the name of the class type associated with this class, or a custom name given to this class. |
spot_options | SpotOptions | false | none | Detailed information about the spots available in the class. |
start_date | string(date) | false | read-only | The date the class starts. This is always shown in local time for the class. |
start_datetime | string(datetime) | false | read-only | A timestamp indicating when this class starts. This is always given in UTC. |
start_time | string(time) | false | read-only | The time the class starts. This is always shown in local time for the class. |
status | string | false | read-only | A formatted string indicating the current status of the class for display purposes. Options are Class Cancelled , Not Open , Class Full , Waitlist Full , and Waitlist Only . This may be null. |
waitlist_count | integer | false | read-only | The number of reservations currently on the waitlist. This will be null if the brand has decided not to make this information public. |
ClassFilter
{
"min_start_date": "2023-05-26",
"max_start_date": "2023-05-26",
"min_start_time": "string",
"max_start_time": "string",
"region": 0,
"location": 0,
"classroom": 0,
"instructor": 0,
"is_live_stream": "string",
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
min_start_date | string(date) | false | none | The earliest date in a range of class start dates in the format "YYYY-MM-DD" |
max_start_date | string(date) | false | none | The latest date in a range of class start dates in the format "YYYY-MM-DD" |
min_start_time | string(time) | false | none | The earliest time in a range of class start dates in the format "00:00" |
max_start_time | string(time) | false | none | The latest time in a range of class start dates in the format "00:00" |
region | integer | false | none | The region id as an integer |
location | integer | false | none | The location id as an integer |
classroom | integer | false | none | The classroom id as an integer |
instructor | integer | false | none | The instructor employee id as an integer |
is_live_stream | string(Boolean) | false | none | Whether a class is livestream, true or false |
meta | Meta | false | none | Pagination metadata. |
ClassList
{
"results": [
{
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3,
"reservations": [
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3
}
]
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | [ClassWithReservations] | false | read-only | A list of classes. |
meta | Meta | false | none | Pagination metadata. |
links | Links | false | none | Links to pages. |
ClassReservation
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | The ID of the reservation. |
is_booked_by_me | boolean | false | read-only | Whether the authenticated user booked and paid for this reservation. |
is_booked_for_me | boolean | false | read-only | Whether the authenticated user will be the participant for this reservation. |
reservation_type | string | false | none | Options are standard , standby , and waitlist . |
spot | Spot | false | none | Details about the spot that was reserved for this class. This field will be null if the class layout format is first-come-first-serve . |
status | string | false | none | The current status of the reservation. Options are pending , check in , standard cancel , penalty cancel , graced cancel , penalty no show , graced no show , removed , penalty removed , and class cancelled . |
waitlist_position | integer | false | read-only | The position of this reservation on the waitlist. This will be null if the reservation is not on the waitlist or the brand has decided not to make this information public. |
Classroom
{
"id": "678",
"name": "Spin Room"
}
Classroon information.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
name | string | false | read-only | none |
ClassSpot
{
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0,
"is_available": true
}
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | Spot | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» is_available | boolean | false | read-only | Whether the spot is available to be booked for the given class. |
ClassTag
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | The ID of the class tag. |
name | string | false | read-only | The class tag's display name. |
slug | string | false | read-only | The class tag's slug. |
ClassType
{
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
}
Class type information.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | The ID of the class type. |
description | string | false | read-only | A description of the class type. There is no restriction on the length of class descriptions. |
duration | integer | false | read-only | The duration of the class in minutes. |
duration_formatted | string | false | read-only | A formatted representation of the duration of the class. For example, if the duration is 45 then this will be 45 minutes , and if the duration is 90 then this will be 1 hour 30 minutes . |
is_live_stream | boolean | false | read-only | none |
name | string | false | read-only | The name of the class type. |
ClassWithReservations
{
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3,
"reservations": [
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3
}
]
}
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | Class | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» reservations | [ClassReservation] | false | read-only | A list of reservations booked either by or for the current user. |
ClassWithReservationsAndLayout
{
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3,
"reservations": [
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3
}
],
"layout": {
"id": "1278",
"name": "Big Spin Layout",
"spots": [
{
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0,
"is_available": true
}
]
}
}
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | ClassWithReservations | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» layout | Layout | false | none | none |
Config
{
"california_privacy_policy": "https://marianatek.com/california-privacy",
"email_marketing_opt_in_copy": "Opt-in to receive emails from us about upcoming classes, special events, promotions, and more. You can opt out at any time by editing the communication settings on your account profile.",
"privacy_policy": "https://marianatek.com/privacy",
"sms_marketing_opt_in_copy": "Opt-in to receive text messages from us about upcoming classes, special events, promotions, and more. You can opt out at any time by replying STOP or editing the communication settings on your account profile.",
"legal_documents": [
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false
}
],
"terms_of_service": "https://marianatek.com/terms",
"tracking_consent_copy": {
"android": {
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
},
"ios": {
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
},
"web-integrations": {
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
}
},
"are_optional_cookies_enabled_by_default": true,
"are_pronouns_enabled": true,
"are_purchase_agreements_enabled": false,
"brand_name": "Ohami Yogi",
"brand_url": "https://mydomain.com/",
"facebook_pixel_id": "123456789",
"google_tag_manager_id": "GTM-XXXX",
"ios_is_in_app_purchase_enabled": false,
"is_cookie_banner_enabled": false,
"is_multi_currency": false,
"is_pre_checked_newsletter_subscription_enabled": false,
"is_research_opt_in_enabled": false,
"is_sms_opt_in_enabled": false,
"is_guest_email_required": false,
"limit_complimentary_account_balance_by_location_enabled": false,
"limit_cash_backed_account_balance_by_location_enabled": false,
"locale_settings": {
"date_input_format": "M/d/y",
"date_input_placeholder": "MM/DD/YYYY",
"time_input_format": "h:mm a"
},
"mobile_app_tabs": [
{
"is_active": true,
"page_name": "My Awesome Page",
"page_url": "https://www.google.com",
"tab_name": "My Great Tab",
"tab_icon_ios": "gift-box",
"tab_icon_android": "exclamation-point"
}
],
"process_deferred_orders_offset": 60,
"schema_name": "ohami_yoga"
}
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | Legal | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» are_optional_cookies_enabled_by_default | boolean | false | read-only | Whether we can enable optional cookies in customer apps by default, prior to users opting in or out |
» are_pronouns_enabled | boolean | false | read-only | Whether user pronouns are visible for this brand. |
» are_purchase_agreements_enabled | boolean | false | read-only | Whether the purchase agreement feature is enabled for this brand. |
» brand_name | string | false | read-only | The name of the brand. |
» brand_url | string | false | read-only | A link to the URL for this brand. |
» facebook_pixel_id | string | false | read-only | A brand-specific Facebook pixel tracking ID. |
» google_tag_manager_id | string | false | read-only | A brand-specific Google Tag Manager (GTM) ID. |
» ios_is_in_app_purchase_enabled | boolean | false | read-only | Whether the current client is configured to support Apple iOS in-app purchases. |
» is_cookie_banner_enabled | boolean | false | read-only | Whether the banner informing users about our use of cookies in customer apps should appear |
» is_multi_currency | boolean | false | read-only | Whether the current client supports multi-currency (i.e., has domestic and international locations). |
» is_pre_checked_newsletter_subscription_enabled | boolean | false | read-only | Whether the pre-checked selection of the newsletter subscribe action when creating new user accounts is enabled. |
» is_research_opt_in_enabled | boolean | false | read-only | Whether the current client is included in our research program. |
» is_sms_opt_in_enabled | boolean | false | read-only | Whether the ability to opt-in to SMS marketing is enabled for users of this brand. |
» is_guest_email_required | boolean | false | read-only | Boolean which indicates if email address is required for any guests of a customer. |
» limit_complimentary_account_balance_by_location_enabled | boolean | false | read-only | Whether the complimentary account balances for users of this brand are limited by location. |
» limit_cash_backed_account_balance_by_location_enabled | boolean | false | read-only | Whether the cash-backed account balances for users of this brand are limited by location. |
» locale_settings | LocaleSettings | false | none | Date/Time formats that respond to the user's locale |
» mobile_app_tabs | [MobileAppTab] | false | read-only | A list of mobile app tabs. |
» process_deferred_orders_offset | number | false | read-only | A brand-specific value for minutes before class to processing and fulfilling deferred orders. |
» schema_name | string | false | read-only | The schema name for a tenant |
Country
{
"iso_3166_1_a2": "US",
"iso_3166_1_a3": "USA",
"name": "United States of America",
"printable_name": "United States",
"address_format": {
"address_fields": [
{
"field": "address_line_one",
"label": "Address Line 1"
},
{
"field": "address_line_two",
"label": "Address Line 2"
},
{
"field": "city",
"label": "City"
},
{
"field": "state_province",
"label": "State"
},
{
"field": "postal_code",
"label": "ZIP Code"
}
]
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
iso_3166_1_a2 | string | false | read-only | The two-letter code defined in ISO 3166-1 to represent a country, dependent territory, or area of special geographic interest. |
iso_3166_1_a3 | string | false | read-only | The three-letter code defined in ISO 3166-1 to represent a country, dependent territory, or area of special geographic interest. |
name | string | false | read-only | The full official name of a country. |
printable_name | string | false | read-only | The commonly used name of a country. |
address_format | AddressFormat | false | none | Object containing information for generating address forms with API fields relevant to the country, and the correct terms to use in labels displayed to users. |
CountryList
{
"results": [
{
"iso_3166_1_a2": "US",
"iso_3166_1_a3": "USA",
"name": "United States of America",
"printable_name": "United States",
"address_format": {
"address_fields": [
{
"field": "address_line_one",
"label": "Address Line 1"
},
{
"field": "address_line_two",
"label": "Address Line 2"
},
{
"field": "city",
"label": "City"
},
{
"field": "state_province",
"label": "State"
},
{
"field": "postal_code",
"label": "ZIP Code"
}
]
}
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | [Country] | false | read-only | A list of countries. |
meta | Meta | false | none | Pagination metadata. |
links | Links | false | none | Links to pages. |
Credit
{
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
credits_remaining | integer | false | read-only | How many credits are still available to be used. |
credits_total | integer | false | read-only | How many credits were originally purchased or gifted to the user. |
credits_used | integer | false | read-only | How many credits have been used to make reservations. |
expiration_datetime | string(datetime) | false | read-only | none |
is_expired | boolean | false | read-only | none |
is_valid_for_guests | boolean | false | read-only | Whether the credit can be used to make a reservation for a guest. |
name | string | false | read-only | none |
CreditCard
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"ccv": "string",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"number": 0,
"partner_reference": "string",
"postal_code": "12345",
"state_province": "DC",
"usage_location": "123",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | The ID of the credit card. |
address_line_one | string | false | none | Billing address. |
address_line_two | string | false | none | Apartment/Suite/Unit. |
card_type | string | false | none | The brand of the card. Options are Visa , Mastercard , American Express , and Discover . |
ccv | string | false | write-only | Used only when saving a new card. |
city | string | false | none | City associated with the billing address. |
country | string | false | none | An ISO 3166-1 alpha-2 country code. |
expiration_month | string | false | none | The month the card expires. Formatted as MM . |
expiration_year | string | false | none | The month the card expires. Formatted as YYYY . |
first_name | string | false | none | First name of the cardholder. |
formatted_address | array(string) | false | none | List containing pieces of address information grouped, or separated, according to the expectations for that country. |
is_editable | boolean | false | read-only | A value denoting whether the credit card may be edited. |
is_expired | boolean | false | read-only | Whether the credit card has expired. |
last_four | string | false | none | The last four digits of the card number. |
last_name | string | false | none | Last name of the card holder. |
name | string | false | none | The name of the card holder. |
number | integer | false | write-only | Used only when saving new credit cards. |
partner_reference | string | false | write-only | Used only when saving new credit cards. |
postal_code | string | false | none | Zip/Postal code associated with the billing address. |
state_province | string | false | none | State/Province associated with the billing address. |
usage_location | string | false | write-only | The ID of the location where this card should be saved. Used only when saving new credit cards. |
usage_locations | [LocationWithRegion] | false | read-only | A list of the locations where this card can be used. This list is dictated by the payment gateway with which this card has been stored. |
CreditCardList
{
"results": [
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"ccv": "string",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"number": 0,
"partner_reference": "string",
"postal_code": "12345",
"state_province": "DC",
"usage_location": "123",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | [CreditCard] | false | read-only | A list of credit cards. |
meta | Meta | false | none | Pagination metadata. |
links | Links | false | none | Links to pages. |
CreditList
{
"results": [
{
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | [Credit] | false | read-only | A list of credits. |
meta | Meta | false | none | Pagination metadata. |
links | Links | false | none | Links to pages. |
CurrencyValue
{
"amount": "100.00",
"currency": "USD",
"locations": [
{
"id": "123",
"name": "Dupont Circle"
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
amount | string | false | read-only | none |
currency | string | false | read-only | none |
locations | [LocationSimplified] | false | read-only | A list of locations. |
Discount
{
"name": "10% Off",
"amount": "19.99",
"code": "TAKE10",
"is_automatic": false
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
name | string | false | read-only | A name given to the discount. |
amount | string | false | read-only | A numeric value associated with the discount. |
code | string | false | read-only | An optional code assigned to the discount. |
is_automatic | boolean | false | read-only | Whether the discount is automatically applied to an applicable cart. |
EmptyCart
{
"id": "123",
"applicable_account_balance": "100.0",
"are_purchase_agreements_required": false,
"are_purchase_agreements_signed": false,
"currency": "USD",
"deferred_item_count": 0,
"deferred_item_total": 0,
"deferred_item_total_incl_tax": 0,
"discounts": [],
"has_deferred_payments": false,
"is_charged_immediately": true,
"line_items": [],
"payment_gateway_type": "stripe",
"pending_purchase_agreement_count": 0,
"required_purchase_agreement_count": 0,
"requires_new_saved_card": false,
"should_display_price_incl_tax": false,
"signed_purchase_agreement_count": 0,
"subtotal": 0,
"subtotal_incl_tax": "0.00",
"taxes": [],
"total": "0.00",
"total_discount": "0.00",
"total_tax": "0.00"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | An ID for the cart. |
applicable_account_balance | string | false | read-only | The total amount of the user's account balance that is valid for the cart. |
are_purchase_agreements_required | boolean | false | read-only | Whether the cart contains any products that require customers to sign a purchase agreement before purchase. |
are_purchase_agreements_signed | boolean | false | read-only | Whether the customer has signed all required purchase agreements for the cart. Will be false if the cart contains no products that require purchase agreements. |
currency | string | false | read-only | A currency code associated with the cart. |
deferred_item_count | integer | false | read-only | A total count of deferred products within the cart. |
deferred_item_total | number(float) | false | read-only | A total monetary value associated with the deferred products within the cart. |
deferred_item_total_incl_tax | number(float) | false | read-only | A total monetary value, including tax, associated with the deferred products within the cart. |
discounts | [Discount] | false | read-only | none |
has_deferred_payments | boolean | false | read-only | A value denoting whether the cart has any associated deferred payments. |
is_charged_immediately | boolean | false | read-only | Whether payment will be collected immediately upon checkout or at a later date. |
line_items | [CartLine] | false | read-only | An array of cart lines. |
payment_gateway_type | string | false | read-only | A named value provided to denote the associated payment gateway for the cart. |
pending_purchase_agreement_count | integer | false | read-only | The number of purchase agreements awaiting signature by the user for this cart. |
required_purchase_agreement_count | integer | false | read-only | The number of purchase agreements required for the products in the cart. |
requires_new_saved_card | boolean | false | read-only | A value denoting whether this cart requires a new saved bankcard. |
should_display_price_incl_tax | boolean | false | read-only | Whether to display monetary values as tax-inclusive or tax-exclusive for this cart. |
signed_purchase_agreement_count | integer | false | read-only | The number of purchase agreements signed by the user for this cart. |
subtotal | number(float) | false | read-only | A cart subtotal excluding taxes and discounts. |
subtotal_incl_tax | string | false | read-only | A cart subtotal including taxes but excluding discounts. |
taxes | [CartTaxes] | false | read-only | A representation of taxes associated with the cart. |
total | string | false | read-only | A cart total including tax. |
total_discount | string | false | read-only | A total value associated with the applied cart discounts. |
total_tax | string | false | read-only | A total value associated with the applied cart taxes. |
Font
{
"css_source": "https://fonts.googleapis.com/css?family=Lato:300,400,700",
"font_family": "Helvetica Neue"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
css_source | string | false | read-only | none |
font_family | string | false | read-only | none |
GiftCardOptions
{
"recipient_email": "first_and_last@emailprovider.com",
"recipient_name": "First A. Last",
"message": "Thought you would love this gift card!"
}
An optional representation of associated gift card details.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
recipient_email | string(email) | false | read-only | An email associated with the gift card recipient. |
recipient_name | string | false | read-only | A name associated with the gift card recipient. |
message | string | false | read-only | An optional custom message provided for the gift card. |
Instructor
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | The ID of the instructors. |
bio | string | false | read-only | A bio provided by the instructor to be shown in their public profile. There is no restriction on the length of an instructor bio. |
instagram_handle | string | false | read-only | An Instagram handle provided by the instructor. |
instagram_url | string | false | read-only | If an Instagram handle is provided, the corresponding Instagram URL is generated automatically. |
name | string | false | read-only | The instructor's display name. |
photo_urls | object | false | read-only | Photos of the instructor that can be used for schedules or instructor profiles. |
» large_url | string | false | read-only | A url for a photo provided by the instructor to appear in their public profile. |
» thumbnail_url | string | false | read-only | A url for a thumbnail provided by the instructor to appear in their public profile. |
spotify_url | string | false | read-only | A Spotify URL provided by the instructor. |
Layout
{
"id": "1278",
"name": "Big Spin Layout",
"spots": [
{
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0,
"is_available": true
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
name | string | false | read-only | none |
spots | [ClassSpot] | false | read-only | none |
Legal
{
"california_privacy_policy": "https://marianatek.com/california-privacy",
"email_marketing_opt_in_copy": "Opt-in to receive emails from us about upcoming classes, special events, promotions, and more. You can opt out at any time by editing the communication settings on your account profile.",
"privacy_policy": "https://marianatek.com/privacy",
"sms_marketing_opt_in_copy": "Opt-in to receive text messages from us about upcoming classes, special events, promotions, and more. You can opt out at any time by replying STOP or editing the communication settings on your account profile.",
"legal_documents": [
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false
}
],
"terms_of_service": "https://marianatek.com/terms",
"tracking_consent_copy": {
"android": {
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
},
"ios": {
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
},
"web-integrations": {
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
}
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
california_privacy_policy | string | false | read-only | A link to the California-specific Privacy Policy for this brand. |
email_marketing_opt_in_copy | boolean | false | read-only | Disclaimer text to display in the account creation form and user profile above the checkbox to subscribe to email marketing. |
privacy_policy | string | false | read-only | A link to the Privacy Policy for this brand. |
sms_marketing_opt_in_copy | boolean | false | read-only | Disclaimer text to display in the account creation form and user profile above the checkbox to subscribe to SMS marketing. |
legal_documents | [LegalDocument] | false | none | none |
terms_of_service | string | false | read-only | A link to the Terms of Service for this brand. |
tracking_consent_copy | object | false | none | none |
» android | TrackingConsentCopy | false | none | Copy to be displayed during tracking consent flow. |
» ios | TrackingConsentCopy | false | none | Copy to be displayed during tracking consent flow. |
» web-integrations | TrackingConsentCopy | false | none | Copy to be displayed during tracking consent flow. |
LegalDocument
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
document_id | string(uuid) | false | read-only | The unique UUID of the legal document. |
is_active | boolean | false | none | Whether the legal document is active. |
is_signable_by_checkbox | boolean | false | none | Whether the legal document is able to me signed and agreed to by the user selecting a checkbox. |
name | string | false | none | The name (a.k.a. title) of the legal document. |
url | string | false | none | The url pointing to the legal document |
document_type | string | false | none | Category of the legal document. |
is_required_for_users | boolean | false | none | Boolean indicating if Legal Document is required to be signed by all users, including all employees. |
is_required_for_employees | boolean | false | none | Boolean indicating if Legal Document is not required for all users, but is required for all employees. |
Links
{
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
Links to pages.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
first | string | false | read-only | A link to the first page. |
last | string | false | read-only | A link to the last page. |
next | string | false | read-only | A link to the next page. |
prev | string | false | read-only | A link to the previous page. |
LocaleSettings
{
"date_input_format": "M/d/y",
"date_input_placeholder": "MM/DD/YYYY",
"time_input_format": "h:mm a"
}
Date/Time formats that respond to the user's locale
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
date_input_format | string | false | read-only | The CLDR-supported short date format for the user's locale. |
date_input_placeholder | string | false | read-only | Localized date format placeholder for use in date inputs. |
time_input_format | string | false | read-only | The CLDR-supported short time format for the user's locale. |
Location
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | The unique ID for the item. |
address_line_one | string | false | read-only | Street address. |
address_line_two | string | false | read-only | Apartment/Suite/Unit. |
address_line_three | string | false | read-only | Neighborhood, or other "dependent locality" in countries such as New Zealand or Brazil |
city | string | false | read-only | City associated with the street address. |
currency_code | string | false | read-only | The three-digit ISO 4217 code for the currency used at this location. All products available at this location will be priced in this currency, and all payments collected at this location will be processed in this currency. |
description | string | false | read-only | Details about the location. There is no restriction on the length of this description. |
string(email) | false | read-only | Contact email address. | |
formatted_address | array(string) | false | read-only | List containing pieces of address information grouped, or separated, according to the expectations for that country |
gate_geo_check_in_by_distance | boolean | false | read-only | Whether to restrict geo check-in based on the user's proximity to the studio and the configured geo_check_in_distance. |
geo_check_in_distance | integer | false | read-only | Currently configured geo check-in distance in meters. |
is_newsletter_subscription_pre_checked | boolean | false | none | Whether to enable pre-checked selection of the newsletter subscribe action when creating new user accounts for this location. |
latitude | string | false | read-only | The geopgrahical latitude of the location. |
longitude | string | false | read-only | The geopgrahical longtitude of the location. |
name | string | false | read-only | Display name. |
payment_gateway_type | string | false | read-only | none |
phone_number | string | false | read-only | Contact phone number. |
postal_code | string | false | read-only | Zip/Postal code associated with the street address. |
sorting_code | string | false | read-only | Sorting Code used in addresses for some countries, such as "Lilongwe 3" |
state_province | string | false | read-only | State/Province associated with the street address. |
timezone | string | false | read-only | none |
LocationList
{
"results": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | [LocationWithRegion] | false | read-only | A list of locations. |
meta | Meta | false | none | Pagination metadata. |
links | Links | false | none | Links to pages. |
LocationSimplified
{
"id": "123",
"name": "Dupont Circle"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | The ID of the location. |
name | string | false | read-only | The name of the location. |
LocationWithRegion
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | Location | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» region | RegionSimplified | false | none | none |
Membership
{
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
billing_cycles | [BillingCycle] | false | read-only | An array of past intervals with start_datetime and end_datetime. |
booking_window_display | string | false | read-only | Optional. A human-readable description of the booking rules for this membership. |
commitment_length | integer | false | read-only | How many payments are required before the user can cancel the membership. |
customer_usage_limit | integer | false | read-only | How many times the user can use the membership to make reservations for themselves during each payment interval. |
end_date | string(date) | false | read-only | none |
freeze_start_date | string(date) | false | read-only | none |
freeze_end_date | string(date) | false | read-only | none |
guest_remaining_usage_count | integer | false | read-only | How many more times the user can use the membership to make reservations for a guest during the current payment interval. |
guest_usage_limit | integer | false | read-only | How many times the user can use the membership to make reservations for a guest during each payment interval. |
is_active | boolean | false | read-only | none |
is_charge_declined | boolean | false | read-only | Whether a renewal payment or penalty fee failed to process for the membership. |
name | string | false | read-only | none |
next_charge_date | string(date) | false | read-only | none |
payment_interval | string | false | read-only | The unit for the membership's payment interval. Options are DY , MO , WK , and YR . |
payment_interval_length | integer | false | read-only | The length of each payment interval, as measured by the unit defined by payment_interval . For example, a payment_interval of MO and a payment_interval_length of 1 indicates a membership that renews every month, while payment_interval of WK and a payment_interval_length of 2 indicate a membership that renews every 2 weeks. |
penalty_fee_failure_date | string(date) | false | read-only | none |
product_id | string | false | read-only | The ID of the product associated with this membership. |
purchase_date | string(date) | false | read-only | none |
purchase_location | Location | false | none | none |
purchase_signatures | [PurchaseSignature] | false | none | A list of the purchase signatures attached to the membership. |
remaining_renewal_count | integer | false | read-only | How many more payments will be processed before the membership expires. |
remaining_usage_count | integer | false | read-only | How many more times the user can use the membership to make reservations for themselves during the current payment interval. |
renewal_count | integer | false | read-only | The number of payments the user has made toward this membership. |
renewal_currency | string(currency) | false | read-only | none |
renewal_rate | number(float) | false | read-only | The tax-exclusive price charged to the user every time the membership renews. Excludes discounts. |
renewal_rate_incl_tax | string | false | read-only | The tax-inclusive price charged to the user every time the membership renews. Excludes discounts. |
should_display_price_incl_tax | boolean | false | read-only | Whether to display the renewal rate of this membership as tax-inclusive or tax-exclusive. |
start_date | string(date) | false | read-only | none |
start_type | string | false | read-only | Options are date_purchased , first_usage , and specific_start . |
status | string | false | read-only | Options are Pending , Charge Declined - Renewal , Charge Declined - Penalty Fee , Expired , and Cancelled . |
valid_locations | [Location] | false | read-only | A list of the locations where this membership can be used. This list is dictated by the payment permissions. |
MembershipList
{
"results": [
{
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | [Membership] | false | read-only | A list of memberships. |
meta | Meta | false | none | Pagination metadata. |
links | Links | false | none | Links to pages. |
Meta
{
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
}
Pagination metadata.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
pagination | object | false | none | Pagination information. |
» count | integer | false | read-only | The total number of items. |
» pages | integer | false | read-only | The total number of pages. |
» page | integer | false | none | The current page. |
MobileAppTab
{
"is_active": true,
"page_name": "My Awesome Page",
"page_url": "https://www.google.com",
"tab_name": "My Great Tab",
"tab_icon_ios": "gift-box",
"tab_icon_android": "exclamation-point"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
is_active | boolean | false | read-only | Whether the mobile tab is configured as active or inactive. |
page_name | string | false | read-only | The name of the mobile app tab's associated page. |
page_url | string | false | read-only | The value of the URL associated with the mobile app tab. |
tab_name | string | false | read-only | The name of the mobile app tab. |
tab_icon_ios | string | false | read-only | The slug value for the mobile app icon (on iOS devices) to be used for the app tab. |
tab_icon_android | string | false | read-only | The slug value for the mobile app icon (on Android devices) to be used for the app tab. |
OrderReference
{
"id": "123",
"number": "7SV3-QC27-42RD"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
number | string | false | read-only | A unique identifier for this order |
Order
{
"id": "123",
"number": "7SV3-QC27-42RD",
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 100,
"deferred_item_total_incl_tax": 105,
"is_cancellation_allowed": true,
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"net_total": "200.75",
"order_lines": [
{
"id": "123",
"display_message": "",
"is_payment_deferred": false,
"product_name": "Cool Product",
"product_type": "Credit",
"product_display_attributes": "Blue, XL",
"quantity": 2,
"status": "Pending",
"subtotal": "122.40",
"subtotal_excl_discounts": "136.00",
"subtotal_incl_tax": "144.16",
"total_tax": "7.34",
"total": "129.74",
"unit_price": "68.00",
"unit_price_incl_tax": "72.08"
}
],
"payment_sources": [
{
"id": "123",
"amount_paid": "9.99",
"amount_refunded": "0.00",
"name": "Visa ending in 1111",
"payment_type": "Visa"
}
],
"placed_datetime": "2020-08-24T20:09:31.868685Z",
"refund_total": "0.00",
"should_display_price_incl_tax": false,
"status": "Completed",
"subtotal": "237.50",
"subtotal_excl_discounts": "250.00",
"subtotal_incl_tax": "265.00",
"taxes": [
{
"name": "A Tax",
"value": "13.79"
}
],
"total": "251.75",
"total_discount": "12.50",
"total_tax": "14.25"
}
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | OrderReference | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» currency | string | false | read-only | none |
» deferred_item_count | number | false | read-only | A total count of products included in the order that will be charged at a later date. |
» deferred_item_total | number(float) | false | read-only | A monetary value associated with the products included in the order that will be charged at a later date. |
» deferred_item_total_incl_tax | number(float) | false | read-only | A monetary value, including tax, associated with the products included in the order that will be charged at a later date. |
» is_cancellation_allowed | boolean | false | read-only | none |
» location | Location | false | none | none |
» net_total | string | false | read-only | The net total of the order, factoring in refunds |
» order_lines | [OrderLine] | false | read-only | none |
» payment_sources | [PaymentSource] | false | read-only | none |
» placed_datetime | string | false | read-only | none |
» refund_total | string | false | read-only | The monetary amount refunded to the user if the order has been fully or partially refunded. |
» should_display_price_incl_tax | boolean | false | read-only | Whether to display monetary values as tax-inclusive or tax-exclusive for the order. |
» status | string | false | read-only | none |
» subtotal | string | false | read-only | An order subtotal including discounts, but excluding taxes. |
» subtotal_excl_discounts | string | false | read-only | An order subtotal excluding taxes and discounts. |
» subtotal_incl_tax | string | false | read-only | An order subtotal including taxes, but excluding discounts. |
» taxes | [OrderTaxes] | false | read-only | [A representation of taxes associated with the order.] |
» total | string | false | read-only | The total cost of the order. Includes taxes and discounts. |
» total_discount | string | false | read-only | The total monetary value of any discounts applied to the order. |
» total_tax | string | false | read-only | The total monetary value of any taxes applied to the order. |
OrderRetrieve
{
"id": "123",
"number": "7SV3-QC27-42RD",
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 100,
"deferred_item_total_incl_tax": 105,
"is_cancellation_allowed": true,
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"net_total": "200.75",
"order_lines": [
{
"id": "123",
"display_message": "",
"is_payment_deferred": false,
"product_name": "Cool Product",
"product_type": "Credit",
"product_display_attributes": "Blue, XL",
"quantity": 2,
"status": "Pending",
"subtotal": "122.40",
"subtotal_excl_discounts": "136.00",
"subtotal_incl_tax": "144.16",
"total_tax": "7.34",
"total": "129.74",
"unit_price": "68.00",
"unit_price_incl_tax": "72.08",
"child_orders": [
{
"id": "123",
"number": "7SV3-QC27-42RD"
}
]
}
],
"payment_sources": [
{
"id": "123",
"amount_paid": "9.99",
"amount_refunded": "0.00",
"name": "Visa ending in 1111",
"payment_type": "Visa"
}
],
"placed_datetime": "2020-08-24T20:09:31.868685Z",
"refund_total": "0.00",
"should_display_price_incl_tax": false,
"status": "Completed",
"subtotal": "237.50",
"subtotal_excl_discounts": "250.00",
"subtotal_incl_tax": "265.00",
"taxes": [
{
"name": "A Tax",
"value": "13.79"
}
],
"total": "251.75",
"total_discount": "12.50",
"total_tax": "14.25",
"discounts": [
{
"name": "10% Off",
"amount": "19.99",
"code": "TAKE10",
"is_automatic": false
}
],
"has_all_order_details": true,
"order_details": [
{
"action_datetime": "2021-09-21T17:13:57.958540Z",
"action_display": "created",
"description": "System created this order for 1 item",
"fulfillment_timezone": "Europe/London",
"invoice_pdf_url": "/media/invoice/9/invoice-20210921-2.pdf",
"item_quantity": 1,
"order_event_id": null,
"order_event_index": null,
"parent_order_id": "1735",
"parent_order_number": "JCBA-CUK4-4IQX",
"status": "Pending",
"status_display": "Order created",
"total": "0.00"
}
],
"parent_order": {
"id": "123",
"number": "7SV3-QC27-42RD"
}
}
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | Order | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» discounts | [Discount] | false | read-only | A list of discount objects |
» has_all_order_details | boolean | false | read-only | Indicates whether or not the information on the order_details attribute fully and accurately represents the states an Order existed in. Historical orders submitted before the introduction of Order Details are only partially represented and should not be relied on. |
» order_details | [OrderDetail] | false | read-only | A list properties describing order events |
» order_lines | [OrderLineWithChildOrders] | false | read-only | Order lines, including child orders |
» parent_order | OrderReference | false | none | The order that generated this order, with id and number |
OrderLine
{
"id": "123",
"display_message": "",
"is_payment_deferred": false,
"product_name": "Cool Product",
"product_type": "Credit",
"product_display_attributes": "Blue, XL",
"quantity": 2,
"status": "Pending",
"subtotal": "122.40",
"subtotal_excl_discounts": "136.00",
"subtotal_incl_tax": "144.16",
"total_tax": "7.34",
"total": "129.74",
"unit_price": "68.00",
"unit_price_incl_tax": "72.08"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
display_message | string | false | read-only | An optional sub-title for the order line. |
is_payment_deferred | boolean | false | read-only | Whether payment for the product(s) on this order line will be collected at a later date. |
product_name | string | false | read-only | none |
product_type | string | false | read-only | none |
product_display_attributes | string | false | read-only | An optional concatenated representation of product attributes (e.g. color, size, etc.). |
quantity | number | false | read-only | none |
status | string | false | read-only | none |
subtotal | string | false | read-only | A line subtotal including discounts, but excluding taxes. |
subtotal_excl_discounts | string | false | read-only | A line subtotal excluding discounts and taxes. |
subtotal_incl_tax | string | false | read-only | A line subtotal including taxes, but excluding discounts. |
total_tax | string | false | read-only | The total monetary value of any taxes applied to the order line. |
total | string | false | read-only | The total cost of the order line. Includes taxes and discounts. |
unit_price | string | false | read-only | A price excluding tax and discounts for the product associated with the order line. |
unit_price_incl_tax | string | false | read-only | A price including tax, and excluding discounts, for the product associated with the order line. |
OrderLineWithChildOrders
{
"id": "123",
"display_message": "",
"is_payment_deferred": false,
"product_name": "Cool Product",
"product_type": "Credit",
"product_display_attributes": "Blue, XL",
"quantity": 2,
"status": "Pending",
"subtotal": "122.40",
"subtotal_excl_discounts": "136.00",
"subtotal_incl_tax": "144.16",
"total_tax": "7.34",
"total": "129.74",
"unit_price": "68.00",
"unit_price_incl_tax": "72.08",
"child_orders": [
{
"id": "123",
"number": "7SV3-QC27-42RD"
}
]
}
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | OrderLine | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» child_orders | [OrderReference] | false | read-only | A list of orders generated by the order line, with ids and numbers |
OrderList
{
"results": [
{
"id": "123",
"number": "7SV3-QC27-42RD",
"currency": "USD",
"deferred_item_count": 1,
"deferred_item_total": 100,
"deferred_item_total_incl_tax": 105,
"is_cancellation_allowed": true,
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"net_total": "200.75",
"order_lines": [
{
"id": "123",
"display_message": "",
"is_payment_deferred": false,
"product_name": "Cool Product",
"product_type": "Credit",
"product_display_attributes": "Blue, XL",
"quantity": 2,
"status": "Pending",
"subtotal": "122.40",
"subtotal_excl_discounts": "136.00",
"subtotal_incl_tax": "144.16",
"total_tax": "7.34",
"total": "129.74",
"unit_price": "68.00",
"unit_price_incl_tax": "72.08"
}
],
"payment_sources": [
{
"id": "123",
"amount_paid": "9.99",
"amount_refunded": "0.00",
"name": "Visa ending in 1111",
"payment_type": "Visa"
}
],
"placed_datetime": "2020-08-24T20:09:31.868685Z",
"refund_total": "0.00",
"should_display_price_incl_tax": false,
"status": "Completed",
"subtotal": "237.50",
"subtotal_excl_discounts": "250.00",
"subtotal_incl_tax": "265.00",
"taxes": [
{
"name": "A Tax",
"value": "13.79"
}
],
"total": "251.75",
"total_discount": "12.50",
"total_tax": "14.25"
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | [Order] | false | read-only | A list of orders. |
meta | Meta | false | none | Pagination metadata. |
links | Links | false | none | Links to pages. |
OrderTaxes
{
"name": "A Tax",
"value": "13.79"
}
A representation of taxes associated with the order.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
name | string | false | read-only | A name given to the tax. |
value | string | false | read-only | A numeric value associated with the tax. |
OrderDetail
{
"action_datetime": "2021-09-21T17:13:57.958540Z",
"action_display": "created",
"description": "System created this order for 1 item",
"fulfillment_timezone": "Europe/London",
"invoice_pdf_url": "/media/invoice/9/invoice-20210921-2.pdf",
"item_quantity": 1,
"order_event_id": null,
"order_event_index": null,
"parent_order_id": "1735",
"parent_order_number": "JCBA-CUK4-4IQX",
"status": "Pending",
"status_display": "Order created",
"total": "0.00"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
action_datetime | string | false | read-only | The date the event took place |
action_display | string | false | read-only | Verb describing the event |
description | string | false | read-only | Sentence representation of the event including broker, quantity, total, and payment |
fulfillment_timezone | string | false | read-only | none |
invoice_pdf_url | string | false | read-only | none |
item_quantity | number(integer) | false | read-only | none |
order_event_id | number(integer) | false | read-only | none |
order_event_index | number(integer) | false | read-only | none |
parent_order_id | string | false | read-only | The id of the order that generated this event |
parent_order_number | string | false | read-only | The number of the order that generated this event |
status | string | false | read-only | none |
status_display | string | false | read-only | Status displayed to end user |
total | number(string) | false | read-only | none |
PaymentMethod
{
"id": "123",
"card": {
"ccv": "123",
"expiration_month": "10",
"expiration_year": "22",
"last_four": "1111",
"name": "Wednesday Addams",
"number": 4111111111111111,
"postal_code": "12345",
"usage_location": "123"
},
"store": true
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
card | BankcardPayment | false | none | none |
store | boolean | false | none | Whether to store the payment method (if it is a bankcard payment). |
PaymentOption
{
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
Information about how a reservation can be or was paid for.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
credit_payment | Credit | false | none | none |
description | string | false | read-only | none |
error_code | string | false | read-only | none |
error_message | string | false | read-only | none |
membership_payment | Membership | false | none | none |
name | string | false | read-only | none |
type | string | false | read-only | none |
PaymentOptions
{
"user_payment_options": [
{
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
],
"guest_payment_options": [
{
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
user_payment_options | [PaymentOption] | false | read-only | A list of payment options that the user can use to book themself into this class. |
guest_payment_options | [PaymentOption] | false | read-only | A list of payment options that the user can use to book a guest into this class. |
Payment
{
"amount": 1.23,
"payment_method": {
"id": "123",
"card": {
"ccv": "123",
"expiration_month": "10",
"expiration_year": "22",
"last_four": "1111",
"name": "Wednesday Addams",
"number": 4111111111111111,
"postal_code": "12345",
"usage_location": "123"
},
"store": true
},
"payment_method_type": "bankcard"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
amount | number(float) | true | none | none |
payment_method | PaymentMethod | false | none | none |
payment_method_type | string | true | none | Options are bankcard and account . |
PaymentList
[
{
"amount": 20,
"payment_method_type": "account"
},
{
"amount": 193.78,
"payment_method_type": "bankcard",
"payment_method": {
"id": "123",
"store": false
}
},
{
"amount": 30,
"payment_method_type": "bankcard",
"payment_method": {
"card": {
"ccv": "123",
"expiration_month": "11",
"expiration_year": "2222",
"number": 4111111111111111,
"name": "Wednesday Addams",
"postal_code": "90210",
"last_four": "4111",
"usage_location": "456"
},
"store": false
}
}
]
A list of payments for the cart being checked out.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [Payment] | false | none | A list of payments for the cart being checked out. |
PaymentSource
{
"id": "123",
"amount_paid": "9.99",
"amount_refunded": "0.00",
"name": "Visa ending in 1111",
"payment_type": "Visa"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
amount_paid | number | false | read-only | none |
amount_refunded | string | false | read-only | none |
name | string | false | read-only | none |
payment_type | string | false | read-only | none |
ProductDisplayAttribute
{
"name": "Expiration",
"value": "3 months"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
name | string | false | read-only | none |
value | string | false | read-only | none |
ProductListing
{
"id": "123",
"banner": "New Item!!",
"currency_code": "USD",
"description": "Farm to table credits to get you into class.",
"is_in_stock": true,
"is_live_stream": true,
"is_promoted": true,
"is_valid_promo_for_user": true,
"name": "Farm to Table Credit",
"num_in_stock": 20,
"price": 200,
"price_incl_tax": 220,
"product_type": "credits",
"product_display_attributes": [
{
"name": "Expiration",
"value": "3 months"
}
],
"should_display_price_incl_tax": false
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
banner | string | false | read-only | none |
currency_code | string | false | read-only | none |
description | string | false | read-only | none |
is_in_stock | boolean | false | read-only | none |
is_live_stream | boolean | false | read-only | none |
is_promoted | boolean | false | read-only | none |
is_valid_promo_for_user | boolean | false | read-only | none |
name | string | false | read-only | none |
num_in_stock | integer | false | read-only | none |
price | number | false | read-only | The unit price for this product. Does not include taxes or discounts. |
price_incl_tax | number | false | read-only | The tax-inclusive unit price for this product. Does not include discounts. |
product_type | string | false | read-only | none |
product_display_attributes | [ProductDisplayAttribute] | false | read-only | none |
should_display_price_incl_tax | boolean | false | read-only | Whether to display the price of this product as tax-inclusive or tax-exclusive. |
PurchaseSignature
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
purchase_agreement_signature_id | integer | false | read-only | The unique ID for the item. |
purchase_agreement_signature_url | string | false | read-only | URL for the hosted signed purchase agreement. |
fulfillment_location | string | false | read-only | Fulfillment location where the membership is purchased. |
name | string | false | read-only | Name of the agreement. |
is_signed | boolean | false | read-only | If the membership is signed or not. |
signed_datetime | string | false | read-only | Date and time when the membership was signed. |
product_name | string | false | read-only | The name of the product associated with the purchase agreement. |
Region
{
"id": "123",
"name": "Washington, DC",
"locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
}
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | RegionSimplified | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» locations | [Location] | false | read-only | A list of the associated active locations. |
RegionList
{
"results": [
{
"id": "123",
"name": "Washington, DC",
"locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | [Region] | false | read-only | A list of regions. |
meta | Meta | false | none | Pagination metadata. |
links | Links | false | none | Links to pages. |
RegionSimplified
{
"id": "123",
"name": "Washington, DC"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | The ID of the region. |
name | string | false | read-only | The name of the region. |
RequestBodyIdWrapper
{
"id": "1"
}
Wrapper object when sending a dictionary containing a single ID
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | none | none |
RequiredLegalDocument
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false,
"is_signed": true,
"signed_datetime": "2021-08-23T08:09:59.124612Z",
"broker_id": "12345",
"source": "Customer Application",
"legal_document": "61a995e3-b484-485a-9799-b873a93e83c6"
}
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | LegalDocument | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» is_signed | boolean | false | none | Boolean indicating if the Legal Document has been signed by the user |
» signed_datetime | string | false | none | Datetime indicating when the Legal Document was signed. |
» broker_id | string | false | none | User ID of the authenticated user that made the sign request. |
» source | string | false | none | Application name where the request to sign was made. |
» legal_document | string(uuid) | false | read-only | The unique UUID of the legal document. |
Reservation
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3,
"are_add_ons_available": true,
"booked_by": "Wednesday Addams",
"class_session": {
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3
},
"guest_email": "pugsley@example.com",
"is_change_spots_enabled": false,
"is_upcoming": false,
"live_stream_url": "https://meet.google.com/abc-def-ghi",
"live_stream_window": 20,
"payment_option": {
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
}
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | ClassReservation | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» are_add_ons_available | boolean | false | read-only | Whether adds ons are available |
» booked_by | string | false | read-only | The full name of the user that booked this reservation. |
» class_session | Class | false | none | The class associated with this reservation. |
» guest_email | string(email) | false | read-only | The email provided for the guest who will be taking this reservation. This will be null if one was not provided, or if the reservation was not made for a guest. |
» is_change_spots_enabled | boolean | false | read-only | Whether change spots is enabled at this class's location. |
» is_upcoming | boolean | false | read-only | Whether the reservation is upcoming and active or not. |
» live_stream_url | string | false | read-only | Url for live stream class. |
» live_stream_window | integer | false | read-only | Minutes before class start at which time live stream URLs will be emailed out to active reservations. |
» payment_option | PaymentOption | false | none | Information about how a reservation can be or was paid for. |
ReservationList
{
"results": [
{
"id": "123",
"is_booked_by_me": true,
"is_booked_for_me": false,
"reservation_type": "waitlist",
"spot": {
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
},
"status": "pending",
"waitlist_position": 3,
"are_add_ons_available": true,
"booked_by": "Wednesday Addams",
"class_session": {
"id": "123",
"available_spot_count": 3,
"booking_start_datetime": "2019-03-20T12:00:00-04:00",
"is_late_cancel_overridden": false,
"is_free_class": true,
"capacity": 30,
"class_tags": [
{
"id": "123",
"name": "Off-Peak",
"slug": "off-peak"
}
],
"class_type": {
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
},
"classroom": {
"id": "678",
"name": "Spin Room"
},
"classroom_name": "Spin studio",
"geo_check_in_end_datetime": "2019-04-07T08:00:00-04:00",
"geo_check_in_start_datetime": "2019-04-07T07:00:00-04:00",
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
],
"in_live_stream_window": false,
"is_cancelled": false,
"is_remaining_spot_count_public": false,
"is_user_guest_reserved": false,
"is_user_reserved": false,
"is_user_waitlisted": false,
"layout_format": "pick-a-spot",
"location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"name": "Hot Yoga",
"spot_options": {
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
},
"start_date": "2019-04-07",
"start_datetime": "2019-04-07T07:00:00-04:00",
"start_time": "07:00:00",
"status": "Class Full",
"waitlist_count": 3
},
"guest_email": "pugsley@example.com",
"is_change_spots_enabled": false,
"is_upcoming": false,
"live_stream_url": "https://meet.google.com/abc-def-ghi",
"live_stream_window": 20,
"payment_option": {
"id": "credit-123",
"credit_payment": {
"id": "123",
"credits_remaining": 3,
"credits_total": 5,
"credits_used": 2,
"expiration_datetime": "2018-09-10T14:29:45.094382Z",
"is_expired": false,
"is_valid_for_guests": true,
"name": "Farm to Table Credits"
},
"description": "Farm to Table Credit (1/2, Exp. 01/01/2030)",
"error_code": "string",
"error_message": "string",
"membership_payment": {
"id": "123",
"billing_cycles": [
{
"id": "123",
"start_datetime": "2020-12-23T04:59:59Z",
"end_datetime": "2020-11-22T12:30:00Z"
}
],
"booking_window_display": "Reserve 7 days in advance",
"commitment_length": 3,
"customer_usage_limit": 10,
"end_date": "2025-01-01",
"freeze_start_date": "2023-05-26",
"freeze_end_date": "2023-05-26",
"guest_remaining_usage_count": 2,
"guest_usage_limit": 2,
"is_active": true,
"is_charge_declined": false,
"name": "Sulfite Free Membership",
"next_charge_date": "2020-12-12",
"payment_interval": "MO",
"payment_interval_length": 1,
"penalty_fee_failure_date": "2023-05-26",
"product_id": "314",
"purchase_date": "2023-05-26",
"purchase_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
},
"purchase_signatures": [
{
"purchase_agreement_signature_id": 272,
"purchase_agreement_signature_url": "https://marianatek.com/purchase-agreements/12345/signed-agreement.pdf",
"fulfillment_location": "Dupont Circle",
"name": "Hike-Climb-Expedition | Monthly Recurring_8Class_WI_Final",
"is_signed": true,
"signed_datetime": "2021-03-05T22:19:32.667259Z",
"product_name": "Monthly Premium Membership"
}
],
"remaining_renewal_count": 3,
"remaining_usage_count": 8,
"renewal_count": 1,
"renewal_currency": "USD",
"renewal_rate": 400,
"renewal_rate_incl_tax": "440.00",
"should_display_price_incl_tax": true,
"start_date": "2020-01-01",
"start_type": "date_purchased",
"status": "Active",
"valid_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
]
},
"name": "Farm to Table Credit",
"type": "credit"
}
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | array | false | read-only | A list of reservations. |
meta | Meta | false | none | Pagination metadata. |
links | Links | false | none | Links to pages. |
ReservationRequestBody
{
"reservation_type": "standard",
"guest_email": "guest@gmail.com",
"is_booked_for_me": false,
"class_session": {
"id": "1"
},
"payment_option": {
"id": "1"
},
"spot": {
"id": "1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
reservation_type | string | true | none | Accepts one of three defined values: standard , standby , and waitlist |
guest_email | string | false | none | Optional email field that can be set when is_booked_for_me is true |
is_booked_for_me | boolean | true | none | Set this value to true if the user is booking for themselves. Set this value to false if reserving for a guest. |
class_session | RequestBodyIdWrapper | true | none | Wrapper object when sending a dictionary containing a single ID |
payment_option | RequestBodyIdWrapper | true | none | Wrapper object when sending a dictionary containing a single ID |
spot | RequestBodyIdWrapper | false | none | Wrapper object when sending a dictionary containing a single ID |
Enumerated Values
Property | Value |
---|---|
reservation_type | standard |
reservation_type | standby |
reservation_type | waitlist |
ScheduleAppearance
{
"is_class_cell_location_enabled": true,
"is_class_cell_room_enabled": true,
"is_class_type_filter_enabled": true,
"is_instructor_filter_enabled": true,
"is_room_filter_enabled": true
}
Values for schedule appearance configuration.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
is_class_cell_location_enabled | boolean | false | read-only | Whether location information should be shown for the schedule class cell. |
is_class_cell_room_enabled | boolean | false | read-only | Whether room information should be shown for the schedule class cell. |
is_class_type_filter_enabled | boolean | false | read-only | Whether the class type filter should be shown for the schedule. |
is_instructor_filter_enabled | boolean | false | read-only | Whether the instructor filter should be shown for the schedule. |
is_room_filter_enabled | boolean | false | read-only | Whether the room filter should be shown for the schedule. |
ScheduleFilters
{
"class_types": [
{
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
}
],
"classrooms": [
{
"id": "678",
"name": "Spin Room"
}
],
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
]
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
class_types | [ClassType] | false | read-only | Class types used for classes. |
classrooms | [Classroom] | false | read-only | Classrooms used for classes. |
instructors | [Instructor] | false | read-only | Instructors for classes. |
ScheduleLocation
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
},
"class_types": [
{
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
}
],
"classrooms": [
{
"id": "678",
"name": "Spin Room"
}
],
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
]
}
The standard location schema with added information about relevant class types, classrooms, and instructors.
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | LocationWithRegion | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» class_types | [ClassType] | false | read-only | Class types used for classes at this location. |
» classrooms | [Classroom] | false | read-only | Classrooms used for classes at this location. |
» instructors | [Instructor] | false | read-only | Instructors for classes at this location. |
ScheduleLocationList
{
"results": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
},
"class_types": [
{
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
}
],
"classrooms": [
{
"id": "678",
"name": "Spin Room"
}
],
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
]
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | [ScheduleLocation] | false | read-only | A list of locations. |
meta | Meta | false | none | Pagination metadata. |
links | Links | false | none | Links to pages. |
ScheduleRegion
{
"id": "123",
"name": "Washington, DC",
"locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
],
"class_types": [
{
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
}
],
"classrooms": [
{
"id": "678",
"name": "Spin Room"
}
],
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
]
}
The standard region schema with added information about relevant class types, classrooms, and instructors.
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | Region | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» class_types | [ClassType] | false | read-only | Class types used for classes at locations in this region. |
» classrooms | [Classroom] | false | read-only | Classrooms used for classes at locations in this region. |
» instructors | [Instructor] | false | read-only | Instructors for classes at locations in this region. |
ScheduleRegionList
{
"results": [
{
"id": "123",
"name": "Washington, DC",
"locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern"
}
],
"class_types": [
{
"id": "123",
"description": "A highly structured class that lays the foundation for a heated yoga practice.",
"duration": 45,
"duration_formatted": "45 minutes",
"is_live_stream": false,
"name": "Hot Yoga"
}
],
"classrooms": [
{
"id": "678",
"name": "Spin Room"
}
],
"instructors": [
{
"id": "123",
"bio": "All-around hero.",
"instagram_handle": "marianatek",
"instagram_url": "https://instagram.com/marianatek",
"name": "Wednesday Addams",
"photo_urls": {
"large_url": null,
"thumbnail_url": null
},
"spotify_url": "https://open.spotify.com/user/marianatek"
}
]
}
],
"meta": {
"pagination": {
"count": 15,
"pages": 2,
"page": 1
}
},
"links": {
"first": "https://basedomain.com/endpoint?page=1",
"last": "https://basedomain.com/endpoint?page=15",
"next": "https://basedomain.com/endpoint?page=3",
"prev": "https://basedomain.com/endpoint?page=1"
}
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
results | [ScheduleRegion] | false | read-only | A list of regions. |
meta | Meta | false | none | Pagination metadata. |
links | Links | false | none | Links to pages. |
Spot
{
"id": "123",
"name": "1",
"spot_type": {
"id": "123",
"is_primary": true,
"name": "Bike"
},
"x_position": 0,
"y_position": 0
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | The ID of this spot. |
name | string | false | read-only | The name of this spot. |
spot_type | SpotType | false | none | none |
x_position | number(float) | false | read-only | If the spot belongs to a pick-a-spot layout, this value represents where the spot should appear horizontally. |
y_position | number(float) | false | read-only | If the spot belongs to a pick-a-spot layout, this value represents where the spot should appear vertically. |
SpotOptions
{
"primary_availability": 3,
"primary_capacity": 20,
"secondary_availability": 1,
"secondary_capacity": 1,
"standby_availability": 1,
"standby_capacity": 1,
"waitlist_availability": 5,
"waitlist_capacity": 6
}
Detailed information about the spots available in the class.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
primary_availability | integer | false | read-only | The number of primary spots that are still available. |
primary_capacity | integer | false | read-only | The total number of primary spots in this class. |
secondary_availability | integer | false | read-only | The number of secondary spots that are still available. |
secondary_capacity | integer | false | read-only | The total number of secondary spots in this class. |
standby_availability | integer | false | none | The number of standby spots that are still available. |
standby_capacity | integer | false | read-only | The total number of standby spots in this class. |
waitlist_availability | integer | false | read-only | The number of waitlist spots that are still available. This will be null if the waitlist is unlimited. |
waitlist_capacity | integer | false | read-only | The total number of waitlist spots in this class. This will be null if the waitlist is unlimited. |
SpotType
{
"id": "123",
"is_primary": true,
"name": "Bike"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | The ID of this spot type. |
is_primary | boolean | false | read-only | none |
name | string | false | read-only | The name of this spot type. |
Theme
{
"are_booking_windows_public": true,
"dark_logo": "https://mydomain.com/media/logo-dark.png",
"dark_mark": "https://mydomain.com/media/mark-dark.png",
"is_dark_mode": false,
"is_location_nav_enabled": true,
"is_mt_attribution_enabled": true,
"light_logo": "https://mydomain.com/media/logo-light.png",
"light_mark": "https://mydomain.com/media/mark-light.png",
"primary_color": "#FFFFFF",
"primary_font": {
"css_source": "https://fonts.googleapis.com/css?family=Lato:300,400,700",
"font_family": "Helvetica Neue"
},
"primary_foreground_color": "#FFFFFF",
"schedule": {
"is_class_cell_location_enabled": true,
"is_class_cell_room_enabled": true,
"is_class_type_filter_enabled": true,
"is_instructor_filter_enabled": true,
"is_room_filter_enabled": true
},
"secondary_color": "#FFFFFF",
"secondary_font": {
"css_source": "https://fonts.googleapis.com/css?family=Lato:300,400,700",
"font_family": "Helvetica Neue"
},
"secondary_foreground_color": "#FFFFFF",
"tab_bar_image": "https://mydomain.com/media/tab-bar.png"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
are_booking_windows_public | boolean | false | read-only | Whether the booking windows should appear on memberships. |
dark_logo | string | false | read-only | A version of the brand logo in a dark color. |
dark_mark | string | false | read-only | A version of the brand mark in a dark color. |
is_dark_mode | boolean | false | read-only | Whether the brand is using a dark theme. |
is_location_nav_enabled | boolean | false | read-only | Whether to display a drop-down menu for changing locations on buy pages or schedule pages in web integrations. |
is_mt_attribution_enabled | boolean | false | read-only | Whether the Mariana Tek logo should appear in the web integrations. |
light_logo | string | false | read-only | A version of the brand logo in a light color. |
light_mark | string | false | read-only | A version of the brand mark in a light color. |
primary_color | string | false | read-only | The primary color used for the brand. |
primary_font | Font | false | none | The primary font used for the brand. This will be used for elements like headers. |
primary_foreground_color | string | false | read-only | The primary foreground color used for the brand (automatically calculated based on primary color). |
schedule | ScheduleAppearance | false | none | Values for schedule appearance configuration. |
secondary_color | string | false | read-only | The secondary color used for the brand. |
secondary_font | Font | false | none | The secondary font used for the brand. This will be used for elements like body copy. |
secondary_foreground_color | string | false | read-only | The secondary foreground color used for the brand (automatically calculated based on secondary color). |
tab_bar_image | string | false | read-only | An image to be used to enable a dynamic branded home tab in mobile apps. |
TrackingConsentCopy
{
"consent_copy": {
"banner": "I am the Banner copy.",
"settings": "I am the Settings copy.",
"essential": "I am the Essential copy.",
"performance": "I am the Performance copy."
},
"performance_trackers": [
"Google Analytics"
],
"version": "7dc05ff3-9fb6-445b-ab9d-8e57ffbdf068"
}
Copy to be displayed during tracking consent flow.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
consent_copy | object | false | none | none |
» banner | string | false | none | none |
» settings | string | false | none | none |
» essential | string | false | none | none |
» performance | string | false | none | none |
performance_trackers | [string] | false | none | none |
version | string(uuid) | false | none | none |
UploadProfileImageRequest
{
"profile_image_file": "/image/file.png"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
profile_image_file | string(binary) | false | none | The user's profile image. |
UpdateCommunicationsPreferencesRequest
{
"marketing_type": "sms",
"opt_in_value": true,
"phone_number": "string",
"marketing_log_source": "System reprompt",
"opt_in_copy": "By selecting this option, you agree to receive marketing communications via text."
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
marketing_type | string | true | none | The marketing type. Currently, only 'sms' is supported. |
opt_in_value | boolean | true | none | true to opt in, false to opt out. |
phone_number | string | true | none | If opting in to sms, the phone number to use for future sms communications for this user's account. If opting out, this field is ignored. |
marketing_log_source | string | true | none | Source of the update. Currently only accepts "System reprompt" as a source. |
opt_in_copy | string | false | none | Optionally, provide the text that was shown to the user when deciding to opt in or out. |
User
{
"id": "123",
"account_balance": [
{
"amount": "100.00",
"currency": "USD",
"locations": []
},
{
"amount": "50.00",
"currency": "USD",
"locations": [
{
"id": "123",
"name": "Dupont Circle"
}
]
}
],
"address_line_one": "123 Main Street",
"address_line_two": "Apt 1",
"address_line_three": "Townland",
"address_sorting_code": "134-A",
"birth_date": "1936-08-18",
"city": "Jackson Hole",
"company_name": "Mariana Tek",
"completed_class_count": 99,
"country": "US",
"credit_cards": [
{
"id": "5345",
"address_line_one": "123 Main Street",
"address_line_two": "Apt 101",
"card_type": "Visa",
"ccv": "string",
"city": "Washington",
"country": "US",
"expiration_month": "11",
"expiration_year": "2030",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"is_editable": true,
"is_expired": false,
"last_four": "1234",
"last_name": "Addams",
"name": "Wednesday Addams",
"number": 0,
"partner_reference": "string",
"postal_code": "12345",
"state_province": "DC",
"usage_location": "123",
"usage_locations": [
{
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
}
]
}
],
"current_password": "string",
"email": "wednesday@example.com",
"email_opt_in_copy": "Opt in for email updates and promotions (You can opt out at any time in your account settings)",
"emergency_contact_email": "morticia@example.com",
"emergency_contact_name": "Morticia Addams",
"emergency_contact_phone": "123-456-7890",
"emergency_contact_relationship": "Mother",
"first_name": "Wednesday",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"full_name": "Wednesday Addams",
"gender": "female",
"home_location": {
"id": "123",
"address_line_one": "123 Main Street",
"address_line_two": "#456",
"address_line_three": "Barra",
"city": "Washington",
"currency_code": "USD",
"description": "A cool place for hot yoga.",
"email": "coolhotyoga@example.com",
"formatted_address": [
"1234 Main Street",
"Washington, DC 20003",
"United States"
],
"gate_geo_check_in_by_distance": true,
"geo_check_in_distance": 100,
"is_newsletter_subscription_pre_checked": false,
"latitude": "38.908370",
"longitude": "-77.043110",
"name": "Dupont Circle",
"payment_gateway_type": "stripe",
"phone_number": "9999999999",
"postal_code": "20001",
"sorting_code": "3",
"state_province": "District of Columbia",
"timezone": "US/Eastern",
"region": {
"id": "123",
"name": "Washington, DC"
}
},
"is_balance_used_for_fees": true,
"is_marketing_allowed": true,
"is_opted_in_to_sms": true,
"is_waiver_signed": true,
"join_datetime": "2018-08-23T08:09:59.124612Z",
"last_name": "Addams",
"legal_documents_to_sign": [
"6376b274-40f3-49cf-a047-1400ed5ae192",
"907b5ca2-740a-4235-89ff-32fe303cc4bb"
],
"password": "string",
"postal_code": "83001",
"phone_number": "123-456-7890",
"profile_image": null,
"pronouns": "they/them",
"required_legal_documents": [
{
"document_id": "61a995e3-b484-485a-9799-b873a93e83c6",
"is_active": true,
"is_signable_by_checkbox": true,
"name": "Mariana Tek Privacy Policy",
"url": "https://www.google.com/",
"document_type": "Privacy Agreement",
"is_required_for_users": true,
"is_required_for_employees": false,
"is_signed": true,
"signed_datetime": "2021-08-23T08:09:59.124612Z",
"broker_id": "12345",
"source": "Customer Application",
"legal_document": "61a995e3-b484-485a-9799-b873a93e83c6"
}
],
"sms_opt_in_copy": "Opt in for sms notifications and updates (You can opt out at any time in your account settings)",
"state_province": "Wyoming"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | none |
account_balance | [CurrencyValue] | false | read-only | none |
address_line_one | string | false | none | Street address. |
address_line_two | string | false | none | Apartment/Suite/Unit. |
address_line_three | string | false | none | Neighborhood/Town/Suburb. |
address_sorting_code | string | false | none | Optional additional address information for specific routing. |
birth_date | string(date) | false | none | none |
city | string | false | none | City associated with the street address. |
company_name | string | false | none | none |
completed_class_count | integer | false | none | none |
country | string | false | none | An ISO 3166-1 alpha-2 country code |
credit_cards | [CreditCard] | false | read-only | none |
current_password | string | false | write-only | Used when updating a user's password. |
string(email) | true | none | none | |
email_opt_in_copy | string | false | write-only | Disclaimer text user saw when checking the box to subscribe to email marketing |
emergency_contact_email | string(email) | false | none | none |
emergency_contact_name | string | false | none | none |
emergency_contact_phone | string | false | none | none |
emergency_contact_relationship | string | false | none | none |
first_name | string | true | none | none |
formatted_address | array(string) | false | none | List containing pieces of address information grouped, or separated, according to the expectations for that country. |
full_name | string | false | read-only | none |
gender | string | false | none | none |
home_location | LocationWithRegion | false | none | none |
is_balance_used_for_fees | boolean | false | none | If the user has any account balance, this determines whether it should be applied to automatic charges, like membership renewals or penalty fees. |
is_marketing_allowed | boolean | false | none | Whether the user is opted-in to marketing emails. |
is_opted_in_to_sms | boolean | false | none | Whether the user is opted-in to SMS marketing. |
is_waiver_signed | boolean | false | none | none |
join_datetime | string(datetime) | false | read-only | When the user created their account. |
last_name | string | true | none | none |
legal_documents_to_sign | array(uuid) | false | write-only | List of LegalDocument UUIDs that should be signed |
password | string | false | write-only | Used when setting and updating a user's password. |
postal_code | string | false | none | Zip/Postal code associated with the street address. |
phone_number | string | false | none | none |
profile_image | string | false | read-only | A url for the user's profile image. To upload an image, see /api/customer/v1/me/account/upload_profile_image . |
pronouns | string | false | none | Optional pronouns value. |
required_legal_documents | [RequiredLegalDocument] | false | read-only | none |
sms_opt_in_copy | string | false | write-only | Disclaimer text user saw when checking the box to subscribe to SMS marketing |
state_province | string | false | none | State/Province associated with the street address. |
UserAchievements
{
"classes_completed": 3,
"instructors_taken": 2,
"member_since": "2020-09-21T20:06:02.099891Z",
"most_visited_studio": "North Boulder",
"number_of_studios_visited": 1
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
classes_completed | integer | false | read-only | The total count of completed (checked-in) classes for the current user. |
instructors_taken | integer | false | read-only | The total count of instructors for completed (checked-in) classes for the current user. |
member_since | string(datetime) | false | read-only | The date of the first class taken by the current user. |
most_visited_studio | string | false | read-only | The name of the most visited studio for the current user. |
number_of_studios_visited | integer | false | read-only | The total count of studios visited by the current user. |
Variant
{
"id": "123",
"name": "Cool Product",
"display_attributes": "Blue, XL"
}
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
id | string | false | read-only | An ID for the product variant. |
name | string | false | read-only | A description sourced from the variant's parent product. |
display_attributes | string | false | read-only | An optional concatenated representation of product attributes (e.g. color, size, etc.). |