Nest Changelog

1.18.4

3/8/2023

1.19.0 PRE

3/6/2023

8 changed endpoints

GET /partners

Get a list of partners

Guard: loggedIn

GET /partners

Get a list of partners

Guard: loggedIn, service

GET /collections/items

List collections. Cached every 10 minutes.

Response Body
{
  data: List<{
    available?: {
      end?: number,
      start?: number,
    },
    badge?: {
      guid?: string,
    },
    classCount?: number,
    countries?: List<{
      code?: string,
-     sortOrder: number,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    durationDays?: number,
    episodeWord?: string,
    guid?: string,
    images?: {
      default?: string,
      hd?: string,
      portrait?: string,
      sd?: string,
      square?: string,
    },
    medium?: 'reflect' | 'standard',
    name?: string,
    planFamily?: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free',
    sortOrder?: number,
    totalCount?: number,
-   type?: 'generic' | 'series' | 'challenge' | 'program',

updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }>, pagination: { page?: number, skip?: number, take?: number, total?: { pages?: number, rows?: number, }, }, }

GET /collections/items

List collections. Does not return user-favorites. Cache refresh: 10 minutes.

Response Body
{
  data: List<{
    available?: {
      end?: number,
      start?: number,
    },
    badge?: {
      guid?: string,
    },
    classCount?: number,
    countries?: List<{
      code?: string,

}>, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, description?: string, durationDays?: number, episodeWord?: string, guid?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, medium?: 'reflect' | 'standard', name?: string, planFamily?: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free', sortOrder?: number, totalCount?: number,

+ type?: 'generic' | 'series' | 'challenge' | 'program' | 'favorite', updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }>, pagination: { page?: number, skip?: number, take?: number, total?: { pages?: number, rows?: number, }, }, }

POST /collections/items

Create a new Collection

Request Body
{
  available?: {
    end?: number,
    start?: number,
  },
  badge?: {
    guid?: string,
  },
  countries?: List<{
    code?: string,
-   sortOrder: number,
  }>,
  description?: string,
  durationDays?: number,
  episodeWord?: string,
  medium?: 'reflect' | 'standard',
  name?: string,
  planFamily?: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free',
  schedule?: List<{
    guid?: string,
    sortOrder?: number,
  }>,
  sortOrder?: number,
  tags?: List<{
    value?: string,
  }>,
  totalCount?: number,
- type?: 'generic' | 'series' | 'challenge' | 'program',

visibility?: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }
Response Body
{
  data: {
    available?: {
      end?: number,
      start?: number,
    },
    badge?: {
      guid?: string,
    },
    countries?: List<{
      code?: string,
-     sortOrder: number,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    durationDays?: number,
    episodeWord?: string,
    guid?: string,
    images?: {
      default?: string,
      hd?: string,
      portrait?: string,
      sd?: string,
      square?: string,
    },
    medium?: 'reflect' | 'standard',
    name?: string,
    planFamily?: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free',
    schedule?: List<{

guid?: string, sortOrder?: number, }>, sortOrder?: number, tags?: List<{ description?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, modality?: 'ride' | 'row' | 'run' | 'off' | 'all', text?: string, type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus', value?: string, }>, totalCount?: number, - type?: 'generic' | 'series' | 'challenge' | 'program',

updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }, }

POST /collections/items

Create a new Collection

Request Body
{
  available?: {
    end?: number,
    start?: number,
  },
  badge?: {
    guid?: string,
  },
  countries?: List<{
    code?: string,

}>, description?: string, durationDays?: number, episodeWord?: string, medium?: 'reflect' | 'standard', name?: string, planFamily?: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free', schedule?: List<{ guid?: string, sortOrder?: number, }>, sortOrder?: number, tags?: List<{ value?: string, }>, totalCount?: number,

+ type?: 'generic' | 'series' | 'challenge' | 'program' | 'favorite', visibility?: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }
Response Body
{
  data: {
    available?: {
      end?: number,
      start?: number,
    },
    badge?: {
      guid?: string,
    },
    countries?: List<{
      code?: string,

}>, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, description?: string, durationDays?: number, episodeWord?: string, guid?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, medium?: 'reflect' | 'standard', name?: string, planFamily?: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free', schedule?: List<{ + contentGuid?: string, guid?: string, sortOrder?: number, }>, sortOrder?: number, tags?: List<{ description?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, modality?: 'ride' | 'row' | 'run' | 'off' | 'all', text?: string, type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus', value?: string, }>, totalCount?: number,

+ type?: 'generic' | 'series' | 'challenge' | 'program' | 'favorite', updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }, }

GET /collections/items/{guid}

Get a collection by guid. Cached every 10 minutes.

Response Body
{
  data: {
    available?: {
      end?: number,
      start?: number,
    },
    badge?: {
      guid?: string,
    },
    countries?: List<{
      code?: string,
-     sortOrder: number,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    durationDays?: number,
    episodeWord?: string,
    guid?: string,
    images?: {
      default?: string,
      hd?: string,
      portrait?: string,
      sd?: string,
      square?: string,
    },
    medium?: 'reflect' | 'standard',
    name?: string,
    planFamily?: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free',
    schedule?: List<{

guid?: string, sortOrder?: number, }>, sortOrder?: number, tags?: List<{ description?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, modality?: 'ride' | 'row' | 'run' | 'off' | 'all', text?: string, type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus', value?: string, }>, totalCount?: number, - type?: 'generic' | 'series' | 'challenge' | 'program',

updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }, }

GET /collections/items/{guid}

Get a collection by guid. Cached every 10 minutes.

Response Body
{
  data: {
    available?: {
      end?: number,
      start?: number,
    },
    badge?: {
      guid?: string,
    },
    countries?: List<{
      code?: string,

}>, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, description?: string, durationDays?: number, episodeWord?: string, guid?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, medium?: 'reflect' | 'standard', name?: string, planFamily?: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free', schedule?: List<{ + contentGuid?: string, guid?: string, sortOrder?: number, }>, sortOrder?: number, tags?: List<{ description?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, modality?: 'ride' | 'row' | 'run' | 'off' | 'all', text?: string, type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus', value?: string, }>, totalCount?: number,

+ type?: 'generic' | 'series' | 'challenge' | 'program' | 'favorite', updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }, }

PATCH /collections/items/{guid}

Update a Collection

Request Body
{
  available: {
    end?: number,
    start?: number,
  },
  badge: {
    guid?: string,
  },
- countries: List<{
-   code?: string,
-   sortOrder: number,
- }>,
  description: string,
  durationDays: number,
  episodeWord: string,
  name: string,
- planFamily: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free',
  schedule: List<{
    guid?: string,
    sortOrder?: number,
  }>,
  sortOrder: number,
  tags: List<{
    value?: string,
  }>,
  totalCount: number,
- type: 'generic' | 'series' | 'challenge' | 'program',

visibility: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }
Response Body
{
  data: {
    available?: {
      end?: number,
      start?: number,
    },
    badge?: {
      guid?: string,
    },
    countries?: List<{
      code?: string,
-     sortOrder: number,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    durationDays?: number,
    episodeWord?: string,
    guid?: string,
    images?: {
      default?: string,
      hd?: string,
      portrait?: string,
      sd?: string,
      square?: string,
    },
    medium?: 'reflect' | 'standard',
    name?: string,
    planFamily?: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free',
    schedule?: List<{

guid?: string, sortOrder?: number, }>, sortOrder?: number, tags?: List<{ description?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, modality?: 'ride' | 'row' | 'run' | 'off' | 'all', text?: string, type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus', value?: string, }>, totalCount?: number, - type?: 'generic' | 'series' | 'challenge' | 'program',

updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }, }

PATCH /collections/items/{guid}

Update a Collection

Request Body
{
  available: {
    end?: number,
    start?: number,
  },
  badge: {
    guid?: string,
  },

description: string, durationDays: number, episodeWord: string, name: string,

schedule: List<{ guid?: string, sortOrder?: number, }>, sortOrder: number, tags: List<{ value?: string, }>, totalCount: number,

+ type: 'generic' | 'series' | 'challenge' | 'program' | 'favorite', visibility: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }
Response Body
{
  data: {
    available?: {
      end?: number,
      start?: number,
    },
    badge?: {
      guid?: string,
    },
    countries?: List<{
      code?: string,

}>, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, description?: string, durationDays?: number, episodeWord?: string, guid?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, medium?: 'reflect' | 'standard', name?: string, planFamily?: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free', schedule?: List<{ + contentGuid?: string, guid?: string, sortOrder?: number, }>, sortOrder?: number, tags?: List<{ description?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, modality?: 'ride' | 'row' | 'run' | 'off' | 'all', text?: string, type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus', value?: string, }>, totalCount?: number,

+ type?: 'generic' | 'series' | 'challenge' | 'program' | 'favorite', updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }, }

PUT /collections/items/{guid}/schedule/{scheduleGuid}

Add a content schedule item to a collection

Response Body
{
  data: {
    available?: {
      end?: number,
      start?: number,
    },
    badge?: {
      guid?: string,
    },
    countries?: List<{
      code?: string,
-     sortOrder: number,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    durationDays?: number,
    episodeWord?: string,
    guid?: string,
    images?: {
      default?: string,
      hd?: string,
      portrait?: string,
      sd?: string,
      square?: string,
    },
    medium?: 'reflect' | 'standard',
    name?: string,
    planFamily?: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free',
    sortOrder?: number,
    totalCount?: number,
-   type?: 'generic' | 'series' | 'challenge' | 'program',

updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }, }

PUT /collections/items/{guid}/schedule/{scheduleGuid}

Add a content schedule item to a collection

Response Body
{
  data: {
    available?: {
      end?: number,
      start?: number,
    },
    badge?: {
      guid?: string,
    },
    countries?: List<{
      code?: string,

}>, createdBy?: { id?: number, }, dateCreated?: number, dateUpdated?: number, description?: string, durationDays?: number, episodeWord?: string, guid?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, medium?: 'reflect' | 'standard', name?: string, planFamily?: 'spinco' | 'premier' | 'select' | 'flex' | 'fitpass' | 'lite' | 'choice' | 'free', sortOrder?: number, totalCount?: number,

+ type?: 'generic' | 'series' | 'challenge' | 'program' | 'favorite', updatedBy?: { id?: number, }, visibility?: 'public' | 'unlisted' | 'private' | 'draft' | 'trash', }, }

GET /content/library

Search for content in the Library

Response Body
{
  data: List<{
    catalog?: {
      audio?: 'labelMusic' | 'royaltyFree' | 'userProvided',
      code?: string,
      hasMusic?: bool,
    },
    contentGuid?: string,
    countries?: List<{
      code?: string,
    }>,
    dateLive?: number,
    description?: string,
    format?: {
      code?: string,
    },
    images?: {
      default?: string,
      hd?: string,
      portrait?: string,
      sd?: string,
      square?: string,
    },
    instructors?: List<{
      id?: number,
      images?: {
        default?: string,
        hd?: string,
        portrait?: string,
        sd?: string,
        square?: string,
      },
      name?: string,
    }>,
    legacy?: {
      id?: number,
    },
    length?: number,
    medium?: 'reflect' | 'standard',
    name?: string,
    playback?: {
      type?: 'hls' | 'dash',
      url?: string,
    },
    playlistId?: number,
    scheduleGuid?: string,
    status?: 'draft' | 'published' | 'trash',
    studios?: List<{
      id?: number,
      name?: string,
    }>,
    tags?: List<{
      images?: {
        default?: string,
        hd?: string,
        portrait?: string,
        sd?: string,
        square?: string,
      },
      text?: string,
      type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus',
      value?: string,
    }>,
    type?: 'live' | 'vod' | 'encore' | 'rebroadcast',

}>, embedded: { aggregations?: { durations?: List<{ count?: number, text?: string, value?: number, }>, instructors?: List<{ id?: number, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, name?: string, }>, tags?: List<{ buckets?: List<{ count?: number, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, text?: string, value?: string, }>, value?: string, }>, }, }, pagination: { page?: number, skip?: number, take?: number, total?: { pages?: number, rows?: number, }, }, }

GET /content/library

Search for content in the Library

Response Body
{
  data: List<{
    catalog?: {
      audio?: 'labelMusic' | 'royaltyFree' | 'userProvided',
      code?: string,
      hasMusic?: bool,
    },
    contentGuid?: string,
    countries?: List<{
      code?: string,
    }>,
    dateLive?: number,
    description?: string,
    format?: {
      code?: string,
    },
    images?: {
      default?: string,
      hd?: string,
      portrait?: string,
      sd?: string,
      square?: string,
    },
    instructors?: List<{
      id?: number,
      images?: {
        default?: string,
        hd?: string,
        portrait?: string,
        sd?: string,
        square?: string,
      },
      name?: string,
    }>,
    legacy?: {
      id?: number,
    },
    length?: number,
    medium?: 'reflect' | 'standard',
    name?: string,
    playback?: {
      type?: 'hls' | 'dash',
      url?: string,
    },
    playlistId?: number,
    scheduleGuid?: string,
    status?: 'draft' | 'published' | 'trash',
    studios?: List<{
      id?: number,
      name?: string,
    }>,
    tags?: List<{
      images?: {
        default?: string,
        hd?: string,
        portrait?: string,
        sd?: string,
        square?: string,
      },
      text?: string,
      type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus',
      value?: string,
    }>,
    type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
+   userData?: {
+     favorite?: {
+       content?: bool,
+     },
+   },
  }>,
  embedded: {
    aggregations?: {
      durations?: List<{
        count?: number,
        text?: string,
        value?: number,
      }>,
      instructors?: List<{
        id?: number,
        images?: {
          default?: string,
          hd?: string,
          portrait?: string,
          sd?: string,
          square?: string,
        },
        name?: string,
      }>,
      tags?: List<{
        buckets?: List<{
          count?: number,
          images?: {
            default?: string,
            hd?: string,
            portrait?: string,
            sd?: string,
            square?: string,
          },
          text?: string,
          value?: string,
        }>,
        value?: string,
      }>,
    },
  },
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total?: {
      pages?: number,
      rows?: 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?: 'encore' | 'freestyle' | 'live' | 'vod',

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, 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, type?: 'live' | 'vod' | 'encore' | 'freestyle', userId?: number, }, }
3 added endpoints
Added endpoints

GET /favorites/{userId}/items

List users favorite content items.

Guard: admin, customerService, self

Response Body
{
  data: List<{
    content?: {
      format?: {
        code?: string,
      },
      guid?: string,
      images?: {
        default?: string,
        hd?: string,
        portrait?: string,
        sd?: string,
        square?: string,
      },
      instructors?: List<{
        bio?: string,
        createdBy?: {
          id?: number,
        },
        dateCreated?: number,
        dateUpdated?: number,
        flags?: List<'connect' | 'reflect' | 'fitnation' | 'celebrity'>,
        id?: number,
        images?: {
          default?: string,
          hd?: string,
          portrait?: string,
          sd?: string,
          square?: string,
        },
        name?: string,
        status?: 'active' | 'inactive',
        studio?: {
          id?: number,
        },
        updatedBy?: {
          id?: number,
        },
        user?: {
          id?: number,
        },
      }>,
      medium?: 'reflect' | 'standard',
      name?: string,
      scheduleGuid?: string,
      status?: 'draft' | 'published' | 'trash',
      tags?: List<{
        description?: string,
        images?: {
          default?: string,
          hd?: string,
          portrait?: string,
          sd?: string,
          square?: string,
        },
        modality?: 'ride' | 'row' | 'run' | 'off' | 'all',
        text?: string,
        type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'healthFocus' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus',
        value?: string,
      }>,
    },
    dateCreated?: number,
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total?: {
      pages?: number,
      rows?: number,
    },
  },
}

DELETE /favorites/{userId}/items/{contentGuid}

Remove a content item from favorites via contentGuid

Guard: admin, customerService, self

PUT /favorites/{userId}/items/{scheduleGuid}

Add content item to favorites via scheduleGuid

Guard: admin, customerService, self

Request Body
{
  medium: 'reflect' | 'standard',
}
WORK IN PROGRESS