Nest Changelog

1.2.2

7/27/2022

1.3.0

8/4/2022

13 changed endpoints

POST /webhooks/invoice-upcoming

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingProviderId?: string,
- billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual',

currencyCode?: string, dateCreated?: number, dateNextAttempt?: number, datePeriodEnd?: number, datePeriodStart?: number, - initiatedBy?: {

id?: number, }, - internalNote?: string,

isAutomaticCollection?: bool, isManualPayment?: bool, isPaid?: bool, - publicNote?: string, - reason?: {

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

POST /webhooks/invoice-upcoming

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingProviderId?: string,

+ billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming', currencyCode?: string, dateCreated?: number, dateNextAttempt?: number, datePeriodEnd?: number, datePeriodStart?: number,

+ initiatedBy: { id?: number, },

+ internalNote: string, isAutomaticCollection?: bool, isManualPayment?: bool, isPaid?: bool,

+ publicNote: string, + reason: { code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other', message?: string, }, status?: string, }

POST /webhooks/invoice-paid

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingProviderId?: string,
- billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual',

currencyCode?: string, dateCreated?: number, dateNextAttempt?: number, datePeriodEnd?: number, datePeriodStart?: number, - initiatedBy?: {

id?: number, }, - internalNote?: string,

isAutomaticCollection?: bool, isManualPayment?: bool, isPaid?: bool, - publicNote?: string, - reason?: {

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

POST /webhooks/invoice-paid

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingProviderId?: string,

+ billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming', currencyCode?: string, dateCreated?: number, dateNextAttempt?: number, datePeriodEnd?: number, datePeriodStart?: number,

+ initiatedBy: { id?: number, },

+ internalNote: string, isAutomaticCollection?: bool, isManualPayment?: bool, isPaid?: bool,

+ publicNote: string, + reason: { code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other', message?: string, }, status?: string, }

POST /webhooks/payment-failure

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingProviderId?: string,
- billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual',

currencyCode?: string, dateCreated?: number, dateNextAttempt?: number, datePeriodEnd?: number, datePeriodStart?: number, - initiatedBy?: {

id?: number, }, - internalNote?: string,

isAutomaticCollection?: bool, isManualPayment?: bool, isPaid?: bool, - publicNote?: string, - reason?: {

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

POST /webhooks/payment-failure

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingProviderId?: string,

+ billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming', currencyCode?: string, dateCreated?: number, dateNextAttempt?: number, datePeriodEnd?: number, datePeriodStart?: number,

+ initiatedBy: { id?: number, },

+ internalNote: string, isAutomaticCollection?: bool, isManualPayment?: bool, isPaid?: bool,

+ publicNote: string, + reason: { code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other', message?: string, }, status?: string, }

POST /webhooks/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?: number,

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

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

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

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

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

GET /users/{userId}/account/history

Get the changes that have happened to this account

Response Body
{
  data: List<{
-   action?: 'create' | 'activate' | 'started' | 'ended' | 'pause' | 'unpause' | 'cancel' | 'uncancel' | 'terminate' | 'change' | 'extend' | 'refund' | 'credit' | 'discount' | 'anonymize' | 'ban' | 'join-family' | 'unjoin-family ' | 'memo' | 'upcoming' | 'paid' | 'updated' | 'failed',

dateOccurred?: number, guid?: string, initiatedBy?: { id?: number, }, internalNote?: string, payload: record, publicNote?: string, reason?: { code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other', message?: string, }, source?: 'webhook' | 'cs' | 'member' | 'app' | 'nest', subscription?: { id?: number, }, user?: { id?: number, }, }>, pagination: { page?: number, skip?: number, take?: number, total: { pages?: number, rows?: number, }, }, }

GET /users/{userId}/account/history

Get the changes that have happened to this account

Response Body
{
  data: List<{

+ action?: 'create' | 'activate' | 'started' | 'ended' | 'pause' | 'unpause' | 'cancel' | 'uncancel' | 'terminate' | 'change' | 'extend' | 'refund' | 'credit' | 'discount' | 'anonymize' | 'ban' | 'join-family' | 'unjoin-family' | 'memo' | 'upcoming' | 'paid' | 'updated' | 'failed', dateOccurred?: number, guid?: string, initiatedBy?: { id?: number, }, internalNote?: string, payload: record, publicNote?: string, reason?: { code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other', message?: string, }, source?: 'webhook' | 'cs' | 'member' | 'app' | 'nest', subscription?: { id?: number, }, user?: { id?: number, }, }>, pagination: { page?: number, skip?: number, take?: number, total: { pages?: number, rows?: number, }, }, }

GET /songs/{id}/playlists

Get all playlists that contain this song

Response Body
{
  data: List<{
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    isFlagged?: bool,

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

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,
    },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    isFlagged?: bool,
+   legacyContentExplicit?: bool,
    name?: string,
    schedule?: List<{
      available?: {
        end?: number,
        live?: number,
        start?: number,
      },
      content?: {
        guid?: string,
      },
      guid?: string,
      legacy: {
        hlsUrl?: string,
        id?: number,
        liveStreamId?: number,
        type?: 'reflect' | 'connect',
      },
      type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
    }>,
    studios?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
+   tags?: List<{
+     image?: {
+       default: string,
+       large: string,
+       medium: string,
+       small: string,
+       url?: string,
+     },
+     text?: string,
+     translations: record,
+     type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
+     value?: string,
+   }>,
    videoLength?: {
      id?: number,
      name?: string,
    },
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total: {
      pages?: number,
      rows?: number,
    },
  },
}

GET /playlists

Get a list of playlists

Response Body
{
  data: List<{
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    isFlagged?: bool,

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

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

GET /playlists

Get a list of playlists

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

POST /playlists

Create a new playlist

Response Body
{
  data: {
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    isFlagged?: bool,

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

videoLength?: { id?: number, name?: string, }, }, }

POST /playlists

Create a new playlist

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

GET /playlists/{playlist}

Get a single playlist by ID

Response Body
{
  data: {
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    isFlagged?: bool,

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

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,
    },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    isFlagged?: bool,
+   legacyContentExplicit?: bool,
    name?: string,
    schedule?: List<{
      available?: {
        end?: number,
        live?: number,
        start?: number,
      },
      content?: {
        guid?: string,
      },
      guid?: string,
      legacy: {
        hlsUrl?: string,
        id?: number,
        liveStreamId?: number,
        type?: 'reflect' | 'connect',
      },
      type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
    }>,
    studios?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
+   tags?: List<{
+     image?: {
+       default: string,
+       large: string,
+       medium: string,
+       small: string,
+       url?: string,
+     },
+     text?: string,
+     translations: record,
+     type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
+     value?: string,
+   }>,
    tracks?: List<{
      createdBy?: {
        id?: number,
      },
      dateCreated?: number,
      flag?: string,
      playlist?: {
        id?: number,
      },
      song?: {
        album?: {
          id?: number,
          name?: string,
        },
        artists?: List<{
          id?: number,
          name?: string,
        }>,
        copyright: record,
        coverArtUrl?: string,
        duration?: {
          seconds: number,
          text: string,
        },
        genres?: List<string>,
        id?: number,
        isExplicit?: bool,
        isrc?: string,
        label?: {
          id?: number,
          name?: string,
        },
        labelOwner?: {
          id?: number,
          name?: string,
        },
        labelRights: record,
        name?: string,
        publisherRights?: List<string>,
        releaseDate?: number,
        searchFlags: record,
      },
      trackOrder?: number,
    }>,
    videoLength?: {
      id?: number,
      name?: string,
    },
  },
}

PATCH /playlists/{id}

Update an existing playlist

Request Body
{
  countries: List<{
    code?: string,
  }>,
  createdBy: {
    id?: number,
  },
  dateCreated: number,
  dateUpdated: number,
  id: number,
  instructors: List<{
    id?: number,
    name?: string,
    precedence?: number,
  }>,
  isFlagged: bool,

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

videoLength: { id?: number, name?: string, }, }
Response Body
{
  data: {
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    isFlagged?: bool,

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

videoLength?: { id?: number, name?: string, }, }, }

PATCH /playlists/{id}

Update an existing playlist

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

POST /playlists/{playlist}/import

Import all songs from a playlist to another playlist

Guard: none

Response Body
{
  data: {
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    isFlagged?: bool,

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

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

Guard: instructor

Response Body
{
  data: {
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    id?: number,
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    isFlagged?: bool,
+   legacyContentExplicit?: bool,
    name?: string,
    schedule?: List<{
      available?: {
        end?: number,
        live?: number,
        start?: number,
      },
      content?: {
        guid?: string,
      },
      guid?: string,
      legacy: {
        hlsUrl?: string,
        id?: number,
        liveStreamId?: number,
        type?: 'reflect' | 'connect',
      },
      type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
    }>,
    studios?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
+   tags?: List<{
+     image?: {
+       default: string,
+       large: string,
+       medium: string,
+       small: string,
+       url?: string,
+     },
+     text?: string,
+     translations: record,
+     type?: 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'modality' | 'equipment' | 'plan' | 'venue' | 'general' | 'level',
+     value?: string,
+   }>,
    tracks?: List<{
      createdBy?: {
        id?: number,
      },
      dateCreated?: number,
      flag?: string,
      playlist?: {
        id?: number,
      },
      song?: {
        album?: {
          id?: number,
          name?: string,
        },
        artists?: List<{
          id?: number,
          name?: string,
        }>,
        copyright: record,
        coverArtUrl?: string,
        duration?: {
          seconds: number,
          text: string,
        },
        genres?: List<string>,
        id?: number,
        isExplicit?: bool,
        isrc?: string,
        label?: {
          id?: number,
          name?: string,
        },
        labelOwner?: {
          id?: number,
          name?: string,
        },
        labelRights: record,
        name?: string,
        publisherRights?: List<string>,
        releaseDate?: number,
        searchFlags: record,
      },
      trackOrder?: number,
    }>,
    videoLength?: {
      id?: number,
      name?: string,
    },
  },
}
2 added endpoints
Added endpoints

POST /users/{userId}/account/credit

Guard: admin

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?: {
      status?: 'accepted' | 'blocked' | 'requested',
    },
    subscription?: {
      activation?: {
        isActivated?: bool,
      },
      billingProvider?: {
        accountId?: string,
        customerId?: string,
        name?: 'stripe' | 'ios' | 'android' | 'amazon',
        orderId?: string,
      },
      cancellation?: {
        dateCancelled?: number,
        reason?: {
          code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
          message?: string,
        },
      },
      createdBy?: {
        id?: number,
      },
      dateCreated?: number,
      dateUpdated?: number,
      id?: number,
      pause?: {
        dateEnd?: number,
        dateStart?: number,
        reason?: string,
      },
      plan?: {
        id?: number,
      },
      price?: {
        currency?: {
          code?: string,
          scale?: number,
          symbol?: string,
        },
        value?: number,
      },
      promotion?: {
        id?: number,
      },
      provisional?: {
        isProvisioned?: bool,
      },
      renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
      source?: {
        accountId?: string,
        lineItemId?: string,
        name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
        orderId?: string,
        productId?: string,
      },
      status?: 'pending' | 'trialing' | 'active' | 'expired',
      term?: {
        dateEnd?: number,
        dateStart?: number,
      },
      token?: string,
      trial?: {
        dateEnd?: number,
        dateStart?: number,
      },
      updatedBy?: {
        id?: number,
      },
      user?: {
        id?: number,
      },
      utm?: {
        campaign?: string,
        content?: string,
        medium?: string,
        source?: string,
      },
    },
  },
}

POST /users/{userId}/account/activate

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

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?: {
      status?: 'accepted' | 'blocked' | 'requested',
    },
    subscription?: {
      activation?: {
        isActivated?: bool,
      },
      billingProvider?: {
        accountId?: string,
        customerId?: string,
        name?: 'stripe' | 'ios' | 'android' | 'amazon',
        orderId?: string,
      },
      cancellation?: {
        dateCancelled?: number,
        reason?: {
          code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other',
          message?: string,
        },
      },
      createdBy?: {
        id?: number,
      },
      dateCreated?: number,
      dateUpdated?: number,
      id?: number,
      pause?: {
        dateEnd?: number,
        dateStart?: number,
        reason?: string,
      },
      plan?: {
        id?: number,
      },
      price?: {
        currency?: {
          code?: string,
          scale?: number,
          symbol?: string,
        },
        value?: number,
      },
      promotion?: {
        id?: number,
      },
      provisional?: {
        isProvisioned?: bool,
      },
      renewal?: 'auto' | 'paused' | 'cancelled' | 'failed',
      source?: {
        accountId?: string,
        lineItemId?: string,
        name?: 'shopify' | 'amazon' | 'ios' | 'android' | 'organic' | 'free',
        orderId?: string,
        productId?: string,
      },
      status?: 'pending' | 'trialing' | 'active' | 'expired',
      term?: {
        dateEnd?: number,
        dateStart?: number,
      },
      token?: string,
      trial?: {
        dateEnd?: number,
        dateStart?: number,
      },
      updatedBy?: {
        id?: number,
      },
      user?: {
        id?: number,
      },
      utm?: {
        campaign?: string,
        content?: string,
        medium?: string,
        source?: string,
      },
    },
  },
}

POST /subscriptions/{id}/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: {
    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,
    },
  },
}
Deleted endpoints
WORK IN PROGRESS