Nest Changelog
1.27.8
6/2/2023
1.28.0 PRE
5/30/2023
8 changed endpoints Collapse changed endpoints
POST /webhooks/invoice-upcoming 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTax?: 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,
invoiceId?: 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-upcoming 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTax?: 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,
invoiceId?: 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,
+ sourceUserEmail: string,
status?: string,
}POST /webhooks/invoice-updated 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTax?: 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,
invoiceId?: 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-updated 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTax?: 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,
invoiceId?: 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,
+ sourceUserEmail: string,
status?: string,
}POST /webhooks/invoice-paid 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTax?: 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,
invoiceId?: 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,
amountTax?: 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,
invoiceId?: 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,
+ sourceUserEmail: string,
status?: string,
}POST /webhooks/payment-failure 
Request Body
{
amountDue?: number,
amountPaid?: number,
amountTax?: 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,
invoiceId?: 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,
amountTax?: 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,
invoiceId?: 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,
+ sourceUserEmail: 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,
planId?: string,
publicNote: string,
reason: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
message?: string,
},
renewedAt?: number,
sourceCode?: string,
sourceType?: '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,
orderCode?: string,
planId?: string,
publicNote: string,
reason: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
message?: string,
},
renewedAt?: number,
sourceCode?: string,
sourceType?: 'stripe' | 'apple' | 'google' | 'amazon',
sourceUserCode?: string,
+ sourceUserEmail: 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,
planId?: string,
publicNote: string,
reason: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
message?: string,
},
renewedAt?: number,
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,
orderCode?: string,
planId?: string,
publicNote: string,
reason: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
message?: string,
},
renewedAt?: number,
sourceCode?: string,
sourceType?: 'stripe' | 'apple' | 'google' | 'amazon',
sourceUserCode?: string,
+ sourceUserEmail: 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,
planId?: string,
publicNote: string,
reason: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
message?: string,
},
renewedAt?: number,
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,
orderCode?: string,
planId?: string,
publicNote: string,
reason: {
code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
message?: string,
},
renewedAt?: number,
sourceCode?: string,
sourceType?: 'stripe' | 'apple' | 'google' | 'amazon',
sourceUserCode?: string,
+ sourceUserEmail: string,
status?: string,
}POST /workouts/process 
Process workout - Internal use only
Request Body
{
rideIndex?: {
appversion: string,
avgcadence: number,
avgresistance: number,
classimage: string,
classname: string,
datecreated: number,
device: string,
dnf: bool,
finalrank: number,
incline: number,
instanceuuid?: string,
instructorname: string,
iscomplete: bool,
osversion: string,
- product?: string,
rideid: number,
ridetype?: string,
source: string,
totalcalories: number,
totaldistance: number,
totalhrpoints: number,
totaloutput: number,
totalriders: number,
userid?: number,
},
rideIndexById?: {
appversion: string,
avgcadence: number,
avgheartrate: number,
avgresistance: number,
classimage: string,
classname: string,
device: string,
dnf: bool,
duration: number,
encore: bool,
finalrank: number,
incline: number,
instanceuuid?: string,
instructorname: string,
iscomplete: bool,
osversion: string,
- product?: string,
rideid: number,
ridetype: string,
source: string,
totalcalories: number,
totaldistance: number,
totalhrpoints: number,
totaloutput: number,
totalriders: number,
userid: number,
},
segment?: {
activity_type: string,
bike_statistics: {
cadence?: number,
calories?: number,
distance?: number,
output?: {
average?: number,
best?: number,
total?: number,
},
resistance?: {
average?: number,
maximum?: number,
},
speed?: number,
},
class_length: number,
class_name: string,
content_id: string,
content_type: 'live' | 'vod' | 'encore' | 'freestyle',
email?: string,
equipment_type: 'bike' | 'fitpass' | 'reflect' | 'row' | 'stride',
first_name?: string,
fitpass_statistics: {
calories?: number,
heart_rate_points?: number,
},
instructor_id: number,
instructor_name: string,
last_name?: string,
metric_preference?: 'imperial' | 'metric',
music_genre: string,
place: number,
platform?: string,
reflect_statistics: {
calories?: number,
heart_rate_points?: number,
},
rowing_statistics: {
calories?: number,
distance?: number,
output?: {
average?: number,
best?: number,
total?: number,
},
resistance?: {
average?: number,
maximum?: number,
},
speed?: number,
stroke?: {
average?: number,
maximum?: number,
},
},
stride_statistics: {
calories?: number,
distance?: number,
incline?: {
average?: number,
maximum?: number,
},
output?: {
average?: number,
best?: number,
total?: number,
},
speed?: {
average?: number,
maximum?: number,
},
},
user_id?: number,
},
workoutEntity?: {
buffering?: number,
commercialCode?: string,
completion?: number,
contentDuration?: number,
contentGuid?: string,
dateDeleted?: number,
dateEnd?: number,
dateStart?: number,
duration?: number,
format?: string,
guid?: string,
output?: number,
rankingPlace?: number,
rankingTotal?: number,
stats?: record,
timeOffset?: number,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
userId?: number,
},
}POST /workouts/process 
Process workout - Internal use only
Request Body
{
rideIndex?: {
appversion: string,
avgcadence: number,
avgresistance: number,
classimage: string,
classname: string,
datecreated: number,
device: string,
dnf: bool,
finalrank: number,
incline: number,
instanceuuid?: string,
instructorname: string,
iscomplete: bool,
osversion: string,
rideid: number,
ridetype?: string,
source: string,
totalcalories: number,
totaldistance: number,
totalhrpoints: number,
totaloutput: number,
totalriders: number,
userid?: number,
},
rideIndexById?: {
appversion: string,
avgcadence: number,
avgheartrate: number,
avgresistance: number,
classimage: string,
classname: string,
device: string,
dnf: bool,
duration: number,
encore: bool,
finalrank: number,
incline: number,
instanceuuid?: string,
instructorname: string,
iscomplete: bool,
osversion: string,
rideid: number,
ridetype: string,
source: string,
totalcalories: number,
totaldistance: number,
totalhrpoints: number,
totaloutput: number,
totalriders: number,
userid: number,
},
segment?: {
activity_type: string,
bike_statistics: {
cadence?: number,
calories?: number,
distance?: number,
output?: {
average?: number,
best?: number,
total?: number,
},
resistance?: {
average?: number,
maximum?: number,
},
speed?: number,
},
class_length: number,
class_name: string,
content_id: string,
content_type: 'live' | 'vod' | 'encore' | 'freestyle',
email?: string,
equipment_type: 'bike' | 'fitpass' | 'reflect' | 'row' | 'stride',
first_name?: string,
fitpass_statistics: {
calories?: number,
heart_rate_points?: number,
},
instructor_id: number,
instructor_name: string,
last_name?: string,
metric_preference?: 'imperial' | 'metric',
music_genre: string,
place: number,
platform?: string,
reflect_statistics: {
calories?: number,
heart_rate_points?: number,
},
rowing_statistics: {
calories?: number,
distance?: number,
output?: {
average?: number,
best?: number,
total?: number,
},
resistance?: {
average?: number,
maximum?: number,
},
speed?: number,
stroke?: {
average?: number,
maximum?: number,
},
},
stride_statistics: {
calories?: number,
distance?: number,
incline?: {
average?: number,
maximum?: number,
},
output?: {
average?: number,
best?: number,
total?: number,
},
speed?: {
average?: number,
maximum?: number,
},
},
user_id?: number,
},
workoutEntity?: {
buffering?: number,
commercialCode?: string,
completion?: number,
contentDuration?: number,
contentGuid?: string,
dateDeleted?: number,
dateEnd?: number,
dateStart?: number,
duration?: number,
format?: string,
guid?: string,
output?: number,
rankingPlace?: number,
rankingTotal?: number,
stats?: record,
timeOffset?: number,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
userId?: number,
},
}