Nest Changelog
1.2.2
7/27/2022
1.3.0
8/4/2022
13 changed endpoints Collapse changed endpoints
POST /webhooks/invoice-upcoming 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTotal?: number,
attemptCount?: number,
attempted?: bool,
billingProviderId?: string,
- billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual',
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 Collapse 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,
},
},
}