Nest Changelog

1.4.5

9/14/2022

1.5.0

9/22/2022

59 changed endpoints

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

+ orderCode?: string, publicNote: string, reason: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, },

+ sourceCode?: string, + sourceName?: 'stripe' | 'apple' | 'google' | 'amazon', + sourceUserCode?: 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/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,

+ orderCode?: string, publicNote: string, reason: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, },

+ sourceCode?: string, + sourceName?: 'stripe' | 'apple' | 'google' | 'amazon', + sourceUserCode?: 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, }

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,

+ orderCode?: string, publicNote: string, reason: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, },

+ sourceCode?: string, + sourceName?: 'stripe' | 'apple' | 'google' | 'amazon', + sourceUserCode?: string, status?: string, }

POST /webhooks/subscription-created

Request Body
{
  billingCycleAnchor?: number,
  createdAt?: number,
  dateCancelled?: number,
  dateExpire?: number,
  datePausedUntil?: number,
  dateStart?: number,
  dateTrialEnd?: number,
  dateTrialStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
- orderId?: 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, }, }, publicNote: string, reason: { - code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',

message?: string, }, renewedAt?: number, - shopifyCustomerId: string, - sourceId?: string, - sourceName?: 'stripe' | 'ios' | 'android' | 'amazon', - sourceUserId?: string,

status?: string, }

POST /webhooks/subscription-created

Request Body
{
  billingCycleAnchor?: number,
  createdAt?: number,
  dateCancelled?: number,
  dateExpire?: number,
  datePausedUntil?: number,
  dateStart?: number,
  dateTrialEnd?: number,
  dateTrialStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,

+ orderCode?: string, plan?: { basePrice: { currency?: { code?: string, scale?: number, symbol?: string, }, value?: number, }, benefits: List<{ text?: string, }>,

+ billingProvider: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, 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,

+ source: { accountId?: string, name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', productId?: string,

+ }, tags: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, updatedBy: { id?: number, }, }, publicNote: string, reason: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, renewedAt?: number,

+ shopifyCustomerCode: string, + sourceCode?: string, + sourceType?: 'stripe' | 'apple' | 'google' | 'amazon', + sourceUserCode?: string, status?: string, }

POST /webhooks/subscription-deleted

Request Body
{
  billingCycleAnchor?: number,
  createdAt?: number,
  dateCancelled?: number,
  dateExpire?: number,
  datePausedUntil?: number,
  dateStart?: number,
  dateTrialEnd?: number,
  dateTrialStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
- orderId?: 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, }, }, publicNote: string, reason: { - code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',

message?: string, }, renewedAt?: number, - shopifyCustomerId: string, - sourceId?: string, - sourceName?: 'stripe' | 'ios' | 'android' | 'amazon', - sourceUserId?: string,

status?: string, }

POST /webhooks/subscription-deleted

Request Body
{
  billingCycleAnchor?: number,
  createdAt?: number,
  dateCancelled?: number,
  dateExpire?: number,
  datePausedUntil?: number,
  dateStart?: number,
  dateTrialEnd?: number,
  dateTrialStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,

+ orderCode?: string, plan?: { basePrice: { currency?: { code?: string, scale?: number, symbol?: string, }, value?: number, }, benefits: List<{ text?: string, }>,

+ billingProvider: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, 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,

+ source: { accountId?: string, name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', productId?: string,

+ }, tags: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, updatedBy: { id?: number, }, }, publicNote: string, reason: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, renewedAt?: number,

+ shopifyCustomerCode: string, + sourceCode?: string, + sourceType?: 'stripe' | 'apple' | 'google' | 'amazon', + sourceUserCode?: string, status?: string, }

POST /webhooks/subscription-updated

Request Body
{
  billingCycleAnchor?: number,
  createdAt?: number,
  dateCancelled?: number,
  dateExpire?: number,
  datePausedUntil?: number,
  dateStart?: number,
  dateTrialEnd?: number,
  dateTrialStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
- orderId?: 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, }, }, publicNote: string, reason: { - code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',

message?: string, }, renewedAt?: number, - shopifyCustomerId: string, - sourceId?: string, - sourceName?: 'stripe' | 'ios' | 'android' | 'amazon', - sourceUserId?: string,

status?: string, }

POST /webhooks/subscription-updated

Request Body
{
  billingCycleAnchor?: number,
  createdAt?: number,
  dateCancelled?: number,
  dateExpire?: number,
  datePausedUntil?: number,
  dateStart?: number,
  dateTrialEnd?: number,
  dateTrialStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,

+ orderCode?: string, plan?: { basePrice: { currency?: { code?: string, scale?: number, symbol?: string, }, value?: number, }, benefits: List<{ text?: string, }>,

+ billingProvider: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, 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,

+ source: { accountId?: string, name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', productId?: string,

+ }, tags: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, updatedBy: { id?: number, }, }, publicNote: string, reason: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, renewedAt?: number,

+ shopifyCustomerCode: string, + sourceCode?: string, + sourceType?: 'stripe' | 'apple' | 'google' | 'amazon', + sourceUserCode?: string, status?: string, }

POST /users

Request Body
{
  billingAddress: {
    city: string,
    country: {
      code?: string,
    },
    postalCode: string,
    region: {
      code?: string,
    },
    streetLine1: string,
    streetLine2: string,
  },
  birthdate: string,
  captcha: {
    token?: string,
  },

dealer: { id?: number, }, email?: string, firstName: string, forcePasswordChange: bool, gender: { value?: 'm' | 'f' | 'o', }, height: { units?: 'in' | 'cm', value?: 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, }, password?: string, phoneNumber: string, purchaseHistory: List<{ datePurchased?: number, name?: string, retailer?: { id?: number, }, serialNumber?: string, }>, roles: List<string>, tagline: string, weight: { units?: 'lb' | 'kg', value?: number, }, }

POST /users

Request Body
{
  billingAddress: {
    city: string,
    country: {
      code?: string,
    },
    postalCode: string,
    region: {
      code?: string,
    },
    streetLine1: string,
    streetLine2: string,
  },
  birthdate: string,
  captcha: {
    token?: string,
  },
+ commercial: {
+   code?: string,
+ },
  dealer: {
    id?: number,
  },
  email?: string,
  firstName: string,
  forcePasswordChange: bool,
  gender: {
    value?: 'm' | 'f' | 'o',
  },
  height: {
    units?: 'in' | 'cm',
    value?: 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,
  },
  password?: string,
  phoneNumber: string,
  purchaseHistory: List<{
    datePurchased?: number,
    name?: string,
    retailer?: {
      id?: number,
    },
    serialNumber?: string,
  }>,
  roles: List<string>,
  tagline: string,
  weight: {
    units?: 'lb' | 'kg',
    value?: number,
  },
}

POST /users/{userId}/family

Request Body
{
  billingAddress: {
    city: string,
    country: {
      code?: string,
    },
    postalCode: string,
    region: {
      code?: string,
    },
    streetLine1: string,
    streetLine2: string,
  },
  birthdate: string,
  captcha: {
    token?: string,
  },

dealer: { id?: number, }, email?: string, firstName: string, forcePasswordChange: bool, gender: { value?: 'm' | 'f' | 'o', }, height: { units?: 'in' | 'cm', value?: 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, }, password?: string, phoneNumber: string, purchaseHistory: List<{ datePurchased?: number, name?: string, retailer?: { id?: number, }, serialNumber?: string, }>, roles: List<string>, tagline: string, weight: { units?: 'lb' | 'kg', value?: number, }, }

POST /users/{userId}/family

Request Body
{
  billingAddress: {
    city: string,
    country: {
      code?: string,
    },
    postalCode: string,
    region: {
      code?: string,
    },
    streetLine1: string,
    streetLine2: string,
  },
  birthdate: string,
  captcha: {
    token?: string,
  },
+ commercial: {
+   code?: string,
+ },
  dealer: {
    id?: number,
  },
  email?: string,
  firstName: string,
  forcePasswordChange: bool,
  gender: {
    value?: 'm' | 'f' | 'o',
  },
  height: {
    units?: 'in' | 'cm',
    value?: 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,
  },
  password?: string,
  phoneNumber: string,
  purchaseHistory: List<{
    datePurchased?: number,
    name?: string,
    retailer?: {
      id?: number,
    },
    serialNumber?: string,
  }>,
  roles: List<string>,
  tagline: string,
  weight: {
    units?: 'lb' | 'kg',
    value?: number,
  },
}

GET /plans

Get all Plans

Response Body
{
  data: List<{
    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, }, }>, pagination: { page?: number, skip?: number, take?: number, total: { pages?: number, rows?: number, }, }, }

GET /plans

Get all Plans

Response Body
{
  data: List<{
    basePrice?: {
      currency?: {
        code?: string,
        scale?: number,
        symbol?: string,
      },
      value?: number,
    },
    benefits?: List<{
      text?: string,
    }>,

+ billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, 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,

+ source?: { accountId?: string, name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', productId?: string,

+ }, tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, updatedBy?: { id?: number, }, }>, pagination: { page?: number, skip?: number, take?: number, total: { pages?: number, rows?: number, }, }, }

POST /plans

Create Plan

Request Body
{
  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, }, 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, image?: { data?: string, filename?: 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'>, }
Response Body
{
  data: {
    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 /plans

Create Plan

Request Body
{
  basePrice?: {
    currency?: {
      code?: string,
      scale?: number,
      symbol?: string,
    },
    value?: number,
  },
  benefits?: List<{
    text?: string,
  }>,

+ billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, country?: { code?: string, id?: 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, image?: { data?: string, filename?: string, }, musicRights?: { productId?: string, vendor?: 'audibleMagic', }, name?: string, sku?: string, sortOrder?: number,

+ source?: { accountId?: string, name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', productId?: string,

+ }, tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, }
Response Body
{
  data: {
    basePrice?: {
      currency?: {
        code?: string,
        scale?: number,
        symbol?: string,
      },
      value?: number,
    },
    benefits?: List<{
      text?: string,
    }>,

+ billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, 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,

+ source?: { accountId?: string, name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', productId?: string,

+ }, tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, updatedBy?: { id?: number, }, }, }

PATCH /plans

Update plans in bulk.

Request Body
{
  data?: {
    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, }, 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, image: { data?: string, filename?: 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'>, }, image: { default: string, large: string, medium: string, small: string, url?: string, }, where?: { countryCode: string, ids: List<number>, }, }

PATCH /plans

Update plans in bulk.

Request Body
{
  data?: {
    basePrice: {
      currency?: {
        code?: string,
        scale?: number,
        symbol?: string,
      },
      value?: number,
    },
    benefits: List<{
      text?: string,
    }>,

+ billingProvider: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, country: { code?: string, id?: 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, image: { data?: string, filename?: string, }, musicRights: { productId?: string, vendor?: 'audibleMagic', }, name: string, sku: string, sortOrder: number,

+ source: { accountId?: string, name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', productId?: string,

+ }, tags: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, }, image: { default: string, large: string, medium: string, small: string, url?: string, }, where?: { countryCode: string, ids: List<number>, }, }

GET /plans/{id}

Get Plan by id

Response Body
{
  data: {
    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, }, }, }

GET /plans/{id}

Get Plan by id

Response Body
{
  data: {
    basePrice?: {
      currency?: {
        code?: string,
        scale?: number,
        symbol?: string,
      },
      value?: number,
    },
    benefits?: List<{
      text?: string,
    }>,

+ billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, 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,

+ source?: { accountId?: string, name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', productId?: string,

+ }, tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, updatedBy?: { id?: number, }, }, }

PATCH /plans/{id}

Update Plan

Request Body
{
  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, }, 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, image: { data?: string, filename?: 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'>, }
Response Body
{
  data: {
    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, }, }, }

PATCH /plans/{id}

Update Plan

Request Body
{
  basePrice: {
    currency?: {
      code?: string,
      scale?: number,
      symbol?: string,
    },
    value?: number,
  },
  benefits: List<{
    text?: string,
  }>,

+ billingProvider: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, country: { code?: string, id?: 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, image: { data?: string, filename?: string, }, musicRights: { productId?: string, vendor?: 'audibleMagic', }, name: string, sku: string, sortOrder: number,

+ source: { accountId?: string, name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', productId?: string,

+ }, tags: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, }
Response Body
{
  data: {
    basePrice?: {
      currency?: {
        code?: string,
        scale?: number,
        symbol?: string,
      },
      value?: number,
    },
    benefits?: List<{
      text?: string,
    }>,

+ billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, 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,

+ source?: { accountId?: string, name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', productId?: string,

+ }, tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, updatedBy?: { id?: number, }, }, }

GET /subscriptions/{id}

Get a subscription

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 /subscriptions/{id}

Get a subscription

Response Body
{
  data: {
    activation?: {
      isActivated?: bool,
+     isFirstPeriodPrepaid?: bool,
    },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }, }

POST /subscriptions/{id}/quote

create a new subscription in stripe from shopify order, optionally applies a redemption code

Request Body
{
  isFirstPeriodPrepaid: bool,
  redemptionCode: string,
  utm: {
-   campaign?: string,
-   content?: string,
-   medium?: string,
-   source?: string,

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

Request Body
{
  isFirstPeriodPrepaid: bool,
  redemptionCode: string,
  utm: {

+ campaign: string, + content: string, + medium: string, + source: string, + term: string, }, }
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,
      }>,

+ billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, 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,

+ source?: { 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 /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,

}, }, }

POST /redemption-codes/{code}/redemption

Redeem a single code

Response Body
{
  data: {
    activation?: {
      isActivated?: bool,
+     isFirstPeriodPrepaid?: bool,
    },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }, }

GET /users/{userId}/account

Return the current state of the user’s account with payment status

Guard: selfOrAdmin

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

Return the user's account with the payment status and last/current paid subscription

Guard: none

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,
+       isFirstPeriodPrepaid?: bool,
      },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }, }, }

GET /users/{userId}/account/history

Get the changes that have happened to this account

Guard: selfOrAdmin

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

Guard: none

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' | 'planChange', 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/quote

Guard: selfOrAdmin

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/quote

Guard: none

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

+ billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, 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,

+ source?: { 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

Guard: selfOrAdmin

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/change

Guard: none

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,
+       isFirstPeriodPrepaid?: bool,
      },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }, }, }

POST /users/{userId}/account/cancel

Guard: selfOrAdmin

Request Body
{
  internalNote: string,
  publicNote: string,
  reason?: {
-   code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',

message?: 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,

}, }, }, }

POST /users/{userId}/account/cancel

Guard: none

Request Body
{
  internalNote: string,
  publicNote: string,
  reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: 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,
+       isFirstPeriodPrepaid?: bool,
      },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }, }, }

POST /users/{userId}/account/uncancel

Guard: selfOrAdmin

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

Guard: none

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,
+       isFirstPeriodPrepaid?: bool,
      },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }, }, }

POST /users/{userId}/account/pause

Guard: selfOrAdmin

Request Body
{
  durationDays?: number,
  internalNote: string,
  publicNote: string,
  reason: {
-   code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',

message?: 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,

}, }, }, }

POST /users/{userId}/account/pause

Guard: none

Request Body
{
  durationDays?: number,
  internalNote: string,
  publicNote: string,
  reason: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: 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,
+       isFirstPeriodPrepaid?: bool,
      },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }, }, }

POST /users/{userId}/account/unpause

Guard: selfOrAdmin

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

Guard: none

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,
+       isFirstPeriodPrepaid?: bool,
      },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }, }, }

POST /users/{userId}/account/terminate

Request Body
{
  internalNote: string,
  publicNote: string,
  reason?: {
-   code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',

message?: 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,

}, }, }, }

POST /users/{userId}/account/terminate

Request Body
{
  internalNote: string,
  publicNote: string,
  reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: 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,
+       isFirstPeriodPrepaid?: bool,
      },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }, }, }

POST /users/{userId}/account/credit

Request Body
{
  durationDays?: number,
  initiatedBy?: {
    id?: number,
  },
  internalNote?: string,
  publicNote?: string,
  reason?: {
-   code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',

message?: 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,

}, }, }, }

POST /users/{userId}/account/credit

Request Body
{
  durationDays?: number,
  initiatedBy?: {
    id?: number,
  },
  internalNote?: string,
  publicNote?: string,
  reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: 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,
+       isFirstPeriodPrepaid?: bool,
      },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }, }, }

POST /users/{userId}/account/activate

create a new subscription in stripe from shopify order, optionally applies a redemption code

Guard: loggedIn

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,

}, }, }, }

POST /users/{userId}/account/activate

create a new subscription in stripe from shopify order, optionally applies a redemption code

Guard: none

Request Body
{

+ applyBillingDelay: bool, + billingAddress: { city?: string, country?: { code?: string, }, postalCode?: string, region?: { code?: string, }, streetLine1?: string, streetLine2?: string, }, cardTokenId?: string,

+ firstName: string, + isFirstPeriodPrepaid: bool, + lastName: string, + phoneNumber: string, redemptionCode: string, utm: {

+ campaign: string, + content: string, + medium: string, + source: string, + term: 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,
+       isFirstPeriodPrepaid?: bool,
      },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }, }, }

GET /studios

Get a list of all studios

Response Body
{
  data: List<{
    code?: string,
-   createdBy?: {
-     id?: number,
-   },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    image?: {
      default: string,
      large: string,
      medium: string,
      small: string,
      url?: string,
    },
    name?: string,
    streetAddress?: {
      city?: string,
      country?: {
        code?: string,
        id?: number,
        name?: string,
      },
      postalCode?: string,
      region?: {
        code?: string,
        name?: string,
      },
      streetLine1?: string,
      streetLine2?: string,
    },
    updatedBy?: {
      id?: number,
    },
  }>,
  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,

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

Request Body
{
  code?: string,
- createdBy?: {
-   id?: number,

}, - dateCreated?: number, - dateUpdated?: number, - image?: { - default: string, - large: string, - medium: string, - small: string, - url?: string, - }, name?: string, streetAddress?: { city?: string, country?: { code?: string, }, postalCode?: string, region?: { code?: string, }, streetLine1?: string, streetLine2?: string, }, - updatedBy?: { - id?: number, - }, }
Response Body
{
  data: {
    code?: string,
-   createdBy?: {
-     id?: number,
-   },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    image?: {
      default: string,
      large: string,
      medium: string,
      small: string,
      url?: string,
    },
    name?: string,
    streetAddress?: {
      city?: string,
      country?: {
        code?: string,
        id?: number,
        name?: string,
      },
      postalCode?: string,
      region?: {
        code?: string,
        name?: string,
      },
      streetLine1?: string,
      streetLine2?: string,
    },
    updatedBy?: {
      id?: number,
    },
  },
}

POST /studios

Create new studio

Request Body
{
  code?: string,

+ image: { + data?: string, + filename?: string, },

name?: string, streetAddress?: { city?: string, country?: { code?: string, }, postalCode?: string, region?: { code?: string, }, streetLine1?: string, streetLine2?: string, },

}
Response Body
{
  data: {
    code?: string,

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

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

Request Body
{
- code?: string,
- createdBy?: {
-   id?: number,

}, - dateCreated?: number, - dateUpdated?: number, - image?: { - default: string, - large: string, - medium: string, - small: string, - url?: string, - }, - name?: string, - streetAddress?: { - city?: string, - country?: {

code?: string, }, - postalCode?: string, - region?: {

code?: string, }, - streetLine1?: string, - streetLine2?: string,

}, - updatedBy?: { - id?: number, - }, }
Response Body
{
  data: {
    code?: string,
-   createdBy?: {
-     id?: number,
-   },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    image?: {
      default: string,
      large: string,
      medium: string,
      small: string,
      url?: string,
    },
    name?: string,
    streetAddress?: {
      city?: string,
      country?: {
        code?: string,
        id?: number,
        name?: string,
      },
      postalCode?: string,
      region?: {
        code?: string,
        name?: string,
      },
      streetLine1?: string,
      streetLine2?: string,
    },
    updatedBy?: {
      id?: number,
    },
  },
}

PATCH /studios/{id}

Edit studio

Request Body
{

+ code: string, + image: { + data?: string, + filename?: string, },

+ name: string, + streetAddress: { + city: string, + country: { code?: string, },

+ postalCode: string, + region: { code?: string, },

+ streetLine1: string, + streetLine2: string, },

}
Response Body
{
  data: {
    code?: string,

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

+ count?: number, + image?: { + default: string, + large: string, + medium: string, + small: string, + url?: string, + }, + key?: string, + text?: string, }>, 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}/playlists

Get all playlists that contain this song

Response Body
{
  data: List<{
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
      name?: string,
    },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    isFlagged?: bool,
    legacyContentExplicit?: bool,
    name?: string,
    schedule?: List<{
      available?: {
        end?: number,
        live?: number,
        start?: number,
      },
      content?: {
        guid?: string,
      },
      guid?: string,
      legacy: {
        hlsUrl?: string,
        id?: number,
        liveStreamId?: number,
        type?: 'reflect' | 'connect',
      },
      type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
    }>,
    studios?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    tags?: List<{
      image?: {
        default: string,
        large: string,
        medium: string,
        small: string,
        url?: string,
      },
      text?: string,
      translations: record,
-     type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',

value?: string, }>, videoLength?: { id?: number, name?: string, }, }>, pagination: { page?: number, skip?: number, take?: number, total: { pages?: number, rows?: number, }, }, }

GET /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' | 'format', 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, }, }, }

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

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' | 'format', 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,
      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/{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' | 'format', 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,
    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, }, }, }

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

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' | 'format', 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 /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/library

Search for content in the Library

Response Body
{

+ data: List<{ + contentGuid?: string, + countries?: List<{ + code?: string, }>,

+ dateLive?: number, + description?: string, + image?: { + default: string, + large: string, + medium: string, + small: string, + url?: string, + }, + instructors?: List<{ + id?: number, + image?: { + default: string, + large: string, + medium: string, + small: string, + url?: string, }, + name?: string, + }>, + length?: number, + name?: string, + playback?: { + type?: 'hls' | 'dash', + url?: string, },

+ playlistId?: number, + scheduleGuid?: string, + status?: 'draft' | 'published' | 'trash', + studios?: List<{ + id?: number, + name?: string, + }>, + tags?: List<{ + text?: string, + type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'format', + value?: string, + }>, + type?: 'live' | 'vod' | 'encore' | 'rebroadcast', + }>, + embedded: { + aggregations?: { + durations?: List<{ }>,

+ instructors?: List<{ + id?: number, + image?: { + default: string, + large: string, + medium: string, + small: string, + url?: string, + }, + name?: string, + }>, tags?: List<{

+ buckets?: List<{ + count?: number, + image?: { + default: string, + large: string, + medium: string, + small: string, + url?: string, + }, + text?: string, + value?: string, + }>, value?: string, }>,

+ }, }, + pagination: { + page?: number, + skip?: number, + take?: number, + total: { + pages?: number, + rows?: number, + }, + }, }

GET /content/items

Get list of content items

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

Get list of content items

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,
    }>,
+   isWorldWide?: bool,
+   keywords?: string,
    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' | 'format', 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, }, }, }

POST /content/items

Create a 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', }, }

POST /content/items

Create a 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,
    }>,
+   isWorldWide?: bool,
+   keywords?: string,
    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' | 'format', value?: string, }>, updatedBy?: { id?: number, }, videoLength?: { id?: number, name?: string, }, videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted', }, }

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/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,
    }>,
+   isWorldWide?: bool,
+   keywords?: string,
    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' | 'format', value?: string, }>, updatedBy?: { id?: number, }, videoLength?: { id?: number, name?: string, }, videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted', }, }

PATCH /content/items/{guid}

Update a 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', }, }

PATCH /content/items/{guid}

Update a 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,
    }>,
+   isWorldWide?: bool,
+   keywords?: string,
    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' | 'format', 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<{
    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/recommendations

Get content recommended for this user.

Response Body
{
  data: List<{
    available?: {
      end?: number,
      live?: number,
      start?: number,
    },
+   contentGuid?: string,
+   countries?: List<{
+     code?: string,
+   }>,
+   dateLive?: number,
    description?: string,

image?: { default: string, large: string, medium: string, small: string, url?: string, },

+ instructors?: List<{ + id?: number, + image?: { + default: string, + large: string, + medium: string, + small: string, + url?: string, + }, + name?: string, + }>, + length?: number, name?: string, + playback?: { + type?: 'hls' | 'dash', + url?: string, + }, + playlistId?: number, + scheduleGuid?: string, score?: number,

+ status?: 'draft' | 'published' | 'trash', + studios?: List<{ + id?: number, + name?: string, + }>, + tags?: List<{ + text?: string, + type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'format', + value?: string, + }>, type?: 'live' | 'vod' | 'encore' | 'rebroadcast', }>, pagination: { page?: number, skip?: number, take?: number, total: { pages?: number, rows?: number, }, }, }

GET /content/tags

Get available content tags.

Response Body
{
  data: 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, }>, pagination: { page?: number, skip?: number, take?: number, total: { pages?: number, rows?: number, }, }, }

GET /content/tags

list ALL possible content tags. No filter / pagination / sort.

Response Body
{
  data: 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' | 'format', value?: string, }>, pagination: { page?: number, skip?: number, take?: number, total: { pages?: number, rows?: number, }, }, }

GET /content/tags/{value}

Get one content tag by value.

Response Body
{
  data: {
    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, }, }

GET /content/tags/{value}

Get one content tag by value.

Response Body
{
  data: {
    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' | 'format', value?: string, }, }

PUT /content/tags/{value}

Create a New Tag

Request Body
{
  image: {
    url?: string,
  },
  translations: record,
- type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',

}
Response Body
{
  data: {
    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, }, }

PUT /content/tags/{value}

Create a New Tag

Request Body
{
  image: {
    url?: string,
  },
  translations: record,

+ type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'format', }
Response Body
{
  data: {
    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' | 'format', value?: string, }, }

PATCH /content/tags/{value}

Edit a tag

Request Body
{
  image: {
    url?: string,
  },
  translations: record,
- type: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',

}
Response Body
{
  data: {
    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, }, }

PATCH /content/tags/{value}

Edit a tag

Request Body
{
  image: {
    url?: string,
  },
  translations: record,

+ type: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'format', }
Response Body
{
  data: {
    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' | 'format', value?: string, }, }

GET /equipment/models

Get a list of all available Equipment

Response Body
{
  data: List<{
    brand?: {
      name?: string,
    },
    category: {
      guid?: string,
      name?: string,
    },
    dateAvailable?: number,
    dateCreated?: number,
    dateUpdated?: number,

id?: number, image?: { default: string, large: string, medium: string, small: string, url?: string, }, name?: string, pdf?: { url?: string, }, plans?: List<{ id?: number, }>, video?: { url?: string, }, }>, pagination: { page?: number, skip?: number, take?: number, total: { pages?: number, rows?: number, }, }, }

GET /equipment/models

Get a list of all available Equipment

Response Body
{
  data: List<{
    brand?: {
      name?: string,
    },
    category: {
      guid?: string,
      name?: string,
    },
    dateAvailable?: number,
    dateCreated?: number,
    dateUpdated?: number,
+   equipmentTag?: string,
    id?: number,
    image?: {
      default: string,
      large: string,
      medium: string,
      small: string,
      url?: string,
    },
    name?: string,
    pdf?: {
      url?: string,
    },
    plans?: List<{
      id?: number,
    }>,
    video?: {
      url?: string,
    },
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

POST /equipment/models

Create a new equipment model

Request Body
{
  brand?: {
    name?: string,
  },
  dateAvailable?: number,
- image?: {

data?: string, filename?: string, }, name?: string, pdf: { data?: string, filename?: string, }, plans?: List<{ id?: number, }>, video?: { url?: string, }, }
Response Body
{
  data: {
    brand?: {
      name?: string,
    },
    category: {
      guid?: string,
      name?: string,
    },
    dateAvailable?: number,
    dateCreated?: number,
    dateUpdated?: number,

id?: number, image?: { default: string, large: string, medium: string, small: string, url?: string, }, name?: string, pdf?: { url?: string, }, plans?: List<{ id?: number, }>, video?: { url?: string, }, }, }

POST /equipment/models

Create a new equipment model

Request Body
{
  brand?: {
    name?: string,
  },
  dateAvailable?: number,

+ equipmentTag?: string, + image: { data?: string, filename?: string, }, name?: string, pdf: { data?: string, filename?: string, }, plans?: List<{ id?: number, }>, video?: { url?: string, }, }
Response Body
{
  data: {
    brand?: {
      name?: string,
    },
    category: {
      guid?: string,
      name?: string,
    },
    dateAvailable?: number,
    dateCreated?: number,
    dateUpdated?: number,
+   equipmentTag?: string,
    id?: number,
    image?: {
      default: string,
      large: string,
      medium: string,
      small: string,
      url?: string,
    },
    name?: string,
    pdf?: {
      url?: string,
    },
    plans?: List<{
      id?: number,
    }>,
    video?: {
      url?: string,
    },
  },
}

GET /equipment/models/{id}

Get a specific model of equipment

Response Body
{
  data: {
    brand?: {
      name?: string,
    },
    category: {
      guid?: string,
      name?: string,
    },
    dateAvailable?: number,
    dateCreated?: number,
    dateUpdated?: number,

id?: number, image?: { default: string, large: string, medium: string, small: string, url?: string, }, name?: string, pdf?: { url?: string, }, plans?: List<{ id?: number, }>, video?: { url?: string, }, }, }

GET /equipment/models/{id}

Get a specific model of equipment

Response Body
{
  data: {
    brand?: {
      name?: string,
    },
    category: {
      guid?: string,
      name?: string,
    },
    dateAvailable?: number,
    dateCreated?: number,
    dateUpdated?: number,
+   equipmentTag?: string,
    id?: number,
    image?: {
      default: string,
      large: string,
      medium: string,
      small: string,
      url?: string,
    },
    name?: string,
    pdf?: {
      url?: string,
    },
    plans?: List<{
      id?: number,
    }>,
    video?: {
      url?: string,
    },
  },
}

PATCH /equipment/models/{id}

Update an existing equipment model.

Request Body
{
  brand: {
    name?: string,
  },
  dateAvailable: number,

image: { data?: string, filename?: string, }, name: string, pdf: { data?: string, filename?: string, }, plans: List<{ id?: number, }>, video: { url?: string, }, }
Response Body
{
  data: {
    brand?: {
      name?: string,
    },
    category: {
      guid?: string,
      name?: string,
    },
    dateAvailable?: number,
    dateCreated?: number,
    dateUpdated?: number,

id?: number, image?: { default: string, large: string, medium: string, small: string, url?: string, }, name?: string, pdf?: { url?: string, }, plans?: List<{ id?: number, }>, video?: { url?: string, }, }, }

PATCH /equipment/models/{id}

Update an existing equipment model.

Request Body
{
  brand: {
    name?: string,
  },
  dateAvailable: number,
+ equipmentTag: string,
  image: {
    data?: string,
    filename?: string,
  },
  name: string,
  pdf: {
    data?: string,
    filename?: string,
  },
  plans: List<{
    id?: number,
  }>,
  video: {
    url?: string,
  },
}
Response Body
{
  data: {
    brand?: {
      name?: string,
    },
    category: {
      guid?: string,
      name?: string,
    },
    dateAvailable?: number,
    dateCreated?: number,
    dateUpdated?: number,
+   equipmentTag?: string,
    id?: number,
    image?: {
      default: string,
      large: string,
      medium: string,
      small: string,
      url?: string,
    },
    name?: string,
    pdf?: {
      url?: string,
    },
    plans?: List<{
      id?: number,
    }>,
    video?: {
      url?: string,
    },
  },
}

GET /users/{userId}/subscriptions

Get a list of a user's subscriptions.

Response Body
{
  data: List<{
    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,

}, }>, pagination: { page?: number, skip?: number, take?: number, total: { pages?: number, rows?: number, }, }, }

GET /users/{userId}/subscriptions

Get a list of a user's subscriptions.

Response Body
{
  data: List<{
    activation?: {
      isActivated?: bool,
+     isFirstPeriodPrepaid?: bool,
    },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }>, pagination: { page?: number, skip?: number, take?: number, total: { pages?: number, rows?: number, }, }, }

GET /users/{userId}/subscriptions/{id}

Get a specific subscription.

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 /users/{userId}/subscriptions/{id}

Get a specific subscription.

Response Body
{
  data: {
    activation?: {
      isActivated?: bool,
+     isFirstPeriodPrepaid?: bool,
    },

+ billing?: { + customerCode?: string, + orderCode?: string, }, cancellation?: { dateCancelled?: number, reason?: {

+ code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange', message?: string, }, }, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, id?: number, + offer?: { + guid?: string, + }, pause?: { dateEnd?: number, dateStart?: number, reason?: string, }, plan?: { + basePrice?: { + currency?: { + code?: string, + scale?: number, + symbol?: string, + }, + value?: number, + }, + benefits?: List<{ + text?: string, + }>, + billingProvider?: { + credentialsKey?: string, + id?: number, + name?: string, + organizationCode?: string, + priceCode?: string, + productCode?: string, + type?: 'stripe' | 'apple' | 'google' | 'amazon', + }, + 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, + source?: { + accountId?: string, + name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free', + productId?: string, + }, + tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>, + updatedBy?: { + 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, + term: string, }, }, }

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

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

POST /collections

Create a new Collection

Response Body
{
  data: {
    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', }, }

POST /collections

Create a new Collection

Response Body
{
  data: {
    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' | 'format', value?: string, }>, totalCount?: number, type?: 'generic' | 'series' | 'challenge' | 'program', updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'trash', }, }

GET /collections/{guid}

Get a collection by guid

Response Body
{
  data: {
    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', }, }

GET /collections/{guid}

Get a collection by guid

Response Body
{
  data: {
    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' | 'format', value?: string, }>, totalCount?: number, type?: 'generic' | 'series' | 'challenge' | 'program', updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'trash', }, }

PATCH /collections/{guid}

Update a Collection

Response Body
{
  data: {
    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', }, }

PATCH /collections/{guid}

Update a Collection

Response Body
{
  data: {
    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' | 'format', value?: string, }>, totalCount?: number, type?: 'generic' | 'series' | 'challenge' | 'program', updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'trash', }, }

PUT /collections/{guid}/schedule/{scheduleGuid}

Add a schedule item to a collection

Response Body
{
  data: {
    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', }, }

PUT /collections/{guid}/schedule/{scheduleGuid}

Add a schedule item to a collection

Response Body
{
  data: {
    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' | 'format', value?: string, }>, totalCount?: number, type?: 'generic' | 'series' | 'challenge' | 'program', updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'trash', }, }
40 added endpoints
Added endpoints

GET /test/country

Test pulling out the geo country

Response Body
{
  data: string,
}

POST /auth/one-time-token

Trade in your login token from a magic link for a session

Request Body
{
  guid?: string,
}
Response Body
{
  data: {
    family?: List<{
      id?: number,
      image?: {
        default: string,
        large: string,
        medium: string,
        small: string,
        url?: string,
      },
      nickname?: string,
    }>,
    guid?: string,
    jwt?: string,
    mongoId?: string,
    plan?: {
      expires?: number,
      features?: record,
      id?: number,
      name?: string,
      planFamily?: {
        code?: 'premier' | 'select' | 'flex' | 'fitpass' | 'free',
      },
    },
    userId?: number,
  },
}

POST /users/{userId}/login-tokens

Request Body
{
  expirationSeconds?: number,
}
Response Body
{
  data: {
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateExpires?: number,
    dateRedeemed?: number,
    guid?: string,
    user?: {
      id?: number,
    },
  },
}

POST /commercial/codes

Create a new commercial code

Guard: admin

Request Body
{
  dateCreated?: number,
  dateRedeemed?: number,
  location?: {
    id?: number,
  },
  serialNumber?: string,
  status?: 'pending' | 'active' | 'expired',
}
Response Body
{
  data: {
    code?: string,
    company?: {
      id?: number,
      name?: string,
    },
    dateCreated?: number,
    dateRedeemed?: number,
    location?: {
      accessPin?: number,
      city?: string,
      id?: number,
      name?: string,
    },
    serialNumber?: string,
    status?: 'pending' | 'active' | 'expired',
    subscription?: {
      id?: number,
      name?: string,
    },
  },
}

GET /commercial/codes

Get a list of commercial codes

Guard: admin

Response Body
{
  data: List<{
    code?: string,
    company?: {
      id?: number,
      name?: string,
    },
    dateCreated?: number,
    dateRedeemed?: number,
    location?: {
      accessPin?: number,
      city?: string,
      id?: number,
      name?: string,
    },
    serialNumber?: string,
    status?: 'pending' | 'active' | 'expired',
    subscription?: {
      id?: number,
      name?: string,
    },
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

GET /commercial/codes/{code}

Get a specific commercial code

Guard: admin

Response Body
{
  data: {
    code?: string,
    company?: {
      id?: number,
      name?: string,
    },
    dateCreated?: number,
    dateRedeemed?: number,
    location?: {
      accessPin?: number,
      city?: string,
      id?: number,
      name?: string,
    },
    serialNumber?: string,
    status?: 'pending' | 'active' | 'expired',
    subscription?: {
      id?: number,
      name?: string,
    },
  },
}

POST /commercial/codes/{code}/redeem

Redeem a comercial code

Request Body
{
  serialNumber?: string,
}
Response Body
{
  data: {
    code?: string,
    company?: {
      id?: number,
      name?: string,
    },
    dateCreated?: number,
    dateRedeemed?: number,
    location?: {
      accessPin?: number,
      city?: string,
      id?: number,
      name?: string,
    },
    serialNumber?: string,
    status?: 'pending' | 'active' | 'expired',
    subscription?: {
      id?: number,
      name?: string,
    },
  },
}

POST /commercial/codes/{code}/validate

Verify that a code is still valid and can be used.

Request Body
{
  serialNumber?: string,
}
Response Body
{
  data: {
    code?: string,
    company?: {
      id?: number,
      name?: string,
    },
    dateCreated?: number,
    dateRedeemed?: number,
    location?: {
      accessPin?: number,
      city?: string,
      id?: number,
      name?: string,
    },
    serialNumber?: string,
    status?: 'pending' | 'active' | 'expired',
    subscription?: {
      id?: number,
      name?: string,
    },
  },
}

POST /commercial/codes/{code}/reset

Reset a code to an unused state.

Guard: admin

Response Body
{
  data: {
    code?: string,
    company?: {
      id?: number,
      name?: string,
    },
    dateCreated?: number,
    dateRedeemed?: number,
    location?: {
      accessPin?: number,
      city?: string,
      id?: number,
      name?: string,
    },
    serialNumber?: string,
    status?: 'pending' | 'active' | 'expired',
    subscription?: {
      id?: number,
      name?: string,
    },
  },
}

POST /commercial/codes/{code}/suspend

Suspend this code.

Guard: admin

Response Body
{
  data: {
    code?: string,
    company?: {
      id?: number,
      name?: string,
    },
    dateCreated?: number,
    dateRedeemed?: number,
    location?: {
      accessPin?: number,
      city?: string,
      id?: number,
      name?: string,
    },
    serialNumber?: string,
    status?: 'pending' | 'active' | 'expired',
    subscription?: {
      id?: number,
      name?: string,
    },
  },
}

POST /commercial/locations

Create a commercial location

Guard: admin

Request Body
{
  accessPin?: number,
  address1?: string,
  address2?: string,
  city?: string,
  commercialUser?: {
    id?: number,
  },
  company?: {
    id?: number,
  },
  countryCode?: string,
  dateNextBilling?: number,
  name?: string,
  phone?: string,
  postalCode?: string,
  state?: string,
  subscription?: {
    id?: number,
  },
}
Response Body
{
  data: {
    accessPin?: number,
    address1?: string,
    address2?: string,
    city?: string,
    commercialUser?: {
      email?: string,
      id?: number,
    },
    company?: {
      id?: number,
      name?: string,
    },
    countryCode?: string,
    dateCreated?: number,
    dateNextBilling?: number,
    dateUpdated?: number,
    id?: number,
    name?: string,
    phone?: string,
    postalCode?: string,
    state?: string,
    subscription?: {
      id?: number,
      name?: string,
    },
    user?: {
      id?: number,
    },
  },
}

GET /commercial/locations

Get a list of commercial locations

Guard: admin

Response Body
{
  data: List<{
    accessPin?: number,
    address1?: string,
    address2?: string,
    city?: string,
    commercialUser?: {
      email?: string,
      id?: number,
    },
    company?: {
      id?: number,
      name?: string,
    },
    countryCode?: string,
    dateCreated?: number,
    dateNextBilling?: number,
    dateUpdated?: number,
    id?: number,
    name?: string,
    phone?: string,
    postalCode?: string,
    state?: string,
    subscription?: {
      id?: number,
      name?: string,
    },
    user?: {
      id?: number,
    },
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

GET /commercial/locations/{id}

Get a specific commercial location

Guard: loggedIn

Response Body
{
  data: {
    accessPin?: number,
    address1?: string,
    address2?: string,
    city?: string,
    commercialUser?: {
      email?: string,
      id?: number,
    },
    company?: {
      id?: number,
      name?: string,
    },
    countryCode?: string,
    dateCreated?: number,
    dateNextBilling?: number,
    dateUpdated?: number,
    id?: number,
    name?: string,
    phone?: string,
    postalCode?: string,
    state?: string,
    subscription?: {
      id?: number,
      name?: string,
    },
    user?: {
      id?: number,
    },
  },
}

PATCH /commercial/locations/{id}

Update a commercial location

Guard: admin

Request Body
{
  accessPin: number,
  address1: string,
  address2: string,
  city: string,
  commercialUser: {
    id?: number,
  },
  company: {
    id?: number,
  },
  countryCode: string,
  dateNextBilling: number,
  name: string,
  phone: string,
  postalCode: string,
  state: string,
  subscription: {
    id?: number,
  },
}
Response Body
{
  data: {
    accessPin?: number,
    address1?: string,
    address2?: string,
    city?: string,
    commercialUser?: {
      email?: string,
      id?: number,
    },
    company?: {
      id?: number,
      name?: string,
    },
    countryCode?: string,
    dateCreated?: number,
    dateNextBilling?: number,
    dateUpdated?: number,
    id?: number,
    name?: string,
    phone?: string,
    postalCode?: string,
    state?: string,
    subscription?: {
      id?: number,
      name?: string,
    },
    user?: {
      id?: number,
    },
  },
}

GET /commercial/locations/{id}/codes

Get a specific commercial location

Guard: loggedIn

Response Body
{
  data: List<{
    code?: string,
    company?: {
      id?: number,
      name?: string,
    },
    dateCreated?: number,
    dateRedeemed?: number,
    location?: {
      accessPin?: number,
      city?: string,
      id?: number,
      name?: string,
    },
    serialNumber?: string,
    status?: 'pending' | 'active' | 'expired',
    subscription?: {
      id?: number,
      name?: string,
    },
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

POST /commercial/locations/{id}/suspend

Suspend all codes for this location

Guard: admin

POST /commercial/locations/{id}/reset

Reset all codes for this location

Guard: admin

GET /users/{userId}/account/subscriptions

Returns all of the accounts subscriptions

Response Body
{
  data: List<{
    activation?: {
      isActivated?: bool,
      isFirstPeriodPrepaid?: bool,
    },
    billing?: {
      customerCode?: string,
      orderCode?: string,
    },
    cancellation?: {
      dateCancelled?: number,
      reason?: {
        code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
        message?: string,
      },
    },
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    offer?: {
      guid?: string,
    },
    pause?: {
      dateEnd?: number,
      dateStart?: number,
      reason?: string,
    },
    plan?: {
      basePrice?: {
        currency?: {
          code?: string,
          scale?: number,
          symbol?: string,
        },
        value?: number,
      },
      benefits?: List<{
        text?: string,
      }>,
      billingProvider?: {
        credentialsKey?: string,
        id?: number,
        name?: string,
        organizationCode?: string,
        priceCode?: string,
        productCode?: string,
        type?: 'stripe' | 'apple' | 'google' | 'amazon',
      },
      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,
      source?: {
        accountId?: string,
        name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
        productId?: string,
      },
      tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>,
      updatedBy?: {
        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,
      term: string,
    },
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

POST /users/{userId}/account/payment

Update the account payment method on a Stripe subscription

Request Body
{
  billingAddress: {
    city?: string,
    country?: {
      code?: string,
    },
    postalCode?: string,
    region?: {
      code?: string,
    },
    streetLine1?: string,
    streetLine2?: string,
  },
  cardTokenId?: string,
  firstName: string,
  lastName: string,
  phoneNumber: 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,
        isFirstPeriodPrepaid?: bool,
      },
      billing?: {
        customerCode?: string,
        orderCode?: string,
      },
      cancellation?: {
        dateCancelled?: number,
        reason?: {
          code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
          message?: string,
        },
      },
      createdBy?: {
        id?: number,
      },
      dateCreated?: number,
      dateUpdated?: number,
      id?: number,
      offer?: {
        guid?: string,
      },
      pause?: {
        dateEnd?: number,
        dateStart?: number,
        reason?: string,
      },
      plan?: {
        basePrice?: {
          currency?: {
            code?: string,
            scale?: number,
            symbol?: string,
          },
          value?: number,
        },
        benefits?: List<{
          text?: string,
        }>,
        billingProvider?: {
          credentialsKey?: string,
          id?: number,
          name?: string,
          organizationCode?: string,
          priceCode?: string,
          productCode?: string,
          type?: 'stripe' | 'apple' | 'google' | 'amazon',
        },
        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,
        source?: {
          accountId?: string,
          name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
          productId?: string,
        },
        tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>,
        updatedBy?: {
          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,
        term: string,
      },
    },
  },
}

POST /users/{userId}/account/subscribe

Create a new subscription in stripe

Guard: loggedIn

Request Body
{
  applyBillingDelay: bool,
  billingAddress: {
    city?: string,
    country?: {
      code?: string,
    },
    postalCode?: string,
    region?: {
      code?: string,
    },
    streetLine1?: string,
    streetLine2?: string,
  },
  cardTokenId?: string,
  firstName: string,
  isFirstPeriodPrepaid: bool,
  lastName: string,
  phoneNumber: string,
  planId?: number,
  redemptionCode: string,
  utm: {
    campaign: string,
    content: string,
    medium: string,
    source: string,
    term: 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,
        isFirstPeriodPrepaid?: bool,
      },
      billing?: {
        customerCode?: string,
        orderCode?: string,
      },
      cancellation?: {
        dateCancelled?: number,
        reason?: {
          code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
          message?: string,
        },
      },
      createdBy?: {
        id?: number,
      },
      dateCreated?: number,
      dateUpdated?: number,
      id?: number,
      offer?: {
        guid?: string,
      },
      pause?: {
        dateEnd?: number,
        dateStart?: number,
        reason?: string,
      },
      plan?: {
        basePrice?: {
          currency?: {
            code?: string,
            scale?: number,
            symbol?: string,
          },
          value?: number,
        },
        benefits?: List<{
          text?: string,
        }>,
        billingProvider?: {
          credentialsKey?: string,
          id?: number,
          name?: string,
          organizationCode?: string,
          priceCode?: string,
          productCode?: string,
          type?: 'stripe' | 'apple' | 'google' | 'amazon',
        },
        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,
        source?: {
          accountId?: string,
          name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
          productId?: string,
        },
        tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>,
        updatedBy?: {
          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,
        term: string,
      },
    },
  },
}

POST /users/{userId}/account/test-subscription

create a blank subscription for testing purposes

Guard: admin

Response Body
{
  data: {
    subscription?: {
      activation?: {
        isActivated?: bool,
        isFirstPeriodPrepaid?: bool,
      },
      billing?: {
        customerCode?: string,
        orderCode?: string,
      },
      cancellation?: {
        dateCancelled?: number,
        reason?: {
          code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
          message?: string,
        },
      },
      createdBy?: {
        id?: number,
      },
      dateCreated?: number,
      dateUpdated?: number,
      id?: number,
      offer?: {
        guid?: string,
      },
      pause?: {
        dateEnd?: number,
        dateStart?: number,
        reason?: string,
      },
      plan?: {
        basePrice?: {
          currency?: {
            code?: string,
            scale?: number,
            symbol?: string,
          },
          value?: number,
        },
        benefits?: List<{
          text?: string,
        }>,
        billingProvider?: {
          credentialsKey?: string,
          id?: number,
          name?: string,
          organizationCode?: string,
          priceCode?: string,
          productCode?: string,
          type?: 'stripe' | 'apple' | 'google' | 'amazon',
        },
        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,
        source?: {
          accountId?: string,
          name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
          productId?: string,
        },
        tags?: List<'humana' | 'gympass' | 'addon' | 'amazon' | 'popular' | 'directPurchase' | 'csOnly' | 'displayInAdmin'>,
        updatedBy?: {
          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,
        term: string,
      },
    },
    tokenId?: string,
  },
}

POST /users/{userId}/account/test-token

Generate a test token for stripe

Guard: admin

Response Body
{
  data: string,
}

POST /playlists/{id}/playback-dryrun

Track the playback for media rights purposes.

Guard: loggedIn

Request Body
{
  countryCode: string,
  duration?: number,
  start: number,
}
Response Body
{
  data: {
    cacheKey?: string,
    countryCode?: string,
    plan?: {

    },
    retailerCode?: string,
    trackCount?: number,
    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,
    }>,
    userCode?: string,
  },
}

GET /content/searches

Gets a list of most popular searches

Guard: loggedIn

Response Body
{
  data: List<string>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

GET /content/searches/autocomplete

Gets a list of auto complete searches

Guard: loggedIn

Response Body
{
  data: List<string>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

GET /content/durations

Get list of available durations.

Guard: loggedIn

Response Body
{
  data: List<{
    id?: number,
    name?: string,
    value?: number,
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

POST /content/tag-groups

Create a tag group

Guard: admin

Request Body
{
  group?: string,
  level?: 'primary',
  translations: record,
  values?: List<string>,
}
Response Body
{
  data: {
    group?: string,
    level?: 'primary',
    translations: record,
    values?: List<string>,
  },
}

GET /content/languages

Get available content languages.

Guard: loggedIn

Response Body
{
  data: List<{
    key?: string,
    name?: string,
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

GET /content/countries

List of all possible countries to which a producer can assign content.

Guard: loggedIn

Response Body
{
  data: List<{
    code?: string,
    name?: string,
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

POST /users/{userId}/devices

Request Body
{
  environment: 'standard' | 'debug',
  model: string,
  osVersion: string,
  pushToken: string,
  type?: 'ios' | 'android',
}
Response Body
{
  data: {
    dateCreated?: number,
    deviceGuid?: string,
    environment?: 'standard' | 'debug',
    model?: string,
    osVersion?: string,
    pushToken?: string,
    type?: 'ios' | 'android',
    user?: {
      id?: number,
    },
  },
}

GET /users/{userId}/devices

Response Body
{
  data: List<{
    dateCreated?: number,
    deviceGuid?: string,
    environment?: 'standard' | 'debug',
    model?: string,
    osVersion?: string,
    pushToken?: string,
    type?: 'ios' | 'android',
    user?: {
      id?: number,
    },
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

PATCH /users/{userId}/devices/{deviceGuid}

Request Body
{
  environment: 'standard' | 'debug',
  model: string,
  osVersion: string,
  pushToken: string,
  type: 'ios' | 'android',
}
Response Body
{
  data: {
    dateCreated?: number,
    deviceGuid?: string,
    environment?: 'standard' | 'debug',
    model?: string,
    osVersion?: string,
    pushToken?: string,
    type?: 'ios' | 'android',
    user?: {
      id?: number,
    },
  },
}

GET /users/{userId}/devices/{deviceGuid}

Response Body
{
  data: {
    dateCreated?: number,
    deviceGuid?: string,
    environment?: 'standard' | 'debug',
    model?: string,
    osVersion?: string,
    pushToken?: string,
    type?: 'ios' | 'android',
    user?: {
      id?: number,
    },
  },
}

DELETE /users/{userId}/devices/{deviceGuid}

PUT /workouts/{guid}

Post a Workout

Guard: loggedIn

Request Body
{
  classLibrary: string,
  content?: {
    guid?: string,
    legacy?: {
      id?: number,
      type?: 'reflect' | 'connect',
    },
    type?: 'live' | 'vod' | 'encore' | 'freestyle',
  },
  device?: {
    appVersion?: string,
    model?: string,
    os?: string,
    osVersion?: string,
  },
  events: List<string>,
  peripherals?: List<{
    firmwareVersion?: string,
    guid?: string,
    hardwareVersion?: string,
    modelId?: string,
    name?: string,
    serialNO?: string,
    type?: 'bike' | 'rower' | 'treadmill',
  }>,
  productName: string,
  ranking: {
    place?: number,
    total?: number,
  },
  stats?: List<{
    classState?: 'warmup' | 'in-session' | 'overflow' | 'ended',
    dateLoggedMs?: number,
    output?: {
      distance: number,
      incrementalDistance: number,
      joules: number,
      RPM: number,
      strokesPerMinute: number,
      time500Meters: number,
      watts: number,
    },
    peripheral?: {
      guid: string,
      incline: number,
      resistance: number,
      speed: number,
    },
    physiology?: {
      calories: number,
      heartRate: number,
      hrPoints: number,
    },
    playbackState?: 'playing' | 'paused' | 'stopped' | 'buffering',
  }>,
  user?: {
    id?: number,
  },
}

DELETE /workouts/{guid}

Delete a workout

Guard: loggedIn

GET /workouts/{guid}

Get detailed view of workout

Guard: loggedIn

Response Body
{
  data: {
    data?: record,
  },
}

GET /workouts

Get a list of workout summaries

Guard: admin, self

Response Body
{
  data: List<{
    content?: {
      description?: string,
      duration?: number,
      guid?: string,
      image?: {
        default: string,
        large: string,
        medium: string,
        small: string,
        url?: string,
      },
      instructors?: List<{
        id?: number,
        name?: string,
      }>,
      legacy?: {
        id?: number,
        type?: 'reflect' | 'connect',
      },
      name?: string,
      type?: 'live' | 'vod' | 'encore' | 'freestyle',
    },
    dateEnd?: number,
    dateStart?: number,
    duration?: {
      percentage?: number,
      text?: string,
      value?: number,
    },
    guid?: string,
    ranking?: {
      place?: number,
      total?: number,
    },
    stats?: record,
    status?: 'new' | 'incomplete' | 'complete',
    user?: {
      id?: number,
    },
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

GET /workouts/tags

Get all tags a user has for workouts taken

Guard: admin, self

Response Body
{
  data: List<string>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

PUT /images/{type}/{id}/{rendition}

Upload an image for this resource.

Request Body
{
  image: string,
}
Response Body
{
  data: {

  },
}
5 deleted endpoints

GET /subscriptions/{id}/history

Get a subscription history by subscription ID

Guard: admin

Response Body
{
  data: List<{
    action?: 'paused' | 'planChanged' | 'created' | 'canceled' | 'discounted',
    dateOccurred?: number,
    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

Request Body
{
  action?: 'paused' | 'planChanged' | 'created' | 'canceled' | 'discounted',
  initiatedBy?: {
    id?: number,
  },
  payload: record,
  rawJson: record,
  reason: string,
  source: 'stripe.com' | 'admin.echelonfit.com' | 'falcon1.echelonfit.com' | 'member.echelonfit.com' | 'stag.member.echelonfit.com',
  subscription?: {
    id?: number,
  },
  user?: {
    id?: number,
  },
}
Response Body
{
  data: {
    action?: 'paused' | 'planChanged' | 'created' | 'canceled' | 'discounted',
    dateOccurred?: number,
    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

create a blank subscription for testing purposes

Guard: admin

Response Body
{
  data: {
    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,
      },
    },
    tokenId?: string,
  },
}

PUT /workouts/{workoutGuid}

Updates a user workout

Guard: admin

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 /workouts/summaries

Get all workouts

Response Body
{
  data: List<{
    classInformation?: {
      desc?: string,
      id?: number,
      instructor?: string,
      playlist_id?: number,
      promo?: bool,
      title?: string,
    },
    classLibrary?: string,
    dateEnd?: number,
    dateStart?: number,
    productName?: string,
    userId?: number,
    workoutGuid?: string,
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}
Deleted endpoints
WORK IN PROGRESS