Nest Changelog
1.13.0
1/23/2023
1.14.0 PRE
1/30/2023
9 changed endpoints Collapse changed endpoints
POST /users 
Request Body
{
billingAddress: {
city: string,
country: {
code?: string,
},
postalCode: string,
region: {
code?: string,
},
streetLine1: string,
streetLine2: string,
},
birthdate: string,
captcha: {
token?: string,
},
commercial: {
code?: string,
},
dateTosAccepted: number,
dealer: {
id?: number,
},
email?: string,
firstName: string,
forcePasswordChange: bool,
gender: {
value?: 'm' | 'f' | 'o',
},
height: {
units?: 'in' | 'cm',
value?: number,
},
image: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName: string,
mongoId: string,
nickname: string,
parent: {
id?: number,
mongoId?: string,
},
password?: string,
phoneNumber: string,
purchaseHistory: List<{
- datePurchased?: number,
- name?: string,
- retailer?: {
id?: number,
},
- serialNumber?: string,
}>,
roles: List<string>,
tagline: string,
weight: {
units?: 'lb' | 'kg',
value?: number,
},
}POST /users 
Request Body
{
billingAddress: {
city: string,
country: {
code?: string,
},
postalCode: string,
region: {
code?: string,
},
streetLine1: string,
streetLine2: string,
},
birthdate: string,
captcha: {
token?: string,
},
commercial: {
code?: string,
},
dateTosAccepted: number,
dealer: {
id?: number,
},
email?: string,
firstName: string,
forcePasswordChange: bool,
gender: {
value?: 'm' | 'f' | 'o',
},
height: {
units?: 'in' | 'cm',
value?: number,
},
image: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName: string,
mongoId: string,
nickname: string,
parent: {
id?: number,
mongoId?: string,
},
password?: string,
phoneNumber: string,
purchaseHistory: List<{
+ datePurchased: number,
+ name: string,
+ retailer: {
id?: number,
},
+ serialNumber: string,
}>,
roles: List<string>,
tagline: string,
weight: {
units?: 'lb' | 'kg',
value?: number,
},
}PATCH /users/{userId} 
Edit this user
Request Body
{
billingAddress: {
city: string,
country: {
code?: string,
},
postalCode: string,
region: {
code?: string,
},
streetLine1: string,
streetLine2: string,
},
birthdate: string,
dateTosAccepted: number,
dealer: {
id?: number,
},
email: string,
firstName: string,
forcePasswordChange: bool,
gender: {
value?: 'm' | 'f' | 'o',
},
height: {
units?: 'in' | 'cm',
value?: number,
},
image: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName: string,
mongoId: string,
nickname: string,
parent: {
id?: number,
mongoId?: string,
},
phoneNumber: string,
purchaseHistory: List<{
- datePurchased?: number,
- name?: string,
- retailer?: {
id?: number,
},
- serialNumber?: string,
}>,
roles: List<string>,
tagline: string,
weight: {
units?: 'lb' | 'kg',
value?: number,
},
}PATCH /users/{userId} 
Edit this user
Request Body
{
billingAddress: {
city: string,
country: {
code?: string,
},
postalCode: string,
region: {
code?: string,
},
streetLine1: string,
streetLine2: string,
},
birthdate: string,
dateTosAccepted: number,
dealer: {
id?: number,
},
email: string,
firstName: string,
forcePasswordChange: bool,
gender: {
value?: 'm' | 'f' | 'o',
},
height: {
units?: 'in' | 'cm',
value?: number,
},
image: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName: string,
mongoId: string,
nickname: string,
parent: {
id?: number,
mongoId?: string,
},
phoneNumber: string,
purchaseHistory: List<{
+ datePurchased: number,
+ name: string,
+ retailer: {
id?: number,
},
+ serialNumber: string,
}>,
roles: List<string>,
tagline: string,
weight: {
units?: 'lb' | 'kg',
value?: number,
},
}POST /users/{userId}/family 
Request Body
{
billingAddress: {
city: string,
country: {
code?: string,
},
postalCode: string,
region: {
code?: string,
},
streetLine1: string,
streetLine2: string,
},
birthdate: string,
captcha: {
token?: string,
},
commercial: {
code?: string,
},
dateTosAccepted: number,
dealer: {
id?: number,
},
email?: string,
firstName: string,
forcePasswordChange: bool,
gender: {
value?: 'm' | 'f' | 'o',
},
height: {
units?: 'in' | 'cm',
value?: number,
},
image: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName: string,
mongoId: string,
nickname: string,
parent: {
id?: number,
mongoId?: string,
},
password?: string,
phoneNumber: string,
purchaseHistory: List<{
- datePurchased?: number,
- name?: string,
- retailer?: {
id?: number,
},
- serialNumber?: string,
}>,
roles: List<string>,
tagline: string,
weight: {
units?: 'lb' | 'kg',
value?: number,
},
}POST /users/{userId}/family 
Request Body
{
billingAddress: {
city: string,
country: {
code?: string,
},
postalCode: string,
region: {
code?: string,
},
streetLine1: string,
streetLine2: string,
},
birthdate: string,
captcha: {
token?: string,
},
commercial: {
code?: string,
},
dateTosAccepted: number,
dealer: {
id?: number,
},
email?: string,
firstName: string,
forcePasswordChange: bool,
gender: {
value?: 'm' | 'f' | 'o',
},
height: {
units?: 'in' | 'cm',
value?: number,
},
image: {
colors?: {
background?: {
hex?: string,
},
foreground?: {
hex?: string,
},
},
default: string,
initials?: string,
isPlaceholder?: bool,
large: string,
medium: string,
small: string,
url?: string,
},
lastName: string,
mongoId: string,
nickname: string,
parent: {
id?: number,
mongoId?: string,
},
password?: string,
phoneNumber: string,
purchaseHistory: List<{
+ datePurchased: number,
+ name: string,
+ retailer: {
id?: number,
},
+ serialNumber: string,
}>,
roles: List<string>,
tagline: string,
weight: {
units?: 'lb' | 'kg',
value?: number,
},
}POST /workouts/items 
Post a Workout
Request Body
{
- classLibrary: string,
content?: {
guid?: string,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
},
device?: {
appVersion?: string,
model?: string,
os?: string,
osVersion?: string,
},
events: List<string>,
peripherals?: List<{
firmwareVersion?: string,
guid?: string,
hardwareVersion?: string,
modelId?: string,
name?: string,
serialNO?: string,
type?: 'bike' | 'rower' | 'treadmill',
}>,
- productName: string,
ranking: {
place?: number,
total?: number,
},
stats?: List<{
classState?: 'warmup' | 'in-session' | 'overflow' | 'ended',
dateLoggedMs?: number,
output?: {
distance: number,
incrementalDistance: number,
joules: number,
RPM: number,
strokesPerMinute: number,
time500Meters: number,
watts: number,
},
peripheral?: {
guid: string,
incline: number,
resistance: number,
speed: number,
},
physiology?: {
calories: number,
heartRate: number,
hrPoints: number,
},
playbackState?: 'playing' | 'paused' | 'stopped' | 'buffering',
}>,
user?: {
id?: number,
},
}POST /workouts/items 
Post a Workout
Request Body
{
content?: {
guid?: string,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
},
device?: {
appVersion?: string,
model?: string,
os?: string,
osVersion?: string,
},
events: List<string>,
peripherals?: List<{
firmwareVersion?: string,
guid?: string,
hardwareVersion?: string,
modelId?: string,
name?: string,
serialNO?: string,
type?: 'bike' | 'rower' | 'treadmill',
}>,
ranking: {
place?: number,
total?: number,
},
stats?: List<{
classState?: 'warmup' | 'in-session' | 'overflow' | 'ended',
dateLoggedMs?: number,
output?: {
distance: number,
incrementalDistance: number,
joules: number,
RPM: number,
strokesPerMinute: number,
time500Meters: number,
watts: number,
},
peripheral?: {
guid: string,
incline: number,
resistance: number,
speed: number,
},
physiology?: {
calories: number,
heartRate: number,
hrPoints: number,
},
playbackState?: 'playing' | 'paused' | 'stopped' | 'buffering',
}>,
user?: {
id?: number,
},
}PUT /workouts/items/{guid} 
Put a Workout
Request Body
{
- classLibrary: string,
content?: {
guid?: string,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
},
device?: {
appVersion?: string,
model?: string,
os?: string,
osVersion?: string,
},
events: List<string>,
peripherals?: List<{
firmwareVersion?: string,
guid?: string,
hardwareVersion?: string,
modelId?: string,
name?: string,
serialNO?: string,
type?: 'bike' | 'rower' | 'treadmill',
}>,
- productName: string,
ranking: {
place?: number,
total?: number,
},
stats?: List<{
classState?: 'warmup' | 'in-session' | 'overflow' | 'ended',
dateLoggedMs?: number,
output?: {
distance: number,
incrementalDistance: number,
joules: number,
RPM: number,
strokesPerMinute: number,
time500Meters: number,
watts: number,
},
peripheral?: {
guid: string,
incline: number,
resistance: number,
speed: number,
},
physiology?: {
calories: number,
heartRate: number,
hrPoints: number,
},
playbackState?: 'playing' | 'paused' | 'stopped' | 'buffering',
}>,
user?: {
id?: number,
},
}PUT /workouts/items/{guid} 
Put a Workout
Request Body
{
content?: {
guid?: string,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
},
device?: {
appVersion?: string,
model?: string,
os?: string,
osVersion?: string,
},
events: List<string>,
peripherals?: List<{
firmwareVersion?: string,
guid?: string,
hardwareVersion?: string,
modelId?: string,
name?: string,
serialNO?: string,
type?: 'bike' | 'rower' | 'treadmill',
}>,
ranking: {
place?: number,
total?: number,
},
stats?: List<{
classState?: 'warmup' | 'in-session' | 'overflow' | 'ended',
dateLoggedMs?: number,
output?: {
distance: number,
incrementalDistance: number,
joules: number,
RPM: number,
strokesPerMinute: number,
time500Meters: number,
watts: number,
},
peripheral?: {
guid: string,
incline: number,
resistance: number,
speed: number,
},
physiology?: {
calories: number,
heartRate: number,
hrPoints: number,
},
playbackState?: 'playing' | 'paused' | 'stopped' | 'buffering',
}>,
user?: {
id?: number,
},
}POST /workouts/process 
Process workout
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,
},
workoutEntity?: {
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,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
userId?: number,
},
}POST /workouts/process 
Process workout
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,
},
workoutEntity?: {
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,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
userId?: number,
},
}GET /workouts/users/{userId}/items 
Get a list of workout summaries
Response Body
{
data: List<{
content?: {
description?: string,
duration?: number,
guid?: string,
image?: {
- default: string,
- large: string,
- medium: string,
- small: string,
- url?: string,
},
instructors?: List<{
id?: number,
name?: string,
}>,
legacy?: {
id?: number,
type?: 'reflect' | 'connect',
},
name?: string,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
},
dateEnd?: number,
dateStart?: number,
duration?: {
percentage?: number,
text?: string,
value?: number,
},
guid?: string,
output?: number,
ranking?: {
place?: number,
total?: number,
},
stats?: record,
- status?: 'new' | 'incomplete' | 'complete',
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total?: {
pages?: number,
rows?: number,
},
},
}GET /workouts/users/{userId}/items 
Get a list of workout summaries
Response Body
{
data: List<{
content?: {
description?: string,
duration?: number,
guid?: string,
image?: {
+ default?: string,
+ hd?: string,
+ portrait?: string,
+ sd?: string,
+ square?: string,
},
instructors?: List<{
id?: number,
name?: string,
}>,
legacy?: {
id?: number,
type?: 'reflect' | 'connect',
},
name?: string,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
},
dateEnd?: number,
dateStart?: number,
duration?: {
percentage?: number,
text?: string,
value?: number,
},
guid?: string,
output?: number,
ranking?: {
place?: number,
total?: number,
},
stats?: record,
+ status?: 'incomplete' | 'complete',
}>,
pagination: {
page?: number,
skip?: number,
take?: number,
total?: {
pages?: number,
rows?: number,
},
},
}GET /workouts/users/{userId}/aggregations 
Get workout aggregations for user
Response Body
{
data: {
furthestDistance?: number,
highestOutput?: number,
mostRecent?: {
content?: {
description?: string,
duration?: number,
guid?: string,
image?: {
- default: string,
- large: string,
- medium: string,
- small: string,
- url?: string,
},
instructors?: List<{
id?: number,
name?: string,
}>,
legacy?: {
id?: number,
type?: 'reflect' | 'connect',
},
name?: string,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
},
dateEnd?: number,
dateStart?: number,
duration?: {
percentage?: number,
text?: string,
value?: number,
},
guid?: string,
output?: number,
ranking?: {
place?: number,
total?: number,
},
stats?: record,
- status?: 'new' | 'incomplete' | 'complete',
},
personalBest?: {
content?: {
description?: string,
duration?: number,
guid?: string,
image?: {
- default: string,
- large: string,
- medium: string,
- small: string,
- url?: string,
},
instructors?: List<{
id?: number,
name?: string,
}>,
legacy?: {
id?: number,
type?: 'reflect' | 'connect',
},
name?: string,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
},
dateEnd?: number,
dateStart?: number,
duration?: {
percentage?: number,
text?: string,
value?: number,
},
guid?: string,
output?: number,
ranking?: {
place?: number,
total?: number,
},
stats?: record,
- status?: 'new' | 'incomplete' | 'complete',
},
totalClasses?: number,
totalDistance?: number,
totalDuration?: number,
},
}GET /workouts/users/{userId}/aggregations 
Get workout aggregations for user
Response Body
{
data: {
furthestDistance?: number,
highestOutput?: number,
mostRecent?: {
content?: {
description?: string,
duration?: number,
guid?: string,
image?: {
+ default?: string,
+ hd?: string,
+ portrait?: string,
+ sd?: string,
+ square?: string,
},
instructors?: List<{
id?: number,
name?: string,
}>,
legacy?: {
id?: number,
type?: 'reflect' | 'connect',
},
name?: string,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
},
dateEnd?: number,
dateStart?: number,
duration?: {
percentage?: number,
text?: string,
value?: number,
},
guid?: string,
output?: number,
ranking?: {
place?: number,
total?: number,
},
stats?: record,
+ status?: 'incomplete' | 'complete',
},
personalBest?: {
content?: {
description?: string,
duration?: number,
guid?: string,
image?: {
+ default?: string,
+ hd?: string,
+ portrait?: string,
+ sd?: string,
+ square?: string,
},
instructors?: List<{
id?: number,
name?: string,
}>,
legacy?: {
id?: number,
type?: 'reflect' | 'connect',
},
name?: string,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
},
dateEnd?: number,
dateStart?: number,
duration?: {
percentage?: number,
text?: string,
value?: number,
},
guid?: string,
output?: number,
ranking?: {
place?: number,
total?: number,
},
stats?: record,
+ status?: 'incomplete' | 'complete',
},
totalClasses?: number,
totalDistance?: number,
totalDuration?: number,
},
}GET /workouts/items/{guid}/summary 
Get summary view of a workout
Response Body
{
data: {
content?: {
description?: string,
duration?: number,
guid?: string,
image?: {
- default: string,
- large: string,
- medium: string,
- small: string,
- url?: string,
},
instructors?: List<{
id?: number,
name?: string,
}>,
legacy?: {
id?: number,
type?: 'reflect' | 'connect',
},
name?: string,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
},
dateEnd?: number,
dateStart?: number,
duration?: {
percentage?: number,
text?: string,
value?: number,
},
guid?: string,
output?: number,
ranking?: {
place?: number,
total?: number,
},
stats?: record,
- status?: 'new' | 'incomplete' | 'complete',
user?: {
id?: number,
},
},
}GET /workouts/items/{guid}/summary 
Get summary view of a workout
Response Body
{
data: {
content?: {
description?: string,
duration?: number,
guid?: string,
image?: {
+ default?: string,
+ hd?: string,
+ portrait?: string,
+ sd?: string,
+ square?: string,
},
instructors?: List<{
id?: number,
name?: string,
}>,
legacy?: {
id?: number,
type?: 'reflect' | 'connect',
},
name?: string,
type?: 'live' | 'vod' | 'encore' | 'freestyle',
},
dateEnd?: number,
dateStart?: number,
duration?: {
percentage?: number,
text?: string,
value?: number,
},
guid?: string,
output?: number,
ranking?: {
place?: number,
total?: number,
},
stats?: record,
+ status?: 'incomplete' | 'complete',
user?: {
id?: number,
},
},
}