Nest Changelog

1.3.0

8/4/2022

1.4.0

8/11/2022

75 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 /plans/{id}/features

Get all Plan’s Features

Response Body
{
  data: {

}, }

GET /plans/{id}/features

Get all Plan’s Features

Response Body
{
  data: {

+ anotherSetting?: List<string>, + flatResistance?: record, + hillResistance?: record, + leaderboardDisplay?: record, + showStats?: record, }, }

PATCH /plans/{id}/features

Updates the Plan’s features by plan id

Response Body
{
  data: {

}, }

PATCH /plans/{id}/features

Updates the Plan’s features by plan id

Response Body
{
  data: {

+ anotherSetting?: List<string>, + flatResistance?: record, + hillResistance?: record, + leaderboardDisplay?: record, + showStats?: record, }, }

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

PUT /redemption-codes

Create one or more redemption codes. Used for importing pre-generated codes.

Response Body
{
- data: string,

}

PUT /redemption-codes

Create one or more redemption codes. Used for importing pre-generated codes.

Response Body
{

+ data: { + batchGuid?: string, + }, }

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: {

}, }

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

DELETE /instructors/{id}

Delete an instructor

Guard: admin

DELETE /instructors/{id}

Delete an instructor

Guard: producer

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

POST /songs/{id}/sample

Get a sample of a song

Response Body
{
  data: {
-   countryCode: string,
-   duration?: number,
-   start: number,

}, }

POST /songs/{id}/sample

Get a sample of a song

Response Body
{
  data: {

+ url?: string, }, }

POST /songs/{id}/playback

Get a link to a song's playback

Response Body
{
  data: {
-   countryCode: string,
-   duration?: number,
-   start: number,

}, }

POST /songs/{id}/playback

Get a link to a song's playback

Response Body
{
  data: {

+ url?: string, }, }

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, }, }, }
WORK IN PROGRESS