Nest Changelog

1.13.0

1/23/2023

1.14.0 PRE

1/30/2023

9 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, }, }, }
WORK IN PROGRESS