Nest Changelog
1.0.7
9/24/2021
1.1.3
2/9/2022
39 changed endpoints Collapse changed endpoints
GET /users 
Get all users
Guard: none
Response Body
{
data: List<{
- createdBy: record,
- dateActivated: number,
dateBirth: string,
- dateCreated: number,
- dateUpdated: number,
- email: string,
- firstName: string,
- gender: {
text: string,
- value?: 'm' | 'f',
},
- height: record,
- id: number,
- image: {
- default?: string,
- large?: string,
- medium?: string,
- small?: string,
},
- lastName: string,
mongoId?: string,
- nickname: string,
- parentId: number,
- purchased: record,
- roles: List<string>,
- stripe: record,
- updatedBy: {
id?: number,
},
- weight: record,
}>,
}GET /users 
Get all users
Guard: admin
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,
+ },
+ createdBy?: {
+ id?: number,
+ },
+ dateActivated?: number,
dateBirth: string,
+ dateCreated?: number,
+ dateUpdated?: number,
+ email?: string,
+ firstName?: string,
+ gender?: {
text: string,
+ value?: 'm' | 'f' | 'o',
},
+ height?: {
+ text?: string,
+ units?: 'in' | 'cm',
+ value?: number,
},
+ id?: number,
+ image?: {
+ default: string,
+ 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,
+ },
+ updatedBy?: {
+ id?: number,
+ },
+ weight?: {
+ text?: string,
+ units?: 'lb' | 'kg',
+ value?: number,
+ },
}>,
}GET /users/{userId} 
Get a specific user by id
Guard: none
Response Body
{
data: {
- createdBy: record,
- dateActivated: number,
dateBirth: string,
- dateCreated: number,
- dateUpdated: number,
- email: string,
- firstName: string,
- gender: {
text: string,
- value?: 'm' | 'f',
},
- height: record,
- id: number,
- image: {
- default?: string,
- large?: string,
- medium?: string,
- small?: string,
},
- lastName: string,
mongoId?: string,
- nickname: string,
- parentId: number,
- purchased: record,
- roles: List<string>,
- stripe: record,
- updatedBy: {
id?: number,
},
- weight: record,
},
}GET /users/{userId} 
Get a specific user by id
Guard: familyOrAdmin
Response Body
{
data: {
+ billingAddress?: {
+ city?: string,
+ country?: {
+ code?: string,
+ id?: number,
+ name?: string,
+ },
+ postalCode?: string,
+ region?: {
+ code?: string,
+ name?: string,
+ },
+ streetLine1?: string,
+ streetLine2?: string,
+ },
+ createdBy?: {
+ id?: number,
+ },
+ dateActivated?: number,
dateBirth: string,
+ dateCreated?: number,
+ dateUpdated?: number,
+ email?: string,
+ firstName?: string,
+ gender?: {
text: string,
+ value?: 'm' | 'f' | 'o',
},
+ height?: {
+ text?: string,
+ units?: 'in' | 'cm',
+ value?: number,
},
+ id?: number,
+ image?: {
+ default: string,
+ 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,
+ },
+ updatedBy?: {
+ id?: number,
+ },
+ weight?: {
+ text?: string,
+ units?: 'lb' | 'kg',
+ value?: number,
+ },
},
}PATCH /users/{userId} 
Edit this user
Guard: none
Request Body
{
dateBirth: string,
email: string,
firstName: string,
gender: {
- text: string,
- value?: 'm' | 'f',
},
height: {
units?: 'in' | 'cm',
value?: number,
},
lastName: string,
nickname: string,
weight: {
units?: 'lb' | 'kg',
value?: number,
},
}Response Body
{
data: {
- createdBy: record,
- dateActivated: number,
dateBirth: string,
- dateCreated: number,
- dateUpdated: number,
- email: string,
- firstName: string,
- gender: {
text: string,
- value?: 'm' | 'f',
},
- height: record,
- id: number,
- image: {
- default?: string,
- large?: string,
- medium?: string,
- small?: string,
},
- lastName: string,
mongoId?: string,
- nickname: string,
- parentId: number,
- purchased: record,
- roles: List<string>,
- stripe: record,
- updatedBy: {
id?: number,
},
- weight: record,
},
}PATCH /users/{userId} 
Edit this user
Guard: familyOrAdmin
Request Body
{
+ billingAddress: {
+ city: string,
+ country: {
+ code?: string,
+ },
+ postalCode: string,
+ region: {
+ code?: string,
+ },
+ streetLine1: string,
+ streetLine2: string,
+ },
dateBirth: string,
email: string,
firstName: string,
gender: {
+ value?: 'm' | 'f' | 'o',
},
height: {
units?: 'in' | 'cm',
value?: number,
},
+ image: {
+ default: string,
+ 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>,
weight: {
units?: 'lb' | 'kg',
value?: number,
},
}Response Body
{
data: {
+ billingAddress?: {
+ city?: string,
+ country?: {
+ code?: string,
+ id?: number,
+ name?: string,
+ },
+ postalCode?: string,
+ region?: {
+ code?: string,
+ name?: string,
+ },
+ streetLine1?: string,
+ streetLine2?: string,
+ },
+ createdBy?: {
+ id?: number,
+ },
+ dateActivated?: number,
dateBirth: string,
+ dateCreated?: number,
+ dateUpdated?: number,
+ email?: string,
+ firstName?: string,
+ gender?: {
text: string,
+ value?: 'm' | 'f' | 'o',
},
+ height?: {
+ text?: string,
+ units?: 'in' | 'cm',
+ value?: number,
},
+ id?: number,
+ image?: {
+ default: string,
+ 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,
+ },
+ updatedBy?: {
+ id?: number,
+ },
+ weight?: {
+ text?: string,
+ units?: 'lb' | 'kg',
+ value?: number,
+ },
},
}GET /users/{userId}/family 
Get child accounts of this user
Guard: none
Response Body
{
data: List<{
- createdBy: record,
- dateActivated: number,
dateBirth: string,
- dateCreated: number,
- dateUpdated: number,
- email: string,
- firstName: string,
- gender: {
text: string,
- value?: 'm' | 'f',
},
- height: record,
- id: number,
- image: {
- default?: string,
- large?: string,
- medium?: string,
- small?: string,
},
- lastName: string,
mongoId?: string,
- nickname: string,
- parentId: number,
- purchased: record,
- roles: List<string>,
- stripe: record,
- updatedBy: {
id?: number,
},
- weight: record,
}>,
}GET /users/{userId}/family 
Get child accounts of this user
Guard: familyOrAdmin
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,
+ },
+ createdBy?: {
+ id?: number,
+ },
+ dateActivated?: number,
dateBirth: string,
+ dateCreated?: number,
+ dateUpdated?: number,
+ email?: string,
+ firstName?: string,
+ gender?: {
text: string,
+ value?: 'm' | 'f' | 'o',
},
+ height?: {
+ text?: string,
+ units?: 'in' | 'cm',
+ value?: number,
},
+ id?: number,
+ image?: {
+ default: string,
+ 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,
+ },
+ updatedBy?: {
+ id?: number,
+ },
+ weight?: {
+ text?: string,
+ units?: 'lb' | 'kg',
+ value?: number,
+ },
}>,
}POST /users/{userId}/family 
Guard: none
Request Body
{
- dateBirth?: string,
email?: string,
- firstName?: string,
gender: {
- text: string,
- value?: 'm' | 'f',
},
height: {
units?: 'in' | 'cm',
value?: number,
},
- lastName?: string,
nickname: string,
weight: {
units?: 'lb' | 'kg',
value?: number,
},
}Response Body
{
data: {
- createdBy: record,
- dateActivated: number,
dateBirth: string,
- dateCreated: number,
- dateUpdated: number,
- email: string,
- firstName: string,
- gender: {
text: string,
- value?: 'm' | 'f',
},
- height: record,
- id: number,
- image: {
- default?: string,
- large?: string,
- medium?: string,
- small?: string,
},
- lastName: string,
mongoId?: string,
- nickname: string,
- parentId: number,
- purchased: record,
- roles: List<string>,
- stripe: record,
- updatedBy: {
id?: number,
},
- weight: record,
},
}POST /users/{userId}/family 
Guard: family
Request Body
{
+ billingAddress: {
+ city: string,
+ country: {
+ code?: string,
+ },
+ postalCode: string,
+ region: {
+ code?: string,
+ },
+ streetLine1: string,
+ streetLine2: string,
+ },
+ dateBirth: string,
email?: string,
+ firstName: string,
gender: {
+ value?: 'm' | 'f' | 'o',
},
height: {
units?: 'in' | 'cm',
value?: number,
},
+ image: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
+ },
+ lastName: string,
+ mongoId: string,
nickname: string,
+ parent: {
+ id?: number,
+ mongoId?: string,
+ },
+ password?: string,
+ phoneNumber: string,
+ purchaseHistory: List<{
+ datePurchased?: number,
+ name?: string,
+ retailer?: {
+ id?: number,
+ name?: string,
+ },
+ serialNumber?: string,
+ }>,
+ roles: List<string>,
weight: {
units?: 'lb' | 'kg',
value?: number,
},
}Response Body
{
data: {
+ billingAddress?: {
+ city?: string,
+ country?: {
+ code?: string,
+ id?: number,
+ name?: string,
+ },
+ postalCode?: string,
+ region?: {
+ code?: string,
+ name?: string,
+ },
+ streetLine1?: string,
+ streetLine2?: string,
+ },
+ createdBy?: {
+ id?: number,
+ },
+ dateActivated?: number,
dateBirth: string,
+ dateCreated?: number,
+ dateUpdated?: number,
+ email?: string,
+ firstName?: string,
+ gender?: {
text: string,
+ value?: 'm' | 'f' | 'o',
},
+ height?: {
+ text?: string,
+ units?: 'in' | 'cm',
+ value?: number,
},
+ id?: number,
+ image?: {
+ default: string,
+ 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,
+ },
+ updatedBy?: {
+ id?: number,
+ },
+ weight?: {
+ text?: string,
+ units?: 'lb' | 'kg',
+ value?: number,
+ },
},
}GET /plans 
Get all Plans
Response Body
{
data: List<{
- amazon: {
- sku: string,
},
id?: number,
- image: {
url?: string,
},
- name: string,
- price: {
- currency: string,
- units?: number,
- },
- shopify: {
productId?: string,
- shopId: string,
},
- sku: string,
- sortOrder: number,
- stripe: {
- planId?: string,
productId?: string,
},
- termFrequency: number,
- trialDays: number,
}>,
}GET /plans 
Get all Plans
Response Body
{
data: List<{
+ 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,
+ },
+ description?: string,
+ frequency?: {
+ units?: 'month',
+ value?: number,
+ },
id?: number,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
url?: string,
},
+ musicRights?: {
productId?: string,
+ vendor?: 'audibleMagic',
},
+ name?: string,
+ price?: {
+ currency?: string,
+ value?: number,
+ },
+ sku?: string,
+ sortOrder?: number,
+ sources?: List<{
+ accountId?: string,
+ name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
productId?: string,
+ }>,
+ tags?: List<string>,
+ updatedBy?: {
+ id?: number,
},
}>,
}POST /plans 
Create Plan
Guard: none
Request Body
{
- amazon: {
- sku: string,
},
- image: {
url?: string,
},
name?: string,
- price: {
- currency: string,
- units?: number,
},
- shopify: {
productId?: string,
- shopId: string,
- },
- sku: string,
- sortOrder: number,
- stripe: {
- planId?: string,
- productId?: string,
- },
- termFrequency?: number,
- trialDays: number,
}Response Body
{
data: {
- amazon: {
- sku: string,
},
id?: number,
- image: {
url?: string,
},
- name: string,
- price: {
- currency: string,
- units?: number,
- },
- shopify: {
productId?: string,
- shopId: string,
},
- sku: string,
- sortOrder: number,
- stripe: {
- planId?: string,
productId?: string,
},
- termFrequency: number,
- trialDays: number,
},
}POST /plans 
Create Plan
Guard: admin
Request Body
{
+ billingProviders?: List<{
+ accountId?: string,
+ name?: 'stripe' | 'ios' | 'android' | 'amazon',
+ priceId?: string,
+ productId?: string,
+ }>,
+ country?: {
+ code?: string,
+ id?: number,
},
+ defaultTrial?: {
+ units?: 'day',
+ value?: number,
+ },
+ description?: string,
+ frequency?: {
+ units?: 'month',
+ value?: number,
+ },
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
url?: string,
},
+ musicRights?: {
+ productId?: string,
+ vendor?: 'audibleMagic',
+ },
name?: string,
+ price?: {
+ currency?: string,
+ value?: number,
},
+ sku?: string,
+ sortOrder?: number,
+ sources?: List<{
+ accountId?: string,
+ name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
productId?: string,
+ }>,
+ tags?: List<string>,
}Response Body
{
data: {
+ 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,
+ },
+ description?: string,
+ frequency?: {
+ units?: 'month',
+ value?: number,
+ },
id?: number,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
url?: string,
},
+ musicRights?: {
productId?: string,
+ vendor?: 'audibleMagic',
},
+ name?: string,
+ price?: {
+ currency?: string,
+ value?: number,
+ },
+ sku?: string,
+ sortOrder?: number,
+ sources?: List<{
+ accountId?: string,
+ name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
productId?: string,
+ }>,
+ tags?: List<string>,
+ updatedBy?: {
+ id?: number,
},
},
}GET /plans/{id} 
Get Plan by id
Response Body
{
data: {
- amazon: {
- sku: string,
},
id?: number,
- image: {
url?: string,
},
- name: string,
- price: {
- currency: string,
- units?: number,
- },
- shopify: {
productId?: string,
- shopId: string,
},
- sku: string,
- sortOrder: number,
- stripe: {
- planId?: string,
productId?: string,
},
- termFrequency: number,
- trialDays: number,
},
}GET /plans/{id} 
Get Plan by id
Response Body
{
data: {
+ 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,
+ },
+ description?: string,
+ frequency?: {
+ units?: 'month',
+ value?: number,
+ },
id?: number,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
url?: string,
},
+ musicRights?: {
productId?: string,
+ vendor?: 'audibleMagic',
},
+ name?: string,
+ price?: {
+ currency?: string,
+ value?: number,
+ },
+ sku?: string,
+ sortOrder?: number,
+ sources?: List<{
+ accountId?: string,
+ name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
productId?: string,
+ }>,
+ tags?: List<string>,
+ updatedBy?: {
+ id?: number,
},
},
}PATCH /plans/{id} 
Update Plan
Guard: none
Request Body
{
- amazon: {
- sku: string,
},
image: {
url?: string,
},
name: string,
price: {
- currency: string,
- units?: number,
},
- shopify: {
- productId?: string,
- shopId: string,
- },
sku: string,
sortOrder: number,
- stripe: {
- planId?: string,
productId?: string,
- },
- termFrequency: number,
- trialDays: number,
}Response Body
{
data: {
- amazon: {
- sku: string,
},
id?: number,
- image: {
url?: string,
},
- name: string,
- price: {
- currency: string,
- units?: number,
- },
- shopify: {
productId?: string,
- shopId: string,
},
- sku: string,
- sortOrder: number,
- stripe: {
- planId?: string,
productId?: string,
},
- termFrequency: number,
- trialDays: number,
},
}PATCH /plans/{id} 
Update Plan
Guard: admin
Request Body
{
+ billingProviders: List<{
+ accountId?: string,
+ name?: 'stripe' | 'ios' | 'android' | 'amazon',
+ priceId?: string,
+ productId?: string,
+ }>,
+ country: {
+ code?: string,
+ id?: number,
},
+ defaultTrial: {
+ units?: 'day',
+ value?: number,
+ },
+ description: string,
+ frequency: {
+ units?: 'month',
+ value?: number,
+ },
image: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
url?: string,
},
+ musicRights: {
+ productId?: string,
+ vendor?: 'audibleMagic',
+ },
name: string,
price: {
+ currency?: string,
+ value?: number,
},
sku: string,
sortOrder: number,
+ sources: List<{
+ accountId?: string,
+ name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
productId?: string,
+ }>,
+ tags: List<string>,
}Response Body
{
data: {
+ 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,
+ },
+ description?: string,
+ frequency?: {
+ units?: 'month',
+ value?: number,
+ },
id?: number,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
url?: string,
},
+ musicRights?: {
productId?: string,
+ vendor?: 'audibleMagic',
},
+ name?: string,
+ price?: {
+ currency?: string,
+ value?: number,
+ },
+ sku?: string,
+ sortOrder?: number,
+ sources?: List<{
+ accountId?: string,
+ name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
productId?: string,
+ }>,
+ tags?: List<string>,
+ updatedBy?: {
+ id?: number,
},
},
}POST /auth 
Sign in with email address and password
Request Body
{
email?: string,
password?: string,
}Response Body
{
data: {
family?: List<{
id?: number,
- image: {
- default?: string,
- large?: string,
- medium?: string,
- small?: string,
},
nickname?: string,
}>,
guid?: string,
jwt?: string,
mongoId?: string,
- plan: {
features?: record,
id?: number,
name?: string,
},
userId?: number,
},
}POST /auth 
Sign in with email address and password
Request Body
{
+ commercial: {
+ Commercial Code?: string,
+ },
email?: string,
password?: string,
}Response Body
{
data: {
family?: List<{
id?: number,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
},
nickname?: string,
}>,
guid?: string,
jwt?: string,
mongoId?: string,
+ plan?: {
features?: record,
id?: number,
name?: string,
},
userId?: number,
},
}GET /auth/{sessionGuid} 
Refresh the token
Response Body
{
data: {
family?: List<{
id?: number,
- image: {
- default?: string,
- large?: string,
- medium?: string,
- small?: string,
},
nickname?: string,
}>,
guid?: string,
jwt?: string,
mongoId?: string,
- plan: {
features?: record,
id?: number,
name?: string,
},
userId?: number,
},
}GET /auth/{sessionGuid} 
Refresh the token
Response Body
{
data: {
family?: List<{
id?: number,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
},
nickname?: string,
}>,
guid?: string,
jwt?: string,
mongoId?: string,
+ plan?: {
features?: record,
id?: number,
name?: string,
},
userId?: number,
},
}POST /auth/upgrade 
Trade in your token from the legacy token for a session
Response Body
{
data: {
family?: List<{
id?: number,
- image: {
- default?: string,
- large?: string,
- medium?: string,
- small?: string,
},
nickname?: string,
}>,
guid?: string,
jwt?: string,
mongoId?: string,
- plan: {
features?: record,
id?: number,
name?: string,
},
userId?: number,
},
}POST /auth/upgrade 
Trade in your token from the legacy token for a session
Response Body
{
data: {
family?: List<{
id?: number,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
},
nickname?: string,
}>,
guid?: string,
jwt?: string,
mongoId?: string,
+ plan?: {
features?: record,
id?: number,
name?: string,
},
userId?: number,
},
}GET /instructors 
Get a list of instructors
Response Body
{
data: List<{
bio?: string,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
id?: number,
- image: {
- default?: string,
- large?: string,
- medium?: string,
- small?: string,
},
name?: string,
- user: {
id?: 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,
+ updatedBy?: {
id?: number,
},
+ user?: {
+ id?: number,
+ },
}>,
}POST /instructors 
Create a new instructor
Request Body
{
- bio: string,
- flags: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
- image: {
- data?: string,
- filename?: string,
- },
name?: string,
- user: {
id?: number,
},
}Response Body
{
data: {
bio?: string,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
id?: number,
- image: {
- default?: string,
- large?: string,
- medium?: string,
- small?: string,
},
name?: string,
- user: {
id?: number,
},
},
}POST /instructors 
Create a new instructor
Request Body
{
+ bio?: string,
+ flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
name?: string,
+ 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,
+ updatedBy?: {
id?: number,
},
+ user?: {
+ id?: number,
+ },
},
}GET /instructors/{id} 
Get a specific instructor
Response Body
{
data: {
bio?: string,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
id?: number,
- image: {
- default?: string,
- large?: string,
- medium?: string,
- small?: string,
},
name?: string,
- 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,
+ updatedBy?: {
id?: number,
},
+ user?: {
+ id?: number,
+ },
},
}PATCH /instructors/{id} 
Update an existing instructor
Guard: none
Request Body
{
bio: string,
flags: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
- image: {
- data?: string,
- filename?: string,
- },
name: string,
user: {
id?: number,
},
}Response Body
{
data: {
bio?: string,
flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
id?: number,
- image: {
- default?: string,
- large?: string,
- medium?: string,
- small?: string,
},
name?: string,
- user: {
id?: number,
},
},
}PATCH /instructors/{id} 
Update an existing instructor
Guard: admin
Request Body
{
bio: string,
flags: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
name: string,
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,
+ updatedBy?: {
id?: number,
},
+ user?: {
+ id?: number,
+ },
},
}GET /studios 
Get a list of all studios
Response Body
{
data: List<{
code?: string,
- country: {
- code?: string,
id?: number,
},
id?: number,
name?: string,
}>,
}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,
+ },
}>,
}GET /studios/{id} 
Get this specific studio
Response Body
{
data: {
code?: string,
- country: {
- code?: string,
id?: number,
},
id?: number,
name?: string,
},
}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,
+ },
},
}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',
- 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 
Get a list of all available features
Response Body
{
data: List<{
+ code?: string,
defaultValue: record,
+ description?: string,
id?: number,
+ inputType?: 'string' | 'number' | 'boolean' | 'enum',
+ 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',
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',
- 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',
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',
+ 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',
- 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',
+ 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',
- 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',
- 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',
+ 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',
+ 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: List<{
- album: {
id?: number,
name?: string,
},
- artist: List<List<undefined>>,
- coverArtUrl?: string,
- duration: {
seconds: number,
text: string,
},
- genres: List<List<undefined>>,
id?: number,
isExplicit?: bool,
- isrc?: string,
- label: {
id?: number,
name?: string,
},
- labelOwner: {
id?: number,
name?: string,
},
- licenseDetails: {
label: record,
publisher: record,
},
licensedIn?: List<string>,
name?: string,
yearPublished?: number,
}>,
}GET /songs 
Get a list of songs
Response Body
{
data: List<{
+ album?: {
id?: number,
name?: string,
},
+ artist?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ coverArt?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
+ },
+ duration?: {
seconds: number,
text: string,
},
+ genres?: List<{
+ id?: number,
+ name?: string,
+ }>,
id?: number,
isExplicit?: bool,
+ isrcCode?: string,
+ label?: {
id?: number,
name?: string,
},
+ labelOwner?: {
id?: number,
name?: string,
},
+ licenseDetails?: {
label: record,
publisher: record,
},
licensedIn?: List<string>,
name?: string,
yearPublished?: number,
}>,
}GET /songs/{id} 
Get a specific song
Response Body
{
data: {
- album: {
id?: number,
name?: string,
},
- artist: List<List<undefined>>,
- coverArtUrl?: string,
- duration: {
seconds: number,
text: string,
},
- genres: List<List<undefined>>,
id?: number,
isExplicit?: bool,
- isrc?: string,
- label: {
id?: number,
name?: string,
},
- labelOwner: {
id?: number,
name?: string,
},
- licenseDetails: {
label: record,
publisher: record,
},
licensedIn?: List<string>,
name?: string,
yearPublished?: number,
},
}GET /songs/{id} 
Get a specific song
Response Body
{
data: {
+ album?: {
id?: number,
name?: string,
},
+ artist?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ coverArt?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
+ },
+ duration?: {
seconds: number,
text: string,
},
+ genres?: List<{
+ id?: number,
+ name?: string,
+ }>,
id?: number,
isExplicit?: bool,
+ isrcCode?: string,
+ label?: {
id?: number,
name?: string,
},
+ labelOwner?: {
id?: number,
name?: string,
},
+ licenseDetails?: {
label: record,
publisher: record,
},
licensedIn?: List<string>,
name?: string,
yearPublished?: number,
},
}GET /songs/{id}/playlists 
Get all playlists that contain this song
Response Body
{
data: List<{
- createdBy: {
id?: number,
},
dateCreated?: number,
- dateModified?: number,
id?: number,
name?: string,
- tracks: List<List<undefined>>,
}>,
}GET /songs/{id}/playlists 
Get all playlists that contain this song
Response Body
{
data: List<{
+ content?: {
+ countries?: List<{
+ code?: string,
+ }>,
+ createdBy?: {
+ id?: number,
+ },
+ dateCreated?: number,
+ dateUpdated?: number,
+ description?: string,
+ guid?: string,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
+ },
+ instructors?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ keywords?: List<string>,
+ name?: string,
+ playlist?: {
+ id?: number,
+ name?: string,
+ },
+ schedule?: List<{
+ dateAvailable?: number,
+ type?: 'live' | 'vod' | 'encore',
+ }>,
+ status?: 'draft' | 'published',
+ studios?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ tags?: List<{
+ text?: string,
+ type?: 'category',
+ value?: string,
+ }>,
+ updatedBy?: {
+ id?: number,
+ },
+ videoLength?: {
+ id?: number,
+ name?: string,
+ },
+ },
+ createdBy?: {
id?: number,
},
dateCreated?: number,
+ dateUpdated?: number,
id?: number,
name?: string,
}>,
}GET /playlists 
Get a list of playlists
Guard: none
Response Body
{
data: List<{
- createdBy: {
id?: number,
},
dateCreated?: number,
- dateModified?: number,
id?: number,
name?: string,
- tracks: List<List<undefined>>,
}>,
}GET /playlists 
Get a list of playlists
Guard: instructor
Response Body
{
data: List<{
+ content?: {
+ countries?: List<{
+ code?: string,
+ }>,
+ createdBy?: {
+ id?: number,
+ },
+ dateCreated?: number,
+ dateUpdated?: number,
+ description?: string,
+ guid?: string,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
+ },
+ instructors?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ keywords?: List<string>,
+ name?: string,
+ playlist?: {
+ id?: number,
+ name?: string,
+ },
+ schedule?: List<{
+ dateAvailable?: number,
+ type?: 'live' | 'vod' | 'encore',
+ }>,
+ status?: 'draft' | 'published',
+ studios?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ tags?: List<{
+ text?: string,
+ type?: 'category',
+ value?: string,
+ }>,
+ updatedBy?: {
+ id?: number,
+ },
+ videoLength?: {
+ id?: number,
+ name?: string,
+ },
+ },
+ createdBy?: {
id?: number,
},
dateCreated?: number,
+ dateUpdated?: number,
id?: number,
name?: string,
}>,
}POST /playlists 
Create a new playlist
Guard: none
Response Body
{
data: {
- createdBy: {
id?: number,
},
dateCreated?: number,
- dateModified?: number,
id?: number,
name?: string,
- tracks: List<List<undefined>>,
},
}POST /playlists 
Create a new playlist
Guard: instructor
Response Body
{
data: {
+ content?: {
+ countries?: List<{
+ code?: string,
+ }>,
+ createdBy?: {
+ id?: number,
+ },
+ dateCreated?: number,
+ dateUpdated?: number,
+ description?: string,
+ guid?: string,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
+ },
+ instructors?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ keywords?: List<string>,
+ name?: string,
+ playlist?: {
+ id?: number,
+ name?: string,
+ },
+ schedule?: List<{
+ dateAvailable?: number,
+ type?: 'live' | 'vod' | 'encore',
+ }>,
+ status?: 'draft' | 'published',
+ studios?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ tags?: List<{
+ text?: string,
+ type?: 'category',
+ value?: string,
+ }>,
+ updatedBy?: {
+ id?: number,
+ },
+ videoLength?: {
+ id?: number,
+ name?: string,
+ },
+ },
+ createdBy?: {
id?: number,
},
dateCreated?: number,
+ dateUpdated?: number,
id?: number,
name?: string,
},
}GET /playlists/{id} 
Get a specific playlist
Guard: none
Response Body
{
data: {
- createdBy: {
id?: number,
},
dateCreated?: number,
- dateModified?: number,
id?: number,
name?: string,
- tracks: List<List<undefined>>,
},
}GET /playlists/{id} 
Get a single playlist by ID
Guard: loggedIn
Response Body
{
data: {
+ content?: {
+ countries?: List<{
+ code?: string,
+ }>,
+ createdBy?: {
+ id?: number,
+ },
+ dateCreated?: number,
+ dateUpdated?: number,
+ description?: string,
+ guid?: string,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
+ },
+ instructors?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ keywords?: List<string>,
+ name?: string,
+ playlist?: {
+ id?: number,
+ name?: string,
+ },
+ schedule?: List<{
+ dateAvailable?: number,
+ type?: 'live' | 'vod' | 'encore',
+ }>,
+ status?: 'draft' | 'published',
+ studios?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ tags?: List<{
+ text?: string,
+ type?: 'category',
+ value?: string,
+ }>,
+ updatedBy?: {
+ id?: number,
+ },
+ videoLength?: {
+ id?: number,
+ name?: string,
+ },
+ },
+ createdBy?: {
id?: number,
},
dateCreated?: number,
+ dateUpdated?: number,
id?: number,
name?: string,
+ tracks?: List<{
+ dateCreated?: number,
+ song?: {
+ album?: {
+ id?: number,
+ name?: string,
+ },
+ artist?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ coverArt?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
+ },
+ duration?: {
+ seconds: number,
+ text: string,
+ },
+ genres?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ id?: number,
+ isExplicit?: bool,
+ isrcCode?: string,
+ label?: {
+ id?: number,
+ name?: string,
+ },
+ labelOwner?: {
+ id?: number,
+ name?: string,
+ },
+ licenseDetails?: {
+ label: record,
+ publisher: record,
+ },
+ licensedIn?: List<string>,
+ name?: string,
+ yearPublished?: number,
+ },
+ trackOrder?: number,
+ }>,
},
}PATCH /playlists/{id} 
Update an existing playlist
Guard: instructor
Response Body
{
+ data: {
+ content?: {
+ countries?: List<{
+ code?: string,
+ }>,
+ createdBy?: {
+ id?: number,
+ },
+ dateCreated?: number,
+ dateUpdated?: number,
+ description?: string,
+ guid?: string,
+ image?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
+ },
+ instructors?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ keywords?: List<string>,
+ name?: string,
+ playlist?: {
+ id?: number,
+ name?: string,
+ },
+ schedule?: List<{
+ dateAvailable?: number,
+ type?: 'live' | 'vod' | 'encore',
+ }>,
+ status?: 'draft' | 'published',
+ studios?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ tags?: List<{
+ text?: string,
+ type?: 'category',
+ value?: string,
+ }>,
+ updatedBy?: {
+ id?: number,
+ },
+ videoLength?: {
+ id?: number,
+ name?: string,
+ },
+ },
+ createdBy?: {
+ id?: number,
+ },
+ dateCreated?: number,
+ dateUpdated?: number,
+ id?: number,
+ name?: string,
+ },
}PUT /playlists/{playlistId}/tracks/{songId} 
Edit the specific song on this playlist
Guard: none
Response Body
{
- data: List<{
- addedBy?: number,
- dateAdded?: number,
- playlistId?: number,
- songId?: number,
- trackOrder: number,
- }>,
}PUT /playlists/{playlistId}/tracks/{songId} 
Guard: instructor
Response Body
{
+ data: {
+ dateCreated?: number,
+ song?: {
+ album?: {
+ id?: number,
+ name?: string,
+ },
+ artist?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ coverArt?: {
+ default: string,
+ large: string,
+ medium: string,
+ small: string,
+ url?: string,
+ },
+ duration?: {
+ seconds: number,
+ text: string,
+ },
+ genres?: List<{
+ id?: number,
+ name?: string,
+ }>,
+ id?: number,
+ isExplicit?: bool,
+ isrcCode?: string,
+ label?: {
+ id?: number,
+ name?: string,
+ },
+ labelOwner?: {
+ id?: number,
+ name?: string,
+ },
+ licenseDetails?: {
+ label: record,
+ publisher: record,
+ },
+ licensedIn?: List<string>,
+ name?: string,
+ yearPublished?: number,
+ },
+ trackOrder?: 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,
},
},
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
- updateFile: {
- data?: string,
- filename?: string,
},
- url?: string,
version?: string,
}>,
}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,
}>,
}POST /firmware 
Create Firmware Update
Request Body
{
- appVersions: {
- android: {
maxVersion?: string,
minVersion?: string,
},
- ios: {
maxVersion?: string,
minVersion?: string,
},
- screen: {
maxVersion?: string,
minVersion?: 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,
},
},
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
- updateFile: {
- data?: string,
- filename?: string,
},
- 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,
},
},
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
- updateFile: {
- data?: string,
- filename?: string,
},
- 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,
},
},
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,
},
},
dateReleased?: number,
dateRequired?: number,
id?: number,
name?: string,
releaseNotes?: string,
status?: 'draft' | 'published' | 'trash',
supportedModels?: List<string>,
type?: 'hardware' | 'tablet' | 'reflect',
- updateFile: {
- data?: string,
- filename?: string,
},
- 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,
},
}51 added endpoints Collapse added endpoints
PATCH /users/{userId}/preferences 
Save / updates the preferences for this user
Guard: selfOrAdmin
Response Body
{
data: {
anotherSetting?: List<string>,
flatResistance?: record,
hillResistance?: record,
leaderboardDisplay?: record,
showStats?: record,
},
}POST /users 
Request Body
{
billingAddress: {
city: string,
country: {
code?: string,
},
postalCode: string,
region: {
code?: string,
},
streetLine1: string,
streetLine2: string,
},
dateBirth: string,
email?: string,
firstName: string,
gender: {
value?: 'm' | 'f' | 'o',
},
height: {
units?: 'in' | 'cm',
value?: number,
},
image: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
lastName: string,
mongoId: string,
nickname: string,
parent: {
id?: number,
mongoId?: string,
},
password?: string,
phoneNumber: string,
purchaseHistory: List<{
datePurchased?: number,
name?: string,
retailer?: {
id?: number,
name?: string,
},
serialNumber?: string,
}>,
roles: List<string>,
weight: {
units?: 'lb' | 'kg',
value?: number,
},
}Response Body
{
data: {
billingAddress?: {
city?: string,
country?: {
code?: string,
id?: number,
name?: string,
},
postalCode?: string,
region?: {
code?: string,
name?: string,
},
streetLine1?: string,
streetLine2?: string,
},
createdBy?: {
id?: number,
},
dateActivated?: number,
dateBirth: string,
dateCreated?: number,
dateUpdated?: number,
email?: string,
firstName?: string,
gender?: {
text: string,
value?: 'm' | 'f' | 'o',
},
height?: {
text?: string,
units?: 'in' | 'cm',
value?: number,
},
id?: number,
image?: {
default: string,
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,
},
updatedBy?: {
id?: number,
},
weight?: {
text?: string,
units?: 'lb' | 'kg',
value?: number,
},
},
}PATCH /plans 
Update plans in bulk.
Guard: admin
Request Body
{
data?: {
billingProviders: List<{
accountId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
priceId?: string,
productId?: string,
}>,
country: {
code?: string,
id?: number,
},
defaultTrial: {
units?: 'day',
value?: number,
},
description: string,
frequency: {
units?: 'month',
value?: number,
},
image: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
musicRights: {
productId?: string,
vendor?: 'audibleMagic',
},
name: string,
price: {
currency?: string,
value?: number,
},
sku: string,
sortOrder: number,
sources: List<{
accountId?: string,
name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
productId?: string,
}>,
tags: List<string>,
},
where?: {
countryCode: string,
ids: List<number>,
},
}Response Body
{
data: {
affected?: 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',
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',
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',
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',
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',
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',
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.
Request Body
{
code: string,
defaultValue: record,
description: string,
group: {
id?: number,
},
inputType: 'string' | 'number' | 'boolean' | 'enum',
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',
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 /studios 
Create new studio
Guard: admin
Request Body
{
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
streetAddress?: {
city?: string,
country?: {
code?: string,
},
postalCode?: string,
region?: {
code?: string,
},
streetLine1?: string,
streetLine2?: string,
},
updatedBy?: {
id?: number,
},
}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
Guard: admin
Request Body
{
code?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
streetAddress?: {
city?: string,
country?: {
code?: string,
},
postalCode?: string,
region?: {
code?: string,
},
streetLine1?: string,
streetLine2?: string,
},
updatedBy?: {
id?: number,
},
}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 /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,
},
}GET /brightback/{userId}/{subId} 
Get URL for user cancel/save workflow.
Response Body
{
data: string,
}GET /content/items 
Get list of content items
Guard: loggedIn
Response Body
{
data: List<{
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
description?: string,
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
instructors?: List<{
id?: number,
name?: string,
}>,
keywords?: List<string>,
name?: string,
playlist?: {
id?: number,
name?: string,
},
schedule?: List<{
dateAvailable?: number,
type?: 'live' | 'vod' | 'encore',
}>,
status?: 'draft' | 'published',
studios?: List<{
id?: number,
name?: string,
}>,
tags?: List<{
text?: string,
type?: 'category',
value?: string,
}>,
updatedBy?: {
id?: number,
},
videoLength?: {
id?: number,
name?: string,
},
}>,
}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,
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
instructors?: List<{
id?: number,
name?: string,
}>,
keywords?: List<string>,
name?: string,
playlist?: {
id?: number,
name?: string,
},
schedule?: List<{
dateAvailable?: number,
type?: 'live' | 'vod' | 'encore',
}>,
status?: 'draft' | 'published',
studios?: List<{
id?: number,
name?: string,
}>,
tags?: List<{
text?: string,
type?: 'category',
value?: string,
}>,
updatedBy?: {
id?: number,
},
videoLength?: {
id?: number,
name?: string,
},
}>,
}GET /content/recommendations 
Get content recommended for this user.
Guard: selfOrAdmin
Response Body
{
data: List<{
countries?: List<{
code?: string,
}>,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
description?: string,
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
instructors?: List<{
id?: number,
name?: string,
}>,
keywords?: List<string>,
name?: string,
playlist?: {
id?: number,
name?: string,
},
schedule?: List<{
dateAvailable?: number,
type?: 'live' | 'vod' | 'encore',
}>,
status?: 'draft' | 'published',
studios?: List<{
id?: number,
name?: string,
}>,
tags?: List<{
text?: string,
type?: 'category',
value?: string,
}>,
updatedBy?: {
id?: number,
},
videoLength?: {
id?: number,
name?: 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: record,
}>,
id?: string,
metadata?: {
desc?: string,
id?: number,
instructor?: string,
playlist_id?: number,
promo?: bool,
title?: string,
},
product_name?: string,
start_date?: number,
},
}GET /redemption-codes 
Get a list of redemption codes
Guard: admin
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,
},
}>,
}PUT /redemption-codes 
Create one or more redemption codes. Used for importing pre-generated codes.
Guard: admin
Request Body
{
campaignCode?: string,
codes?: List<string>,
createdById?: number,
delayBillingDays?: number,
eligibilityRequirements: record,
planIds?: List<number>,
retailerId?: number,
status?: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon: string,
}Response Body
{
data: string,
}PATCH /redemption-codes 
Guard: admin
Request Body
{
data?: {
campaignCode: string,
delayBillingDays: number,
eligibilityRequirements: record,
plans: List<{
id?: number,
}>,
redeemedBy: {
id?: number,
},
referenceNumber: string,
retailer: {
id?: number,
},
serialNumber: string,
status: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon: string,
subscription: {
id?: number,
},
},
where?: {
batchGuid: string,
campaignCode: string,
codes: List<string>,
prefix: string,
retailerId: number,
},
}Response Body
{
data: {
affected?: number,
},
}GET /redemption-codes/{code} 
Get a single Redemption Code
Guard: admin
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
Guard: admin
Request Body
{
campaignCode: string,
delayBillingDays: number,
eligibilityRequirements: record,
plans: List<{
id?: number,
}>,
redeemedBy: {
id?: number,
},
referenceNumber: string,
retailer: {
id?: number,
},
serialNumber: string,
status: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon: string,
subscription: {
id?: number,
},
}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
Guard: loggedIn
Request Body
{
planId?: number,
serialNumber: string,
}Response Body
{
data: {
},
}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,
},
},
}POST /redemption-codes/create 
Create one or more redemption codes
Guard: admin
Request Body
{
campaignCode: string,
codeLength?: number,
count?: number,
delayBillingDays?: number,
eligibilityRequirements: record,
plans?: List<{
id?: number,
}>,
prefix: string,
retailer?: {
id?: number,
},
status?: 'inactive' | 'active' | 'redeemed' | 'deleted',
stripeCoupon: string,
}GET /subscriptions/{id} 
Get a susbcription
Guard: admin
Response Body
{
data: {
activation?: {
isActivated?: bool,
},
billingProvider?: {
accountId?: string,
customerId?: string,
name?: 'stripe' | 'ios' | 'android' | 'amazon',
orderId?: string,
},
cancellation?: {
dateCancelled?: number,
feedback?: string,
reason?: string,
},
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
pause?: {
dateEnd?: number,
dateStart?: number,
reason?: string,
},
plan?: {
id?: number,
},
price?: {
currency?: string,
value?: number,
},
promotion?: {
id?: number,
},
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,
},
},
}GET /subscriptions/{id}/history 
Get a subscription history by subscription ID
Guard: admin
Response Body
{
data: List<{
action?: 'paused' | 'planChanged' | 'created' | 'canceled' | 'discounted',
dateOccurred?: number,
initiatedBy?: {
id?: number,
},
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
Request Body
{
action?: 'paused' | 'planChanged' | 'created' | 'canceled' | 'discounted',
dateOccurred?: number,
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,
},
}Response Body
{
data: {
action?: 'paused' | 'planChanged' | 'created' | 'canceled' | 'discounted',
dateOccurred?: number,
initiatedBy?: {
id?: number,
},
reason: string,
source: 'stripe.com' | 'admin.echelonfit.com' | 'falcon1.echelonfit.com' | 'member.echelonfit.com' | 'stag.member.echelonfit.com',
subscription?: {
id?: number,
},
user?: {
id?: number,
},
},
}GET /retailers 
Get a list of retailers
Response Body
{
data: List<{
brand?: {
id?: number,
name?: string,
},
bundleDays?: number,
country?: {
code?: string,
id?: number,
},
dateCreated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
isActive?: bool,
name?: string,
}>,
}GET /retailers/{id} 
Get an individual retailer
Guard: loggedIn
Response Body
{
data: {
brand?: {
id?: number,
name?: string,
},
bundleDays?: number,
country?: {
code?: string,
id?: number,
},
dateCreated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
isActive?: bool,
name?: string,
},
}GET /users/{userId}/relationships 
Retrieve valid relationships by userId
Response Body
{
data: List<{
type?: 'friends' | 'outgoing-request' | 'incoming-request' | 'blocked',
user?: {
id?: number,
name?: string,
},
}>,
}PUT /users/{userId}/relationships/{targetId} 
Update or create a relationship
Request Body
{
status?: 'accepted' | 'blocked' | 'requested',
}Response Body
{
data: {
type?: 'friends' | 'outgoing-request' | 'incoming-request' | 'blocked',
user?: {
id?: number,
name?: string,
},
},
}GET /equipment/models 
Get a list of all available Equipment
Response Body
{
data: List<{
dateAvailable?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
plans?: List<{
id?: number,
}>,
}>,
}GET /equipment/models/{id} 
Get a specific model of equipment
Response Body
{
data: {
dateAvailable?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
name?: string,
plans?: List<{
id?: number,
}>,
},
}GET /brands 
Get all brands
Response Body
{
data: List<{
alias?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
isActive?: bool,
name?: string,
updatedBy?: {
id?: number,
},
}>,
}POST /brands 
Create a new brand
Guard: admin
Request Body
{
alias?: string,
image: {
data?: string,
filename?: string,
},
isActive?: bool,
name?: string,
}Response Body
{
data: {
alias?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
isActive?: bool,
name?: string,
updatedBy?: {
id?: number,
},
},
}GET /brands/{id} 
Get a specific brand
Response Body
{
data: {
alias?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
isActive?: bool,
name?: string,
updatedBy?: {
id?: number,
},
},
}PATCH /brands/{id} 
Edit a brand (overlay)
Guard: admin
Request Body
{
alias: string,
image: {
data?: string,
filename?: string,
},
isActive: bool,
name: string,
}Response Body
{
data: {
alias?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
isActive?: bool,
name?: string,
updatedBy?: {
id?: number,
},
},
}PUT /brands/{id} 
Edit a brand (replace)
Guard: admin
Request Body
{
alias?: string,
image?: {
data?: string,
filename?: string,
},
isActive?: bool,
name?: string,
}Response Body
{
data: {
alias?: string,
createdBy?: {
id?: number,
},
dateCreated?: number,
dateUpdated?: number,
id?: number,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
isActive?: bool,
name?: string,
updatedBy?: {
id?: number,
},
},
}GET /equipment/categories 
Get all equipment categories.
Response Body
{
data: List<{
contentTag?: string,
dateCreated?: number,
dateUpdated?: number,
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
isActive?: bool,
legacyContentTag?: string,
name?: string,
sortOrder?: number,
updatedBy?: {
id?: number,
},
}>,
}POST /equipment/categories 
Create a new category
Guard: admin
Request Body
{
contentTag?: string,
image: {
data?: string,
filename?: string,
},
isActive?: bool,
legacyContentTag?: string,
name?: string,
sortOrder: number,
updatedBy?: {
id?: number,
},
}Response Body
{
data: {
contentTag?: string,
dateCreated?: number,
dateUpdated?: number,
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
isActive?: bool,
legacyContentTag?: string,
name?: string,
sortOrder?: number,
updatedBy?: {
id?: number,
},
},
}GET /equipment/categories/{id} 
Get a equipment category by its ID.
Guard: loggedIn
Response Body
{
data: {
contentTag?: string,
dateCreated?: number,
dateUpdated?: number,
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
isActive?: bool,
legacyContentTag?: string,
name?: string,
sortOrder?: number,
updatedBy?: {
id?: number,
},
},
}PATCH /equipment/categories/{id} 
Update an existing equipment category.
Guard: admin
Request Body
{
contentTag: string,
image: {
data?: string,
filename?: string,
},
isActive: bool,
legacyContentTag: string,
name: string,
sortOrder: number,
updatedBy: {
id?: number,
},
}Response Body
{
data: {
contentTag?: string,
dateCreated?: number,
dateUpdated?: number,
guid?: string,
image?: {
default: string,
large: string,
medium: string,
small: string,
url?: string,
},
isActive?: bool,
legacyContentTag?: string,
name?: string,
sortOrder?: number,
updatedBy?: {
id?: number,
},
},
}