NAV Navigation
Shell HTTP JavaScript Ruby Python PHP Java Go

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

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

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"
    }
  }
}
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

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.

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
  }
}
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

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.

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

{
  "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.

{
  "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.
email 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.
email 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.).