Nest Changelog
1.18.4
3/8/2023
1.19.0 PRE
3/6/2023
8 changed endpoints Collapse changed endpoints
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 Collapse 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, }, }, }