Nest Changelog
1.3.0
8/4/2022
1.4.0
8/11/2022
75 changed endpoints Collapse changed endpoints
POST /webhooks/invoice-upcoming 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTotal?: number,
attemptCount?: number,
attempted?: bool,
- billingProviderId?: string,
billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
currencyCode?: string,
dateCreated?: number,
dateNextAttempt?: number,
datePeriodEnd?: number,
datePeriodStart?: number,
initiatedBy: {
id?: number,
},
internalNote: string,
isAutomaticCollection?: bool,
isManualPayment?: bool,
isPaid?: bool,
publicNote: string,
reason: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
status?: string,
}POST /webhooks/invoice-upcoming 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTotal?: number,
attemptCount?: number,
attempted?: bool,
billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
currencyCode?: string,
dateCreated?: number,
dateNextAttempt?: number,
datePeriodEnd?: number,
datePeriodStart?: number,
initiatedBy: {
id?: number,
},
internalNote: string,
isAutomaticCollection?: bool,
isManualPayment?: bool,
isPaid?: bool,
+ orderId?: string,
publicNote: string,
reason: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
+ sourceId?: string,
+ sourceName?: 'stripe' | 'ios' | 'android' | 'amazon',
+ sourceUserId?: string,
status?: string,
}POST /webhooks/invoice-paid 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTotal?: number,
attemptCount?: number,
attempted?: bool,
- billingProviderId?: string,
billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
currencyCode?: string,
dateCreated?: number,
dateNextAttempt?: number,
datePeriodEnd?: number,
datePeriodStart?: number,
initiatedBy: {
id?: number,
},
internalNote: string,
isAutomaticCollection?: bool,
isManualPayment?: bool,
isPaid?: bool,
publicNote: string,
reason: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
status?: string,
}POST /webhooks/invoice-paid 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTotal?: number,
attemptCount?: number,
attempted?: bool,
billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
currencyCode?: string,
dateCreated?: number,
dateNextAttempt?: number,
datePeriodEnd?: number,
datePeriodStart?: number,
initiatedBy: {
id?: number,
},
internalNote: string,
isAutomaticCollection?: bool,
isManualPayment?: bool,
isPaid?: bool,
+ orderId?: string,
publicNote: string,
reason: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
+ sourceId?: string,
+ sourceName?: 'stripe' | 'ios' | 'android' | 'amazon',
+ sourceUserId?: string,
status?: string,
}POST /webhooks/payment-failure 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTotal?: number,
attemptCount?: number,
attempted?: bool,
- billingProviderId?: string,
billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
currencyCode?: string,
dateCreated?: number,
dateNextAttempt?: number,
datePeriodEnd?: number,
datePeriodStart?: number,
initiatedBy: {
id?: number,
},
internalNote: string,
isAutomaticCollection?: bool,
isManualPayment?: bool,
isPaid?: bool,
publicNote: string,
reason: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
status?: string,
}POST /webhooks/payment-failure 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTotal?: number,
attemptCount?: number,
attempted?: bool,
billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
currencyCode?: string,
dateCreated?: number,
dateNextAttempt?: number,
datePeriodEnd?: number,
datePeriodStart?: number,
initiatedBy: {
id?: number,
},
internalNote: string,
isAutomaticCollection?: bool,
isManualPayment?: bool,
isPaid?: bool,
+ orderId?: string,
publicNote: string,
reason: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
+ sourceId?: string,
+ sourceName?: 'stripe' | 'ios' | 'android' | 'amazon',
+ sourceUserId?: string,
status?: string,
}GET /users 
Get all users
Response Body
{
data: List<{
billingAddress?: {
city?: string,
country?: {
code?: string,
- currency?: {
- code?: string,
- scale?: number,
- symbol?: string,
- },
- dateCreated?: number,
- dateUpdated?: number,
id?: number,
- mediaNet?: {
- code?: string,
- territoryId?: number,
- },
name?: string,
- numberFormat?: {
- decimalSeparator?: '.' | ',' | ' ',
- thousandsSeparator?: '.' | ',' | ' ',
- },
- stripe?: {
- id?: number,
- },
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
birthdate: string,
createdBy?: {
id?: number,
},
dateActivated?: number,
dateCreated?: number,
dateUpdated?: number,
dealer?: {
id?: number,
},
email?: string,
firstName?: string,
forcePasswordChange?: bool,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
metricValue?: number,
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName?: string,
mongoId?: string,
nickname?: string,
parent?: {
id?: number,
mongoId?: string,
},
phoneNumber?: string,
purchaseHistory?: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles?: List<string>,
stripe?: {
customerId?: string,
},
tagline?: string,
updatedBy?: {
id?: number,
},
weight?: {
metricValue?: number,
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /users 
Get all users
Response Body
{
data: List<{
billingAddress?: {
city?: string,
country?: {
code?: string,
id?: number,
name?: string,
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
birthdate: string,
createdBy?: {
id?: number,
},
dateActivated?: number,
dateCreated?: number,
dateUpdated?: number,
dealer?: {
id?: number,
},
email?: string,
firstName?: string,
forcePasswordChange?: bool,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
metricValue?: number,
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName?: string,
mongoId?: string,
nickname?: string,
parent?: {
id?: number,
mongoId?: string,
},
phoneNumber?: string,
purchaseHistory?: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles?: List<string>,
stripe?: {
customerId?: string,
},
tagline?: string,
updatedBy?: {
id?: number,
},
weight?: {
metricValue?: number,
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}POST /users 
Response Body
{
data: {
billingAddress?: {
city?: string,
country?: {
code?: string,
- currency?: {
- code?: string,
- scale?: number,
- symbol?: string,
- },
- dateCreated?: number,
- dateUpdated?: number,
id?: number,
- mediaNet?: {
- code?: string,
- territoryId?: number,
- },
name?: string,
- numberFormat?: {
- decimalSeparator?: '.' | ',' | ' ',
- thousandsSeparator?: '.' | ',' | ' ',
- },
- stripe?: {
- id?: number,
- },
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
birthdate: string,
createdBy?: {
id?: number,
},
dateActivated?: number,
dateCreated?: number,
dateUpdated?: number,
dealer?: {
id?: number,
},
email?: string,
firstName?: string,
forcePasswordChange?: bool,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
metricValue?: number,
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName?: string,
mongoId?: string,
nickname?: string,
parent?: {
id?: number,
mongoId?: string,
},
phoneNumber?: string,
purchaseHistory?: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles?: List<string>,
stripe?: {
customerId?: string,
},
tagline?: string,
updatedBy?: {
id?: number,
},
weight?: {
metricValue?: number,
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
},
}POST /users 
Response Body
{
data: {
billingAddress?: {
city?: string,
country?: {
code?: string,
id?: number,
name?: string,
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
birthdate: string,
createdBy?: {
id?: number,
},
dateActivated?: number,
dateCreated?: number,
dateUpdated?: number,
dealer?: {
id?: number,
},
email?: string,
firstName?: string,
forcePasswordChange?: bool,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
metricValue?: number,
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName?: string,
mongoId?: string,
nickname?: string,
parent?: {
id?: number,
mongoId?: string,
},
phoneNumber?: string,
purchaseHistory?: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles?: List<string>,
stripe?: {
customerId?: string,
},
tagline?: string,
updatedBy?: {
id?: number,
},
weight?: {
metricValue?: number,
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
},
}GET /users/{userId} 
Get a specific user by id
Response Body
{
data: {
billingAddress?: {
city?: string,
country?: {
code?: string,
- currency?: {
- code?: string,
- scale?: number,
- symbol?: string,
- },
- dateCreated?: number,
- dateUpdated?: number,
id?: number,
- mediaNet?: {
- code?: string,
- territoryId?: number,
- },
name?: string,
- numberFormat?: {
- decimalSeparator?: '.' | ',' | ' ',
- thousandsSeparator?: '.' | ',' | ' ',
- },
- stripe?: {
- id?: number,
- },
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
birthdate: string,
createdBy?: {
id?: number,
},
dateActivated?: number,
dateCreated?: number,
dateUpdated?: number,
dealer?: {
id?: number,
},
email?: string,
firstName?: string,
forcePasswordChange?: bool,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
metricValue?: number,
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName?: string,
mongoId?: string,
nickname?: string,
parent?: {
id?: number,
mongoId?: string,
},
phoneNumber?: string,
purchaseHistory?: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles?: List<string>,
stripe?: {
customerId?: string,
},
tagline?: string,
updatedBy?: {
id?: number,
},
weight?: {
metricValue?: number,
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
},
}GET /users/{userId} 
Get a specific user by id
Response Body
{
data: {
billingAddress?: {
city?: string,
country?: {
code?: string,
id?: number,
name?: string,
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
birthdate: string,
createdBy?: {
id?: number,
},
dateActivated?: number,
dateCreated?: number,
dateUpdated?: number,
dealer?: {
id?: number,
},
email?: string,
firstName?: string,
forcePasswordChange?: bool,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
metricValue?: number,
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName?: string,
mongoId?: string,
nickname?: string,
parent?: {
id?: number,
mongoId?: string,
},
phoneNumber?: string,
purchaseHistory?: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles?: List<string>,
stripe?: {
customerId?: string,
},
tagline?: string,
updatedBy?: {
id?: number,
},
weight?: {
metricValue?: number,
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
},
}PATCH /users/{userId} 
Edit this user
Response Body
{
data: {
billingAddress?: {
city?: string,
country?: {
code?: string,
- currency?: {
- code?: string,
- scale?: number,
- symbol?: string,
- },
- dateCreated?: number,
- dateUpdated?: number,
id?: number,
- mediaNet?: {
- code?: string,
- territoryId?: number,
- },
name?: string,
- numberFormat?: {
- decimalSeparator?: '.' | ',' | ' ',
- thousandsSeparator?: '.' | ',' | ' ',
- },
- stripe?: {
- id?: number,
- },
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
birthdate: string,
createdBy?: {
id?: number,
},
dateActivated?: number,
dateCreated?: number,
dateUpdated?: number,
dealer?: {
id?: number,
},
email?: string,
firstName?: string,
forcePasswordChange?: bool,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
metricValue?: number,
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName?: string,
mongoId?: string,
nickname?: string,
parent?: {
id?: number,
mongoId?: string,
},
phoneNumber?: string,
purchaseHistory?: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles?: List<string>,
stripe?: {
customerId?: string,
},
tagline?: string,
updatedBy?: {
id?: number,
},
weight?: {
metricValue?: number,
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
},
}PATCH /users/{userId} 
Edit this user
Response Body
{
data: {
billingAddress?: {
city?: string,
country?: {
code?: string,
id?: number,
name?: string,
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
birthdate: string,
createdBy?: {
id?: number,
},
dateActivated?: number,
dateCreated?: number,
dateUpdated?: number,
dealer?: {
id?: number,
},
email?: string,
firstName?: string,
forcePasswordChange?: bool,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
metricValue?: number,
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName?: string,
mongoId?: string,
nickname?: string,
parent?: {
id?: number,
mongoId?: string,
},
phoneNumber?: string,
purchaseHistory?: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles?: List<string>,
stripe?: {
customerId?: string,
},
tagline?: string,
updatedBy?: {
id?: number,
},
weight?: {
metricValue?: number,
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
},
}GET /users/{userId}/family 
Get child accounts of this user
Response Body
{
data: List<{
billingAddress?: {
city?: string,
country?: {
code?: string,
- currency?: {
- code?: string,
- scale?: number,
- symbol?: string,
- },
- dateCreated?: number,
- dateUpdated?: number,
id?: number,
- mediaNet?: {
- code?: string,
- territoryId?: number,
- },
name?: string,
- numberFormat?: {
- decimalSeparator?: '.' | ',' | ' ',
- thousandsSeparator?: '.' | ',' | ' ',
- },
- stripe?: {
- id?: number,
- },
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
birthdate: string,
createdBy?: {
id?: number,
},
dateActivated?: number,
dateCreated?: number,
dateUpdated?: number,
dealer?: {
id?: number,
},
email?: string,
firstName?: string,
forcePasswordChange?: bool,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
metricValue?: number,
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName?: string,
mongoId?: string,
nickname?: string,
parent?: {
id?: number,
mongoId?: string,
},
phoneNumber?: string,
purchaseHistory?: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles?: List<string>,
stripe?: {
customerId?: string,
},
tagline?: string,
updatedBy?: {
id?: number,
},
weight?: {
metricValue?: number,
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /users/{userId}/family 
Get child accounts of this user
Response Body
{
data: List<{
billingAddress?: {
city?: string,
country?: {
code?: string,
id?: number,
name?: string,
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
birthdate: string,
createdBy?: {
id?: number,
},
dateActivated?: number,
dateCreated?: number,
dateUpdated?: number,
dealer?: {
id?: number,
},
email?: string,
firstName?: string,
forcePasswordChange?: bool,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
metricValue?: number,
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName?: string,
mongoId?: string,
nickname?: string,
parent?: {
id?: number,
mongoId?: string,
},
phoneNumber?: string,
purchaseHistory?: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles?: List<string>,
stripe?: {
customerId?: string,
},
tagline?: string,
updatedBy?: {
id?: number,
},
weight?: {
metricValue?: number,
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}POST /users/{userId}/family 
Response Body
{
data: {
billingAddress?: {
city?: string,
country?: {
code?: string,
- currency?: {
- code?: string,
- scale?: number,
- symbol?: string,
- },
- dateCreated?: number,
- dateUpdated?: number,
id?: number,
- mediaNet?: {
- code?: string,
- territoryId?: number,
- },
name?: string,
- numberFormat?: {
- decimalSeparator?: '.' | ',' | ' ',
- thousandsSeparator?: '.' | ',' | ' ',
- },
- stripe?: {
- id?: number,
- },
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
birthdate: string,
createdBy?: {
id?: number,
},
dateActivated?: number,
dateCreated?: number,
dateUpdated?: number,
dealer?: {
id?: number,
},
email?: string,
firstName?: string,
forcePasswordChange?: bool,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
metricValue?: number,
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName?: string,
mongoId?: string,
nickname?: string,
parent?: {
id?: number,
mongoId?: string,
},
phoneNumber?: string,
purchaseHistory?: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles?: List<string>,
stripe?: {
customerId?: string,
},
tagline?: string,
updatedBy?: {
id?: number,
},
weight?: {
metricValue?: number,
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
},
embedded: {
jwt?: string,
},
}POST /users/{userId}/family 
Response Body
{
data: {
billingAddress?: {
city?: string,
country?: {
code?: string,
id?: number,
name?: string,
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
birthdate: string,
createdBy?: {
id?: number,
},
dateActivated?: number,
dateCreated?: number,
dateUpdated?: number,
dealer?: {
id?: number,
},
email?: string,
firstName?: string,
forcePasswordChange?: bool,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
metricValue?: number,
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName?: string,
mongoId?: string,
nickname?: string,
parent?: {
id?: number,
mongoId?: string,
},
phoneNumber?: string,
purchaseHistory?: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles?: List<string>,
stripe?: {
customerId?: string,
},
tagline?: string,
updatedBy?: {
id?: number,
},
weight?: {
metricValue?: number,
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
},
embedded: {
jwt?: string,
},
}GET /preferences 
Get a list of possible preferences
Response Body
{
data: List<{
code?: string,
- defaultValue: record,
description?: string,
group?: {
id?: number,
},
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /preferences 
Get a list of possible preferences
Response Body
{
data: List<{
code?: string,
+ defaultValue?: record,
description?: string,
group?: {
id?: number,
},
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}POST /preferences 
Add a new preference
Request Body
{
code?: string,
- defaultValue: record,
description?: string,
group?: {
id?: number,
},
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
}Response Body
{
data: {
code?: string,
- defaultValue: record,
description?: string,
group?: {
id?: number,
},
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}POST /preferences 
Add a new preference
Request Body
{
code?: string,
+ defaultValue?: record,
description?: string,
group?: {
id?: number,
},
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
}Response Body
{
data: {
code?: string,
+ defaultValue?: record,
description?: string,
group?: {
id?: number,
},
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}GET /preferences/{id} 
Get a specific preference
Response Body
{
data: {
code?: string,
- defaultValue: record,
description?: string,
group?: {
id?: number,
},
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}GET /preferences/{id} 
Get a specific preference
Response Body
{
data: {
code?: string,
+ defaultValue?: record,
description?: string,
group?: {
id?: number,
},
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}PUT /preferences/{id} 
Edit a preference as a replacement for previous value.
Request Body
{
code?: string,
- defaultValue: record,
description?: string,
group?: {
id?: number,
},
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
}Response Body
{
data: {
code?: string,
- defaultValue: record,
description?: string,
group?: {
id?: number,
},
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}PUT /preferences/{id} 
Edit a preference as a replacement for previous value.
Request Body
{
code?: string,
+ defaultValue?: record,
description?: string,
group?: {
id?: number,
},
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
}Response Body
{
data: {
code?: string,
+ defaultValue?: record,
description?: string,
group?: {
id?: number,
},
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}PATCH /preferences/{id} 
Edit a preference as an overlay of the previous value.
Response Body
{
data: {
code?: string,
- defaultValue: record,
description?: string,
group?: {
id?: number,
},
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}PATCH /preferences/{id} 
Edit a preference as an overlay of the previous value.
Response Body
{
data: {
code?: string,
+ defaultValue?: record,
description?: string,
group?: {
id?: number,
},
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}GET /subscriptions/{id}/history 
Get a subscription history by subscription ID
Response Body
{
data: List<{
action?: 'paused' | 'planChanged' | 'created' | 'canceled' | 'discounted',
dateOccurred?: number,
guid?: string,
initiatedBy?: {
id?: number,
},
- payload: record,
- rawJson: record,
reason?: string,
source?: 'stripe.com' | 'admin.echelonfit.com' | 'falcon1.echelonfit.com' | 'member.echelonfit.com' | 'stag.member.echelonfit.com',
subscription?: {
id?: number,
},
user?: {
id?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /subscriptions/{id}/history 
Get a subscription history by subscription ID
Response Body
{
data: List<{
action?: 'paused' | 'planChanged' | 'created' | 'canceled' | 'discounted',
dateOccurred?: number,
guid?: string,
initiatedBy?: {
id?: number,
},
+ payload?: record,
+ rawJson?: record,
reason?: string,
source?: 'stripe.com' | 'admin.echelonfit.com' | 'falcon1.echelonfit.com' | 'member.echelonfit.com' | 'stag.member.echelonfit.com',
subscription?: {
id?: number,
},
user?: {
id?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}POST /subscriptions/{id}/history 
Create Subscription History
Response Body
{
data: {
action?: 'paused' | 'planChanged' | 'created' | 'canceled' | 'discounted',
dateOccurred?: number,
guid?: string,
initiatedBy?: {
id?: number,
},
- payload: record,
- rawJson: record,
reason?: string,
source?: 'stripe.com' | 'admin.echelonfit.com' | 'falcon1.echelonfit.com' | 'member.echelonfit.com' | 'stag.member.echelonfit.com',
subscription?: {
id?: number,
},
user?: {
id?: number,
},
},
}POST /subscriptions/{id}/history 
Create Subscription History
Response Body
{
data: {
action?: 'paused' | 'planChanged' | 'created' | 'canceled' | 'discounted',
dateOccurred?: number,
guid?: string,
initiatedBy?: {
id?: number,
},
+ payload?: record,
+ rawJson?: record,
reason?: string,
source?: 'stripe.com' | 'admin.echelonfit.com' | 'falcon1.echelonfit.com' | 'member.echelonfit.com' | 'stag.member.echelonfit.com',
subscription?: {
id?: number,
},
user?: {
id?: number,
},
},
}POST /subscriptions/{id}/quote 
create a new subscription in stripe from shopify order, optionally applies a redemption code
Response Body
{
data: {
campaign?: {
createdBy?: {
id?: number,
},
dateCreated?: number,
dateExpires?: number,
delayBillingDays?: number,
guid?: string,
name?: string,
partner?: {
id?: number,
name?: string,
},
utmCampaign?: string,
utmSource?: string,
},
dateFirstBilling?: number,
plan?: {
basePrice?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
benefits?: List<{
text?: string,
}>,
billingProviders?: List<{
accountId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
priceId?: string,
productId?: string,
}>,
country?: {
code?: string,
id?: number,
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
defaultTrial?: {
units?: 'day',
value?: number,
},
delayBillingDays?: number,
description?: string,
family?: {
brands?: List<'echelon' | 'fitnation' | 'fitquest'>,
code?: 'premier' | 'select' | 'flex' | 'fitpass' | 'free',
type?: 'connected' | 'disconnected',
},
frequency?: {
units?: 'month',
value?: number,
},
frequencyDays?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
musicRights?: {
productId?: string,
vendor?: 'audibleMagic',
},
name?: string,
sku?: string,
sortOrder?: number,
sources?: List<{
accountId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
productId?: string,
}>,
tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>,
updatedBy?: {
id?: number,
},
},
redemptionCode?: {
batchGuid?: string,
campaignCode?: string,
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
delayBillingDays?: number,
- eligibilityRequirements: record,
plans?: List<{
id?: number,
}>,
redeemedBy?: {
id?: number,
},
referenceNumber?: string,
retailer?: {
bundleDays: number,
id?: number,
name: string,
},
serialNumber?: string,
status?: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon?: string,
subscription?: {
id?: number,
},
},
},
}POST /subscriptions/{id}/quote 
create a new subscription in stripe from shopify order, optionally applies a redemption code
Response Body
{
data: {
campaign?: {
createdBy?: {
id?: number,
},
dateCreated?: number,
dateExpires?: number,
delayBillingDays?: number,
guid?: string,
name?: string,
partner?: {
id?: number,
name?: string,
},
utmCampaign?: string,
utmSource?: string,
},
dateFirstBilling?: number,
plan?: {
basePrice?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
benefits?: List<{
text?: string,
}>,
billingProviders?: List<{
accountId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
priceId?: string,
productId?: string,
}>,
country?: {
code?: string,
id?: number,
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
defaultTrial?: {
units?: 'day',
value?: number,
},
delayBillingDays?: number,
description?: string,
family?: {
brands?: List<'echelon' | 'fitnation' | 'fitquest'>,
code?: 'premier' | 'select' | 'flex' | 'fitpass' | 'free',
type?: 'connected' | 'disconnected',
},
frequency?: {
units?: 'month',
value?: number,
},
frequencyDays?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
musicRights?: {
productId?: string,
vendor?: 'audibleMagic',
},
name?: string,
sku?: string,
sortOrder?: number,
sources?: List<{
accountId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
productId?: string,
}>,
tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>,
updatedBy?: {
id?: number,
},
},
redemptionCode?: {
batchGuid?: string,
campaignCode?: string,
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
delayBillingDays?: number,
+ eligibilityRequirements?: record,
plans?: List<{
id?: number,
}>,
redeemedBy?: {
id?: number,
},
referenceNumber?: string,
retailer?: {
bundleDays: number,
id?: number,
name: string,
},
serialNumber?: string,
status?: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon?: string,
subscription?: {
id?: number,
},
},
},
}GET /users/{userId}/account 
Return the current state of the user’s account with payment status
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
- status?: 'accepted' | 'blocked' | 'requested',
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}GET /users/{userId}/account 
Return the current state of the user’s account with payment status
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
+ code?: 'childProfile' | 'neverSubscribed' | 'notActivated' | 'onTrialCancelled' | 'onTrialPaused' | 'onTrial' | 'activeCancelled' | 'activePaused' | 'active' | 'expiredPaused' | 'expiredVoluntary' | 'expiredInvoluntary',
+ text?: string,
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}GET /users/{userId}/account/history 
Get the changes that have happened to this account
Response Body
{
data: List<{
action?: 'create' | 'activate' | 'started' | 'ended' | 'pause' | 'unpause' | 'cancel' | 'uncancel' | 'terminate' | 'change' | 'extend' | 'refund' | 'credit' | 'discount' | 'anonymize' | 'ban' | 'join-family' | 'unjoin-family' | 'memo' | 'upcoming' | 'paid' | 'updated' | 'failed',
dateOccurred?: number,
guid?: string,
initiatedBy?: {
id?: number,
},
internalNote?: string,
- payload: record,
publicNote?: string,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
source?: 'webhook' | 'cs' | 'member' | 'app' | 'nest',
subscription?: {
id?: number,
},
user?: {
id?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /users/{userId}/account/history 
Get the changes that have happened to this account
Response Body
{
data: List<{
action?: 'create' | 'activate' | 'started' | 'ended' | 'pause' | 'unpause' | 'cancel' | 'uncancel' | 'terminate' | 'change' | 'extend' | 'refund' | 'credit' | 'discount' | 'anonymize' | 'ban' | 'join-family' | 'unjoin-family' | 'memo' | 'upcoming' | 'paid' | 'updated' | 'failed',
dateOccurred?: number,
guid?: string,
initiatedBy?: {
id?: number,
},
internalNote?: string,
+ payload?: record,
publicNote?: string,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
source?: 'webhook' | 'cs' | 'member' | 'app' | 'nest',
subscription?: {
id?: number,
},
user?: {
id?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}POST /users/{userId}/account/change 
Response Body
{
data: {
- charges?: {
- balance?: {
- currentBalance?: number,
- futureCredit?: number,
},
- billedToday?: {
- discount?: number,
- subtotal?: number,
- total?: number,
- },
- recurring?: {
- dateStart?: number,
- frequencyDays?: number,
- price?: number,
- },
},
- currency?: {
- code?: string,
- scale?: number,
- symbol?: string,
},
- plan?: {
- basePrice?: {
- currency?: {
- code?: string,
- scale?: number,
- symbol?: string,
- },
- value?: number,
},
- benefits?: List<{
- text?: string,
- }>,
- billingProviders?: List<{
accountId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
- priceId?: string,
- productId?: string,
- }>,
- country?: {
- code?: string,
- id?: number,
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
- defaultTrial?: {
- units?: 'day',
- value?: number,
},
- delayBillingDays?: number,
- description?: string,
- family?: {
- brands?: List<'echelon' | 'fitnation' | 'fitquest'>,
- code?: 'premier' | 'select' | 'flex' | 'fitpass' | 'free',
- type?: 'connected' | 'disconnected',
},
- frequency?: {
- units?: 'month',
value?: number,
},
- frequencyDays?: number,
- id?: number,
- image?: {
- default: string,
- large: string,
- medium: string,
- small: string,
- url?: string,
},
- musicRights?: {
- productId?: string,
- vendor?: 'audibleMagic',
},
- name?: string,
- sku?: string,
- sortOrder?: number,
- sources?: List<{
accountId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
productId?: string,
- }>,
- tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>,
updatedBy?: {
id?: number,
},
},
},
}POST /users/{userId}/account/change 
Response Body
{
data: {
+ dateCancelled?: number,
+ dateExpires?: number,
+ datePausedUntil?: number,
+ nextInvoice?: {
+ amount?: number,
+ currency?: {
+ code?: string,
+ scale?: number,
+ symbol?: string,
},
+ dateScheduled?: number,
},
+ status?: {
+ code?: 'childProfile' | 'neverSubscribed' | 'notActivated' | 'onTrialCancelled' | 'onTrialPaused' | 'onTrial' | 'activeCancelled' | 'activePaused' | 'active' | 'expiredPaused' | 'expiredVoluntary' | 'expiredInvoluntary',
+ text?: string,
},
+ subscription?: {
+ activation?: {
+ isActivated?: bool,
},
+ billingProvider?: {
accountId?: string,
+ customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
+ orderId?: string,
},
+ cancellation?: {
+ dateCancelled?: number,
+ reason?: {
+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
+ message?: string,
+ },
+ },
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
+ id?: number,
+ pause?: {
+ dateEnd?: number,
+ dateStart?: number,
+ reason?: string,
},
+ plan?: {
+ id?: number,
},
+ price?: {
+ currency?: {
+ code?: string,
+ scale?: number,
+ symbol?: string,
+ },
value?: number,
},
+ promotion?: {
+ id?: number,
},
+ provisional?: {
+ isProvisioned?: bool,
},
+ renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
+ source?: {
accountId?: string,
+ lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
+ orderId?: string,
productId?: string,
+ },
+ status?: 'pending' | 'trialing' | 'active' | 'expired',
+ term?: {
+ dateEnd?: number,
+ dateStart?: number,
+ },
+ token?: string,
+ trial?: {
+ dateEnd?: number,
+ dateStart?: number,
+ },
updatedBy?: {
id?: number,
},
+ user?: {
+ id?: number,
+ },
+ utm?: {
+ campaign?: string,
+ content?: string,
+ medium?: string,
+ source?: string,
+ },
},
},
}POST /users/{userId}/account/cancel 
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
- status?: 'accepted' | 'blocked' | 'requested',
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/cancel 
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
+ code?: 'childProfile' | 'neverSubscribed' | 'notActivated' | 'onTrialCancelled' | 'onTrialPaused' | 'onTrial' | 'activeCancelled' | 'activePaused' | 'active' | 'expiredPaused' | 'expiredVoluntary' | 'expiredInvoluntary',
+ text?: string,
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/uncancel 
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
- status?: 'accepted' | 'blocked' | 'requested',
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/uncancel 
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
+ code?: 'childProfile' | 'neverSubscribed' | 'notActivated' | 'onTrialCancelled' | 'onTrialPaused' | 'onTrial' | 'activeCancelled' | 'activePaused' | 'active' | 'expiredPaused' | 'expiredVoluntary' | 'expiredInvoluntary',
+ text?: string,
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/pause 
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
- status?: 'accepted' | 'blocked' | 'requested',
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/pause 
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
+ code?: 'childProfile' | 'neverSubscribed' | 'notActivated' | 'onTrialCancelled' | 'onTrialPaused' | 'onTrial' | 'activeCancelled' | 'activePaused' | 'active' | 'expiredPaused' | 'expiredVoluntary' | 'expiredInvoluntary',
+ text?: string,
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/unpause 
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
- status?: 'accepted' | 'blocked' | 'requested',
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/unpause 
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
+ code?: 'childProfile' | 'neverSubscribed' | 'notActivated' | 'onTrialCancelled' | 'onTrialPaused' | 'onTrial' | 'activeCancelled' | 'activePaused' | 'active' | 'expiredPaused' | 'expiredVoluntary' | 'expiredInvoluntary',
+ text?: string,
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/terminate 
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
- status?: 'accepted' | 'blocked' | 'requested',
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/terminate 
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
+ code?: 'childProfile' | 'neverSubscribed' | 'notActivated' | 'onTrialCancelled' | 'onTrialPaused' | 'onTrial' | 'activeCancelled' | 'activePaused' | 'active' | 'expiredPaused' | 'expiredVoluntary' | 'expiredInvoluntary',
+ text?: string,
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/credit 
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
- status?: 'accepted' | 'blocked' | 'requested',
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/credit 
Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
+ code?: 'childProfile' | 'neverSubscribed' | 'notActivated' | 'onTrialCancelled' | 'onTrialPaused' | 'onTrial' | 'activeCancelled' | 'activePaused' | 'active' | 'expiredPaused' | 'expiredVoluntary' | 'expiredInvoluntary',
+ text?: string,
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/activate 
create a new subscription in stripe from shopify order, optionally applies a redemption code
Request Body
{
billingAddress?: {
city?: string,
country?: {
code?: string,
},
postalCode?: string,
region?: {
code?: string,
},
streetLine1?: string,
streetLine2?: string,
},
cardTokenId?: string,
email?: string,
firstName?: string,
- isFirstPeriodPrepaid: bool,
lastName?: string,
phoneNumber?: string,
redemptionCode: string,
utm: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
}Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
- status?: 'accepted' | 'blocked' | 'requested',
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}POST /users/{userId}/account/activate 
create a new subscription in stripe from shopify order, optionally applies a redemption code
Request Body
{
billingAddress?: {
city?: string,
country?: {
code?: string,
},
postalCode?: string,
region?: {
code?: string,
},
streetLine1?: string,
streetLine2?: string,
},
cardTokenId?: string,
email?: string,
firstName?: string,
+ isFirstPeriodPrepaid?: bool,
lastName?: string,
phoneNumber?: string,
redemptionCode: string,
utm: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
}Response Body
{
data: {
dateCancelled?: number,
dateExpires?: number,
datePausedUntil?: number,
nextInvoice?: {
amount?: number,
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
dateScheduled?: number,
},
status?: {
+ code?: 'childProfile' | 'neverSubscribed' | 'notActivated' | 'onTrialCancelled' | 'onTrialPaused' | 'onTrial' | 'activeCancelled' | 'activePaused' | 'active' | 'expiredPaused' | 'expiredVoluntary' | 'expiredInvoluntary',
+ text?: string,
},
subscription?: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
reason?: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
message?: string,
},
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
value?: number,
},
promotion?: {
id?: number,
},
provisional?: {
isProvisioned?: bool,
},
renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
source?: {
accountId?: string,
lineItemId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
orderId?: string,
productId?: string,
},
status?: 'pending' | 'trialing' | 'active' | 'expired',
term?: {
dateEnd?: number,
dateStart?: number,
},
token?: string,
trial?: {
dateEnd?: number,
dateStart?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
utm?: {
campaign?: string,
content?: string,
medium?: string,
source?: string,
},
},
},
}GET /redemption-codes 
Get a list of redemption codes
Response Body
{
data: List<{
batchGuid?: string,
campaignCode?: string,
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
delayBillingDays?: number,
- eligibilityRequirements: record,
plans?: List<{
id?: number,
}>,
redeemedBy?: {
id?: number,
},
referenceNumber?: string,
retailer?: {
bundleDays: number,
id?: number,
name: string,
},
serialNumber?: string,
status?: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon?: string,
subscription?: {
id?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /redemption-codes 
Get a list of redemption codes
Response Body
{
data: List<{
batchGuid?: string,
campaignCode?: string,
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
delayBillingDays?: number,
+ eligibilityRequirements?: record,
plans?: List<{
id?: number,
}>,
redeemedBy?: {
id?: number,
},
referenceNumber?: string,
retailer?: {
bundleDays: number,
id?: number,
name: string,
},
serialNumber?: string,
status?: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon?: string,
subscription?: {
id?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /redemption-codes/{code} 
Get a single Redemption Code
Response Body
{
data: {
batchGuid?: string,
campaignCode?: string,
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
delayBillingDays?: number,
- eligibilityRequirements: record,
plans?: List<{
id?: number,
}>,
redeemedBy?: {
id?: number,
},
referenceNumber?: string,
retailer?: {
bundleDays: number,
id?: number,
name: string,
},
serialNumber?: string,
status?: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon?: string,
subscription?: {
id?: number,
},
},
}GET /redemption-codes/{code} 
Get a single Redemption Code
Response Body
{
data: {
batchGuid?: string,
campaignCode?: string,
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
delayBillingDays?: number,
+ eligibilityRequirements?: record,
plans?: List<{
id?: number,
}>,
redeemedBy?: {
id?: number,
},
referenceNumber?: string,
retailer?: {
bundleDays: number,
id?: number,
name: string,
},
serialNumber?: string,
status?: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon?: string,
subscription?: {
id?: number,
},
},
}PATCH /redemption-codes/{code} 
Update an individual Redemption Code
Response Body
{
data: {
batchGuid?: string,
campaignCode?: string,
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
delayBillingDays?: number,
- eligibilityRequirements: record,
plans?: List<{
id?: number,
}>,
redeemedBy?: {
id?: number,
},
referenceNumber?: string,
retailer?: {
bundleDays: number,
id?: number,
name: string,
},
serialNumber?: string,
status?: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon?: string,
subscription?: {
id?: number,
},
},
}PATCH /redemption-codes/{code} 
Update an individual Redemption Code
Response Body
{
data: {
batchGuid?: string,
campaignCode?: string,
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
delayBillingDays?: number,
+ eligibilityRequirements?: record,
plans?: List<{
id?: number,
}>,
redeemedBy?: {
id?: number,
},
referenceNumber?: string,
retailer?: {
bundleDays: number,
id?: number,
name: string,
},
serialNumber?: string,
status?: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon?: string,
subscription?: {
id?: number,
},
},
}POST /redemption-codes/{code}/redemption 
Redeem a single code
Response Body
{
data: {
+ activation?: {
+ isActivated?: bool,
+ },
+ billingProvider?: {
+ accountId?: string,
+ customerId?: string,
+ name?: 'stripe' | 'ios' | 'android' | 'amazon',
+ orderId?: string,
+ },
+ cancellation?: {
+ dateCancelled?: number,
+ reason?: {
+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
+ message?: string,
+ },
+ },
+ createdBy?: {
+ id?: number,
+ },
+ dateCreated?: number,
+ dateUpdated?: number,
+ id?: number,
+ pause?: {
+ dateEnd?: number,
+ dateStart?: number,
+ reason?: string,
+ },
+ plan?: {
+ id?: number,
+ },
+ price?: {
+ currency?: {
+ code?: string,
+ scale?: number,
+ symbol?: string,
+ },
+ value?: number,
+ },
+ promotion?: {
+ id?: number,
+ },
+ provisional?: {
+ isProvisioned?: bool,
+ },
+ renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
+ source?: {
+ accountId?: string,
+ lineItemId?: string,
+ name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
+ orderId?: string,
+ productId?: string,
+ },
+ status?: 'pending' | 'trialing' | 'active' | 'expired',
+ term?: {
+ dateEnd?: number,
+ dateStart?: number,
+ },
+ token?: string,
+ trial?: {
+ dateEnd?: number,
+ dateStart?: number,
+ },
+ updatedBy?: {
+ id?: number,
+ },
+ user?: {
+ id?: number,
+ },
+ utm?: {
+ campaign?: string,
+ content?: string,
+ medium?: string,
+ source?: string,
+ },
},
}GET /redemption-codes/{code}/redemption 
Check if a redemption code is available to be redeemed. Returns the status of a redemption code, not a redemption code itself.
Response Body
{
data: {
- batchGuid?: string,
campaignCode?: string,
code?: string,
- createdBy?: {
- id?: number,
- },
- dateCreated?: number,
delayBillingDays?: number,
- eligibilityRequirements: record,
plans?: List<{
id?: number,
}>,
- redeemedBy?: {
- id?: number,
- },
referenceNumber?: string,
retailer?: {
bundleDays: number,
id?: number,
name: string,
},
serialNumber?: string,
status?: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon?: string,
- subscription?: {
- id?: number,
- },
},
}GET /redemption-codes/{code}/redemption 
Check if a redemption code is available to be redeemed. Returns the status of a redemption code, not a redemption code itself.
Response Body
{
data: {
+ billingPeriodStarts: string,
campaignCode?: string,
code?: string,
delayBillingDays?: number,
+ eligibilityRequirements?: record,
plans?: List<{
id?: number,
}>,
referenceNumber?: string,
retailer?: {
bundleDays: number,
id?: number,
name: string,
},
serialNumber?: string,
status?: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon?: string,
},
}GET /offers 
Get all offers
Response Body
{
- data: {
createdBy?: {
id?: number,
},
dateCreated?: number,
delayBilling?: {
days?: number,
text?: string,
type?: 'trial' | 'bundle',
},
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
introductory?: {
days?: number,
price?: number,
stripeCouponId?: string,
text?: string,
},
name?: string,
plan?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
family?: {
brands?: List<'echelon' | 'fitnation' | 'fitquest'>,
code?: 'premier' | 'select' | 'flex' | 'fitpass' | 'free',
type?: 'connected' | 'disconnected',
},
frequency?: {
days?: number,
},
id?: number,
lineItems: List<{
text?: string,
}>,
name: string,
},
recurring?: {
price?: number,
stripePriceId?: string,
text?: string,
},
status?: 'draft' | 'published',
},
}GET /offers 
Get all offers
Response Body
{
+ data: List<{
createdBy?: {
id?: number,
},
dateCreated?: number,
delayBilling?: {
days?: number,
text?: string,
type?: 'trial' | 'bundle',
},
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
introductory?: {
days?: number,
price?: number,
stripeCouponId?: string,
text?: string,
},
name?: string,
plan?: {
currency?: {
code?: string,
scale?: number,
symbol?: string,
},
family?: {
brands?: List<'echelon' | 'fitnation' | 'fitquest'>,
code?: 'premier' | 'select' | 'flex' | 'fitpass' | 'free',
type?: 'connected' | 'disconnected',
},
frequency?: {
days?: number,
},
id?: number,
lineItems: List<{
text?: string,
}>,
name: string,
},
recurring?: {
price?: number,
stripePriceId?: string,
text?: string,
},
status?: 'draft' | 'published',
+ }>,
+ pagination: {
+ page?: number,
+ skip?: number,
+ take?: number,
+ total: {
+ pages?: number,
+ rows?: number,
+ },
},
}GET /users/{userId}/preferences/full 
Get a list of the user preferences
Response Body
{
data: List<{
id?: number,
preference?: {
code?: string,
- defaultValue: record,
description?: string,
group?: {
id?: number,
},
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
user?: {
id?: number,
},
- value: record,
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /users/{userId}/preferences/full 
Get a list of the user preferences
Response Body
{
data: List<{
id?: number,
preference?: {
code?: string,
+ defaultValue?: record,
description?: string,
group?: {
id?: number,
},
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
user?: {
id?: number,
},
+ value?: record,
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /instructors 
Get a list of instructors
Response Body
{
data: List<{
bio?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
- status?: string,
studio?: {
id?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /instructors 
Get a list of instructors
Response Body
{
data: List<{
bio?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
+ status?: 'active' | 'inactive',
studio?: {
id?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}POST /instructors 
Create a new instructor
Guard: admin
Request Body
{
bio?: string,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
name?: string,
- status?: string,
studio?: {
id?: number,
},
user?: {
id?: number,
},
}Response Body
{
data: {
bio?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
- status?: string,
studio?: {
id?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
},
}POST /instructors 
Create a new instructor
Guard: producer
Request Body
{
bio?: string,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
name?: string,
+ status?: 'active' | 'inactive',
studio?: {
id?: number,
},
user?: {
id?: number,
},
}Response Body
{
data: {
bio?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
+ status?: 'active' | 'inactive',
studio?: {
id?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
},
}GET /instructors/{id} 
Get a specific instructor
Response Body
{
data: {
bio?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
- status?: string,
studio?: {
id?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
},
}GET /instructors/{id} 
Get a specific instructor
Response Body
{
data: {
bio?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
+ status?: 'active' | 'inactive',
studio?: {
id?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
},
}PATCH /instructors/{id} 
Update an existing instructor
Guard: admin
Request Body
{
bio: string,
flags: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
name: string,
- status: string,
studio: {
id?: number,
},
user: {
id?: number,
},
}Response Body
{
data: {
bio?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
- status?: string,
studio?: {
id?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
},
}PATCH /instructors/{id} 
Update an existing instructor
Guard: producer
Request Body
{
bio: string,
+ email: string,
flags: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
name: string,
+ status: 'active' | 'inactive',
studio: {
id?: number,
},
user: {
id?: number,
},
}Response Body
{
data: {
bio?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
+ status?: 'active' | 'inactive',
studio?: {
id?: number,
},
updatedBy?: {
id?: number,
},
user?: {
id?: number,
},
},
}GET /studios 
Get a list of all studios
Response Body
{
data: List<{
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
streetAddress?: {
city?: string,
country?: {
code?: string,
- currency?: {
- code?: string,
- scale?: number,
- symbol?: string,
- },
- dateCreated?: number,
- dateUpdated?: number,
id?: number,
- mediaNet?: {
- code?: string,
- territoryId?: number,
- },
name?: string,
- numberFormat?: {
- decimalSeparator?: '.' | ',' | ' ',
- thousandsSeparator?: '.' | ',' | ' ',
- },
- stripe?: {
- id?: number,
- },
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
updatedBy?: {
id?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /studios 
Get a list of all studios
Response Body
{
data: List<{
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
streetAddress?: {
city?: string,
country?: {
code?: string,
id?: number,
name?: string,
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
updatedBy?: {
id?: number,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}POST /studios 
Create new studio
Response Body
{
data: {
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
streetAddress?: {
city?: string,
country?: {
code?: string,
- currency?: {
- code?: string,
- scale?: number,
- symbol?: string,
- },
- dateCreated?: number,
- dateUpdated?: number,
id?: number,
- mediaNet?: {
- code?: string,
- territoryId?: number,
- },
name?: string,
- numberFormat?: {
- decimalSeparator?: '.' | ',' | ' ',
- thousandsSeparator?: '.' | ',' | ' ',
- },
- stripe?: {
- id?: number,
- },
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
updatedBy?: {
id?: number,
},
},
}POST /studios 
Create new studio
Response Body
{
data: {
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
streetAddress?: {
city?: string,
country?: {
code?: string,
id?: number,
name?: string,
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
updatedBy?: {
id?: number,
},
},
}GET /studios/{id} 
Get this specific studio
Response Body
{
data: {
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
streetAddress?: {
city?: string,
country?: {
code?: string,
- currency?: {
- code?: string,
- scale?: number,
- symbol?: string,
- },
- dateCreated?: number,
- dateUpdated?: number,
id?: number,
- mediaNet?: {
- code?: string,
- territoryId?: number,
- },
name?: string,
- numberFormat?: {
- decimalSeparator?: '.' | ',' | ' ',
- thousandsSeparator?: '.' | ',' | ' ',
- },
- stripe?: {
- id?: number,
- },
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
updatedBy?: {
id?: number,
},
},
}GET /studios/{id} 
Get this specific studio
Response Body
{
data: {
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
streetAddress?: {
city?: string,
country?: {
code?: string,
id?: number,
name?: string,
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
updatedBy?: {
id?: number,
},
},
}PATCH /studios/{id} 
Edit studio
Response Body
{
data: {
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
streetAddress?: {
city?: string,
country?: {
code?: string,
- currency?: {
- code?: string,
- scale?: number,
- symbol?: string,
- },
- dateCreated?: number,
- dateUpdated?: number,
id?: number,
- mediaNet?: {
- code?: string,
- territoryId?: number,
- },
name?: string,
- numberFormat?: {
- decimalSeparator?: '.' | ',' | ' ',
- thousandsSeparator?: '.' | ',' | ' ',
- },
- stripe?: {
- id?: number,
- },
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
updatedBy?: {
id?: number,
},
},
}PATCH /studios/{id} 
Edit studio
Response Body
{
data: {
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
streetAddress?: {
city?: string,
country?: {
code?: string,
id?: number,
name?: string,
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
updatedBy?: {
id?: number,
},
},
}GET /features 
Get a list of all available features
Response Body
{
data: List<{
code?: string,
- defaultValue: record,
description?: string,
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
usedBy?: List<'client' | 'server'>,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /features 
Get a list of all available features
Response Body
{
data: List<{
code?: string,
+ defaultValue?: record,
description?: string,
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
usedBy?: List<'client' | 'server'>,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}POST /features 
Create a new feature
Request Body
{
code?: string,
- defaultValue: record,
description?: string,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
usedBy?: List<'client' | 'server'>,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
}Response Body
{
data: {
code?: string,
- defaultValue: record,
description?: string,
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
usedBy?: List<'client' | 'server'>,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}POST /features 
Create a new feature
Request Body
{
code?: string,
+ defaultValue?: record,
description?: string,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
usedBy?: List<'client' | 'server'>,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
}Response Body
{
data: {
code?: string,
+ defaultValue?: record,
description?: string,
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
usedBy?: List<'client' | 'server'>,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}GET /features/{id} 
Get a specific feature
Response Body
{
data: {
code?: string,
- defaultValue: record,
description?: string,
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
usedBy?: List<'client' | 'server'>,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}GET /features/{id} 
Get a specific feature
Response Body
{
data: {
code?: string,
+ defaultValue?: record,
description?: string,
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
usedBy?: List<'client' | 'server'>,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}PUT /features/{id} 
Update an existing feature
Request Body
{
code?: string,
- defaultValue: record,
description?: string,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
usedBy?: List<'client' | 'server'>,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
}Response Body
{
data: {
code?: string,
- defaultValue: record,
description?: string,
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
usedBy?: List<'client' | 'server'>,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}PUT /features/{id} 
Update an existing feature
Request Body
{
code?: string,
+ defaultValue?: record,
description?: string,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
usedBy?: List<'client' | 'server'>,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
}Response Body
{
data: {
code?: string,
+ defaultValue?: record,
description?: string,
id?: number,
inputType?: 'string' | 'number' | 'boolean' | 'enum' | 'multiSelect',
name?: string,
sortOrder?: number,
usedBy?: List<'client' | 'server'>,
validation?: {
isNullable: bool,
maxChoices: number,
maxLength: number,
maxValue: number,
minChoices: number,
minLength: number,
minValue: number,
options: List<string>,
precision: number,
regexPattern: string,
},
},
}GET /songs 
Get a list of songs
Response Body
{
data: {
aggregations?: List<{
buckets?: List<{
}>,
key?: string,
}>,
count?: number,
pagination?: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
results?: List<{
album?: {
id?: number,
name?: string,
},
artists?: List<{
id?: number,
name?: string,
}>,
- copyright: record,
coverArtUrl?: string,
duration?: {
seconds: number,
text: string,
},
genres?: List<string>,
id?: number,
isExplicit?: bool,
isrc?: string,
label?: {
id?: number,
name?: string,
},
labelOwner?: {
id?: number,
name?: string,
},
- labelRights: record,
name?: string,
publisherRights?: List<string>,
releaseDate?: number,
- searchFlags: record,
}>,
},
}GET /songs 
Get a list of songs
Response Body
{
data: {
aggregations?: List<{
buckets?: List<{
}>,
key?: string,
}>,
count?: number,
pagination?: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
results?: List<{
album?: {
id?: number,
name?: string,
},
artists?: List<{
id?: number,
name?: string,
}>,
+ copyright?: record,
coverArtUrl?: string,
duration?: {
seconds: number,
text: string,
},
genres?: List<string>,
id?: number,
isExplicit?: bool,
isrc?: string,
label?: {
id?: number,
name?: string,
},
labelOwner?: {
id?: number,
name?: string,
},
+ labelRights?: record,
name?: string,
publisherRights?: List<string>,
releaseDate?: number,
+ searchFlags?: record,
}>,
},
}GET /songs/{id} 
Get a specific song
Response Body
{
data: {
album?: {
id?: number,
name?: string,
},
artists?: List<{
id?: number,
name?: string,
}>,
- copyright: record,
coverArtUrl?: string,
duration?: {
seconds: number,
text: string,
},
genres?: List<string>,
id?: number,
isExplicit?: bool,
isrc?: string,
label?: {
id?: number,
name?: string,
},
labelOwner?: {
id?: number,
name?: string,
},
- labelRights: record,
name?: string,
publisherRights?: List<string>,
releaseDate?: number,
- searchFlags: record,
},
}GET /songs/{id} 
Get a specific song
Response Body
{
data: {
album?: {
id?: number,
name?: string,
},
artists?: List<{
id?: number,
name?: string,
}>,
+ copyright?: record,
coverArtUrl?: string,
duration?: {
seconds: number,
text: string,
},
genres?: List<string>,
id?: number,
isExplicit?: bool,
isrc?: string,
label?: {
id?: number,
name?: string,
},
labelOwner?: {
id?: number,
name?: string,
},
+ labelRights?: record,
name?: string,
publisherRights?: List<string>,
releaseDate?: number,
+ searchFlags?: record,
},
}GET /songs/{id}/playlists 
Get all playlists that contain this song
Response Body
{
data: List<{
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged?: bool,
legacyContentExplicit?: bool,
name?: string,
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
videoLength?: {
id?: number,
name?: string,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /songs/{id}/playlists 
Get all playlists that contain this song
Response Body
{
data: List<{
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
+ name?: string,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged?: bool,
legacyContentExplicit?: bool,
name?: string,
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
videoLength?: {
id?: number,
name?: string,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /playlists 
Get a list of playlists
Response Body
{
data: List<{
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged?: bool,
legacyContentExplicit?: bool,
name?: string,
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
videoLength?: {
id?: number,
name?: string,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /playlists 
Get a list of playlists
Response Body
{
data: List<{
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
+ name?: string,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged?: bool,
legacyContentExplicit?: bool,
name?: string,
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
+ trackCount?: number,
videoLength?: {
id?: number,
name?: string,
},
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}POST /playlists 
Create a new playlist
Response Body
{
data: {
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged?: bool,
legacyContentExplicit?: bool,
name?: string,
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
videoLength?: {
id?: number,
name?: string,
},
},
}POST /playlists 
Create a new playlist
Response Body
{
data: {
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
+ name?: string,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged?: bool,
legacyContentExplicit?: bool,
name?: string,
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
videoLength?: {
id?: number,
name?: string,
},
},
}GET /playlists/{playlist} 
Get a single playlist by ID
Response Body
{
data: {
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged?: bool,
legacyContentExplicit?: bool,
name?: string,
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
tracks?: List<{
createdBy?: {
id?: number,
},
dateCreated?: number,
flag?: string,
playlist?: {
id?: number,
},
song?: {
album?: {
id?: number,
name?: string,
},
artists?: List<{
id?: number,
name?: string,
}>,
- copyright: record,
coverArtUrl?: string,
duration?: {
seconds: number,
text: string,
},
genres?: List<string>,
id?: number,
isExplicit?: bool,
isrc?: string,
label?: {
id?: number,
name?: string,
},
labelOwner?: {
id?: number,
name?: string,
},
- labelRights: record,
name?: string,
publisherRights?: List<string>,
releaseDate?: number,
- searchFlags: record,
},
trackOrder?: number,
}>,
videoLength?: {
id?: number,
name?: string,
},
},
}GET /playlists/{playlist} 
Get a single playlist by ID
Response Body
{
data: {
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
+ name?: string,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged?: bool,
legacyContentExplicit?: bool,
name?: string,
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
tracks?: List<{
createdBy?: {
id?: number,
},
dateCreated?: number,
flag?: string,
playlist?: {
id?: number,
},
song?: {
album?: {
id?: number,
name?: string,
},
artists?: List<{
id?: number,
name?: string,
}>,
+ copyright?: record,
coverArtUrl?: string,
duration?: {
seconds: number,
text: string,
},
genres?: List<string>,
id?: number,
isExplicit?: bool,
isrc?: string,
label?: {
id?: number,
name?: string,
},
labelOwner?: {
id?: number,
name?: string,
},
+ labelRights?: record,
name?: string,
publisherRights?: List<string>,
releaseDate?: number,
+ searchFlags?: record,
},
trackOrder?: number,
}>,
videoLength?: {
id?: number,
name?: string,
},
},
}PATCH /playlists/{id} 
Update an existing playlist
Request Body
{
countries: List<{
code?: string,
}>,
createdBy: {
id?: number,
},
dateCreated: number,
dateUpdated: number,
id: number,
instructors: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged: bool,
legacyContentExplicit: bool,
name: string,
schedule: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
videoLength: {
id?: number,
name?: string,
},
}Response Body
{
data: {
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged?: bool,
legacyContentExplicit?: bool,
name?: string,
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
videoLength?: {
id?: number,
name?: string,
},
},
}PATCH /playlists/{id} 
Update an existing playlist
Request Body
{
countries: List<{
code?: string,
}>,
createdBy: {
id?: number,
+ name?: string,
},
dateCreated: number,
dateUpdated: number,
id: number,
instructors: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged: bool,
legacyContentExplicit: bool,
name: string,
schedule: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
videoLength: {
id?: number,
name?: string,
},
}Response Body
{
data: {
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
+ name?: string,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged?: bool,
legacyContentExplicit?: bool,
name?: string,
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
+ tracks?: List<{
+ createdBy?: {
+ id?: number,
+ },
+ dateCreated?: number,
+ flag?: string,
+ playlist?: {
+ id?: number,
+ },
+ song?: {
+ album?: {
+ id?: number,
+ name?: string,
+ },
+ artists?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ copyright?: record,
+ coverArtUrl?: string,
+ duration?: {
+ seconds: number,
+ text: string,
+ },
+ genres?: List<string>,
+ id?: number,
+ isExplicit?: bool,
+ isrc?: string,
+ label?: {
+ id?: number,
+ name?: string,
+ },
+ labelOwner?: {
+ id?: number,
+ name?: string,
+ },
+ labelRights?: record,
+ name?: string,
+ publisherRights?: List<string>,
+ releaseDate?: number,
+ searchFlags?: record,
+ },
+ trackOrder?: number,
+ }>,
videoLength?: {
id?: number,
name?: string,
},
},
}POST /playlists/{playlist}/import 
Import all songs from a playlist to another playlist
Response Body
{
data: {
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged?: bool,
legacyContentExplicit?: bool,
name?: string,
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
tracks?: List<{
createdBy?: {
id?: number,
},
dateCreated?: number,
flag?: string,
playlist?: {
id?: number,
},
song?: {
album?: {
id?: number,
name?: string,
},
artists?: List<{
id?: number,
name?: string,
}>,
- copyright: record,
coverArtUrl?: string,
duration?: {
seconds: number,
text: string,
},
genres?: List<string>,
id?: number,
isExplicit?: bool,
isrc?: string,
label?: {
id?: number,
name?: string,
},
labelOwner?: {
id?: number,
name?: string,
},
- labelRights: record,
name?: string,
publisherRights?: List<string>,
releaseDate?: number,
- searchFlags: record,
},
trackOrder?: number,
}>,
videoLength?: {
id?: number,
name?: string,
},
},
}POST /playlists/{playlist}/import 
Import all songs from a playlist to another playlist
Response Body
{
data: {
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
+ name?: string,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
isFlagged?: bool,
legacyContentExplicit?: bool,
name?: string,
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
tracks?: List<{
createdBy?: {
id?: number,
},
dateCreated?: number,
flag?: string,
playlist?: {
id?: number,
},
song?: {
album?: {
id?: number,
name?: string,
},
artists?: List<{
id?: number,
name?: string,
}>,
+ copyright?: record,
coverArtUrl?: string,
duration?: {
seconds: number,
text: string,
},
genres?: List<string>,
id?: number,
isExplicit?: bool,
isrc?: string,
label?: {
id?: number,
name?: string,
},
labelOwner?: {
id?: number,
name?: string,
},
+ labelRights?: record,
name?: string,
publisherRights?: List<string>,
releaseDate?: number,
+ searchFlags?: record,
},
trackOrder?: number,
}>,
videoLength?: {
id?: number,
name?: string,
},
},
}GET /playlists/{playlistId}/tracks 
Get tracks from a given playlist
Response Body
{
data: List<{
createdBy?: {
id?: number,
},
dateCreated?: number,
flag?: string,
playlist?: {
id?: number,
},
song?: {
album?: {
id?: number,
name?: string,
},
artists?: List<{
id?: number,
name?: string,
}>,
- copyright: record,
coverArtUrl?: string,
duration?: {
seconds: number,
text: string,
},
genres?: List<string>,
id?: number,
isExplicit?: bool,
isrc?: string,
label?: {
id?: number,
name?: string,
},
labelOwner?: {
id?: number,
name?: string,
},
- labelRights: record,
name?: string,
publisherRights?: List<string>,
releaseDate?: number,
- searchFlags: record,
},
trackOrder?: number,
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /playlists/{playlistId}/tracks 
Get tracks from a given playlist
Response Body
{
data: List<{
createdBy?: {
id?: number,
},
dateCreated?: number,
flag?: string,
playlist?: {
id?: number,
},
song?: {
album?: {
id?: number,
name?: string,
},
artists?: List<{
id?: number,
name?: string,
}>,
+ copyright?: record,
coverArtUrl?: string,
duration?: {
seconds: number,
text: string,
},
genres?: List<string>,
id?: number,
isExplicit?: bool,
isrc?: string,
label?: {
id?: number,
name?: string,
},
labelOwner?: {
id?: number,
name?: string,
},
+ labelRights?: record,
name?: string,
publisherRights?: List<string>,
releaseDate?: number,
+ searchFlags?: record,
},
trackOrder?: number,
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}PATCH /playlists/{playlistId}/tracks/{songId} 
Response Body
{
- data: {
createdBy?: {
id?: number,
},
dateCreated?: number,
flag?: string,
playlist?: {
id?: number,
},
song?: {
id?: number,
},
trackOrder?: number,
},
}PATCH /playlists/{playlistId}/tracks/{songId} 
Response Body
{
+ data: List<{
createdBy?: {
id?: number,
},
dateCreated?: number,
flag?: string,
playlist?: {
id?: number,
},
song?: {
id?: number,
},
trackOrder?: number,
+ }>,
+ pagination: {
+ page?: number,
+ skip?: number,
+ take?: number,
+ total: {
+ pages?: number,
+ rows?: number,
+ },
},
}GET /content/library 
Search for content in the Library
Response Body
{
- data: List<{
aggregations?: List<{
buckets?: List<{
}>,
key?: string,
}>,
count?: number,
pagination?: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
results?: List<{
countries?: List<{
code?: string,
}>,
dateLive?: number,
description?: string,
guid?: string,
image?: string,
instructors?: List<string>,
length?: number,
name?: string,
studios?: List<string>,
tags?: List<{
text?: string,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
- }>,
- pagination: {
- page?: number,
- skip?: number,
- take?: number,
- total: {
- pages?: number,
- rows?: number,
- },
},
}GET /content/library 
Search for content in the Library
Response Body
{
+ data: {
aggregations?: List<{
buckets?: List<{
}>,
key?: string,
}>,
count?: number,
pagination?: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
results?: List<{
countries?: List<{
code?: string,
}>,
dateLive?: number,
description?: string,
guid?: string,
image?: string,
instructors?: List<string>,
length?: number,
name?: string,
studios?: List<string>,
tags?: List<{
text?: string,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
},
}GET /content/items/{guid} 
Get a specific content item
Response Body
{
- data: List<{
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
description?: string,
duration?: number,
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
name?: string,
playlist?: {
id?: number,
},
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
sourceUrl?: string,
status?: 'draft' | 'published',
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
updatedBy?: {
id?: number,
},
videoLength?: {
id?: number,
name?: string,
},
videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted',
- }>,
- pagination: {
- page?: number,
- skip?: number,
- take?: number,
- total: {
- pages?: number,
- rows?: number,
- },
},
}GET /content/items/{guid} 
Get a specific content item
Response Body
{
+ data: {
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
description?: string,
duration?: number,
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
instructors?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
name?: string,
playlist?: {
id?: number,
},
schedule?: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
sourceUrl?: string,
status?: 'draft' | 'published',
studios?: List<{
id?: number,
name?: string,
precedence?: number,
}>,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
updatedBy?: {
id?: number,
},
videoLength?: {
id?: number,
name?: string,
},
videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted',
},
}GET /content/recommendations 
Get content recommended for this user.
Response Body
{
data: List<{
- countries?: List<{
- code?: string,
- }>,
- createdBy?: {
- id?: number,
},
- dateCreated?: number,
- dateUpdated?: number,
description?: string,
- duration?: number,
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
- instructors?: List<{
- id?: number,
- name?: string,
- precedence?: number,
- }>,
name?: string,
- playlist?: {
- id?: number,
- },
- schedule?: List<{
- available?: {
- end?: number,
- live?: number,
- start?: number,
- },
- content?: {
- guid?: string,
- },
- guid?: string,
- legacy: {
- hlsUrl?: string,
- id?: number,
- liveStreamId?: number,
- type?: 'reflect' | 'connect',
- },
- type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
- }>,
- sourceUrl?: string,
- status?: 'draft' | 'published',
- studios?: List<{
- id?: number,
- name?: string,
- precedence?: number,
- }>,
- tags?: List<{
- image?: {
- default: string,
- large: string,
- medium: string,
- small: string,
- url?: string,
- },
- text?: string,
- translations: record,
- type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
- value?: string,
- }>,
- updatedBy?: {
- id?: number,
- },
- videoLength?: {
- id?: number,
- name?: string,
- },
- videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted',
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /content/recommendations 
Get content recommended for this user.
Response Body
{
data: List<{
+ available?: {
+ end?: number,
+ live?: number,
+ start?: number,
},
description?: string,
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
+ instructors?: List<string>,
name?: string,
+ score?: number,
+ studios?: List<string>,
+ type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /content/schedule 
Get list of scheduled content.
Response Body
{
data: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /content/schedule 
Get list of scheduled content.
Response Body
{
data: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
+ description?: string,
guid?: string,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
+ },
+ instructors?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ name?: string,
+ studios?: List<{
+ id?: number,
+ name?: string,
+ }>,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /content/schedule/{scheduleId} 
Get a piece of scheduled content by its guid (not its content guid!).
Response Body
{
- data: List<{
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
- }>,
- pagination: {
- page?: number,
- skip?: number,
- take?: number,
- total: {
- pages?: number,
- rows?: number,
- },
},
}GET /content/schedule/{scheduleId} 
Get a piece of scheduled content by its guid (not its content guid!).
Response Body
{
+ data: {
available?: {
end?: number,
live?: number,
start?: number,
},
content?: {
guid?: string,
},
guid?: string,
legacy: {
hlsUrl?: string,
id?: number,
liveStreamId?: number,
type?: 'reflect' | 'connect',
},
type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
},
}GET /firmware 
Get a list of the available firmware updates
Response Body
{
data: List<{
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
- data: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile?: {
url?: string,
},
version?: string,
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /firmware 
Get a list of the available firmware updates
Response Body
{
data: List<{
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
+ data?: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile?: {
url?: string,
},
version?: string,
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}POST /firmware 
Create Firmware Update
Request Body
{
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
- data: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile: {
data?: string,
filename?: string,
},
version?: string,
}Response Body
{
data: {
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
- data: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile?: {
url?: string,
},
version?: string,
},
}POST /firmware 
Create Firmware Update
Request Body
{
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
+ data?: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile: {
data?: string,
filename?: string,
},
version?: string,
}Response Body
{
data: {
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
+ data?: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile?: {
url?: string,
},
version?: string,
},
}GET /firmware/{id} 
Get Firmware Update by ID
Response Body
{
data: {
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
- data: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile?: {
url?: string,
},
version?: string,
},
}GET /firmware/{id} 
Get Firmware Update by ID
Response Body
{
data: {
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
+ data?: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile?: {
url?: string,
},
version?: string,
},
}PUT /firmware/{id} 
Update Firmware Update
Request Body
{
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
- data: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile: {
data?: string,
filename?: string,
},
version?: string,
}Response Body
{
data: {
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
- data: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile?: {
url?: string,
},
version?: string,
},
}PUT /firmware/{id} 
Update Firmware Update
Request Body
{
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
+ data?: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile: {
data?: string,
filename?: string,
},
version?: string,
}Response Body
{
data: {
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
+ data?: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile?: {
url?: string,
},
version?: string,
},
}PATCH /firmware/{id} 
Update Firmware Update
Request Body
{
appVersions: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities: List<{
- data: record,
name?: string,
}>,
dateReleased: number,
dateRequired: number,
name: string,
releaseNotes: string,
status: 'draft' | 'published' | 'trash',
supportedModels: List<string>,
type: 'hardware' | 'tablet' | 'reflect',
updateFile: {
data?: string,
filename?: string,
},
version: string,
}Response Body
{
data: {
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
- data: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile?: {
url?: string,
},
version?: string,
},
}PATCH /firmware/{id} 
Update Firmware Update
Request Body
{
appVersions: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities: List<{
+ data?: record,
name?: string,
}>,
dateReleased: number,
dateRequired: number,
name: string,
releaseNotes: string,
status: 'draft' | 'published' | 'trash',
supportedModels: List<string>,
type: 'hardware' | 'tablet' | 'reflect',
updateFile: {
data?: string,
filename?: string,
},
version: string,
}Response Body
{
data: {
appVersions?: {
android?: {
maxVersion?: string,
minVersion?: string,
},
ios?: {
maxVersion?: string,
minVersion?: string,
},
screen?: {
maxVersion?: string,
minVersion?: string,
},
},
capabilities?: List<{
+ data?: record,
name?: string,
}>,
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
updateFile?: {
url?: string,
},
version?: string,
},
}PUT /workouts/{workoutGuid} 
Updates a user workout
Request Body
{
device?: {
app_version?: string,
model?: string,
os?: string,
os_version?: string,
},
peripheral?: List<{
data_points?: List<unknown>,
events?: List<{
timestamp?: number,
type?: 'resistance' | 'speed' | 'incline' | 'pause' | 'connection',
value?: number,
}>,
info?: {
firmware_version?: string,
hardware_version?: string,
model_id?: string,
},
metrics?: List<unknown>,
name?: string,
type?: 'bike' | 'rower' | 'treadmill' | 'hrm',
uuid?: string,
}>,
user?: {
- id: number,
subscription_active?: bool,
weight?: number,
},
workout?: {
class_library?: string,
end_date?: number,
events: List<{
msg: string,
timestamp?: number,
type?: 'started' | 'paused' | 'completed' | 'social',
user: number,
}>,
id?: string,
metadata?: {
desc?: string,
id?: number,
instructor?: string,
playlist_id?: number,
promo?: bool,
title?: string,
},
product_name?: string,
start_date?: number,
},
}PUT /workouts/{workoutGuid} 
Updates a user workout
Request Body
{
device?: {
app_version?: string,
model?: string,
os?: string,
os_version?: string,
},
peripheral?: List<{
data_points?: List<unknown>,
events?: List<{
timestamp?: number,
type?: 'resistance' | 'speed' | 'incline' | 'pause' | 'connection',
value?: number,
}>,
info?: {
firmware_version?: string,
hardware_version?: string,
model_id?: string,
},
metrics?: List<unknown>,
name?: string,
type?: 'bike' | 'rower' | 'treadmill' | 'hrm',
uuid?: string,
}>,
user?: {
+ id?: number,
subscription_active?: bool,
weight?: number,
},
workout?: {
class_library?: string,
end_date?: number,
events: List<{
msg: string,
timestamp?: number,
type?: 'started' | 'paused' | 'completed' | 'social',
user: number,
}>,
id?: string,
metadata?: {
desc?: string,
id?: number,
instructor?: string,
playlist_id?: number,
promo?: bool,
title?: string,
},
product_name?: string,
start_date?: number,
},
}GET /collections 
List collections
Response Body
{
data: List<{
available?: {
end?: number,
start?: number,
},
badge?: {
guid?: string,
},
cardImage?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
coverImage?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
description?: string,
durationDays?: number,
episodeWord?: string,
guid?: string,
name?: string,
- showcase?: List<{
- collectionGuid?: string,
- country?: {
- code?: string,
- },
- guid?: string,
- sortOrder?: number,
- tagValue?: string,
- }>,
sortOrder?: number,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
totalCount?: number,
type?: 'generic' | 'series' | 'challenge' | 'program',
updatedBy?: {
id?: number,
},
visibility?: 'public' | 'unlisted' | 'private' | 'trash',
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /collections 
List collections
Response Body
{
data: List<{
available?: {
end?: number,
start?: number,
},
badge?: {
guid?: string,
},
cardImage?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
coverImage?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
description?: string,
durationDays?: number,
episodeWord?: string,
guid?: string,
name?: string,
sortOrder?: number,
tags?: List<{
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
text?: string,
translations: record,
type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
value?: string,
}>,
totalCount?: number,
type?: 'generic' | 'series' | 'challenge' | 'program',
updatedBy?: {
id?: number,
},
visibility?: 'public' | 'unlisted' | 'private' | 'trash',
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /collections/{guid}/schedule 
Get schedules inside of a Collection
Response Body
{
data: List<{
- description?: string,
- guid?: string,
- image?: {
- default: string,
- large: string,
- medium: string,
- small: string,
- url?: string,
},
- instructors?: List<{
- id?: number,
name?: string,
- }>,
- name?: string,
- studios?: List<{
id?: number,
- name?: string,
- }>,
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}GET /collections/{guid}/schedule 
Get schedules inside of a Collection
Response Body
{
data: List<{
+ available?: {
+ end?: number,
+ live?: number,
+ start?: number,
},
+ content?: {
+ description?: string,
+ guid?: string,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
+ },
+ instructors?: List<{
+ id?: number,
+ name?: string,
+ }>,
name?: string,
+ studios?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ },
+ guid?: string,
+ legacy: {
+ hlsUrl?: string,
id?: number,
+ liveStreamId?: number,
+ type?: 'reflect' | 'connect',
+ },
+ type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total: {
pages?: number,
rows?: number,
},
},
}