Nest Changelog

1.40.1

9/6/2023

1.41.0 PRE

9/12/2023

9 changed endpoints

DELETE /redis/{key}

Clear redis by cache key. Admin only.

Guard: admin

DELETE /redis/{key}

Clear redis by cache key. Admin only.

Guard: admin, service

GET /users/{userId}/strength-workouts/items

Get strength workout summaries for a user

Response Body
{
  data: List<{

dateEnd?: number, dateStart?: number, guid?: string, movementStats?: List<{ interval?: bool, movement?: { guid?: string, name?: string, }, setStats?: List<{ calories?: number, completed?: bool, duration?: number, heartRate?: number, number?: number, power?: number, reps?: { completed?: number, planned?: number, }, resistanceMode?: 'standard' | 'concentric' | 'eccentric' | 'isokinetic' | 'chain', rest?: number, tension?: number, volume?: number, }>, totalStats?: { calories?: number, duration?: number, heartRate?: number, power?: number, reps?: { completed?: number, planned?: number, }, rest?: number, sets?: number, tension?: number, volume?: number, }, }>, status?: 'incomplete' | 'complete', user?: { id?: number, }, workoutStats?: { calories?: number, duration?: number, heartRate?: number, power?: number, reps?: { completed?: number, planned?: number, }, rest?: number, sets?: number, tension?: number, volume?: number, }, }>, pagination: { page?: number, skip?: number, take?: number, total?: { pages?: number, rows?: number, }, }, }

GET /users/{userId}/strength-workouts/items

Get strength workout summaries for a user

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,
+     }>,
+     name?: string,
+   },
    dateEnd?: number,
    dateStart?: number,
    guid?: string,
    movementStats?: List<{
      interval?: bool,
      movement?: {
        guid?: string,
        name?: string,
      },
      setStats?: List<{
        calories?: number,
        completed?: bool,
        duration?: number,
        heartRate?: number,
        number?: number,
        power?: number,
        reps?: {
          completed?: number,
          planned?: number,
        },
        resistanceMode?: 'standard' | 'concentric' | 'eccentric' | 'isokinetic' | 'chain',
        rest?: number,
        tension?: number,
        volume?: number,
      }>,
      totalStats?: {
        calories?: number,
        duration?: number,
        heartRate?: number,
        power?: number,
        reps?: {
          completed?: number,
          planned?: number,
        },
        rest?: number,
        sets?: number,
        tension?: number,
        volume?: number,
      },
    }>,
    status?: 'incomplete' | 'complete',
    user?: {
      id?: number,
    },
    workoutStats?: {
      calories?: number,
      duration?: number,
      heartRate?: number,
      power?: number,
      reps?: {
        completed?: number,
        planned?: number,
      },
      rest?: number,
      sets?: number,
      tension?: number,
      volume?: number,
    },
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total?: {
      pages?: number,
      rows?: number,
    },
  },
}

GET /users/{userId}/strength-workouts/aggregations

Get strength workout aggregations for a user

Response Body
{
  data: {
    mostRecent?: {

dateEnd?: number, dateStart?: number, guid?: string, movementStats?: List<{ interval?: bool, movement?: { guid?: string, name?: string, }, setStats?: List<{ calories?: number, completed?: bool, duration?: number, heartRate?: number, number?: number, power?: number, reps?: { completed?: number, planned?: number, }, resistanceMode?: 'standard' | 'concentric' | 'eccentric' | 'isokinetic' | 'chain', rest?: number, tension?: number, volume?: number, }>, totalStats?: { calories?: number, duration?: number, heartRate?: number, power?: number, reps?: { completed?: number, planned?: number, }, rest?: number, sets?: number, tension?: number, volume?: number, }, }>, status?: 'incomplete' | 'complete', user?: { id?: number, }, workoutStats?: { calories?: number, duration?: number, heartRate?: number, power?: number, reps?: { completed?: number, planned?: number, }, rest?: number, sets?: number, tension?: number, volume?: number, }, }, personalBest?: {

dateEnd?: number, dateStart?: number, guid?: string, movementStats?: List<{ interval?: bool, movement?: { guid?: string, name?: string, }, setStats?: List<{ calories?: number, completed?: bool, duration?: number, heartRate?: number, number?: number, power?: number, reps?: { completed?: number, planned?: number, }, resistanceMode?: 'standard' | 'concentric' | 'eccentric' | 'isokinetic' | 'chain', rest?: number, tension?: number, volume?: number, }>, totalStats?: { calories?: number, duration?: number, heartRate?: number, power?: number, reps?: { completed?: number, planned?: number, }, rest?: number, sets?: number, tension?: number, volume?: number, }, }>, status?: 'incomplete' | 'complete', user?: { id?: number, }, workoutStats?: { calories?: number, duration?: number, heartRate?: number, power?: number, reps?: { completed?: number, planned?: number, }, rest?: number, sets?: number, tension?: number, volume?: number, }, }, totalDuration?: number, totalReps?: number, totalTimeUnderTension?: number, totalWorkouts?: number, volume?: { max?: number, total?: number, }, }, }

GET /users/{userId}/strength-workouts/aggregations

Get strength workout aggregations for a user

Response Body
{
  data: {
    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,
+       }>,
+       name?: string,
+     },
      dateEnd?: number,
      dateStart?: number,
      guid?: string,
      movementStats?: List<{
        interval?: bool,
        movement?: {
          guid?: string,
          name?: string,
        },
        setStats?: List<{
          calories?: number,
          completed?: bool,
          duration?: number,
          heartRate?: number,
          number?: number,
          power?: number,
          reps?: {
            completed?: number,
            planned?: number,
          },
          resistanceMode?: 'standard' | 'concentric' | 'eccentric' | 'isokinetic' | 'chain',
          rest?: number,
          tension?: number,
          volume?: number,
        }>,
        totalStats?: {
          calories?: number,
          duration?: number,
          heartRate?: number,
          power?: number,
          reps?: {
            completed?: number,
            planned?: number,
          },
          rest?: number,
          sets?: number,
          tension?: number,
          volume?: number,
        },
      }>,
      status?: 'incomplete' | 'complete',
      user?: {
        id?: number,
      },
      workoutStats?: {
        calories?: number,
        duration?: number,
        heartRate?: number,
        power?: number,
        reps?: {
          completed?: number,
          planned?: number,
        },
        rest?: number,
        sets?: number,
        tension?: number,
        volume?: number,
      },
    },
    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,
+       }>,
+       name?: string,
+     },
      dateEnd?: number,
      dateStart?: number,
      guid?: string,
      movementStats?: List<{
        interval?: bool,
        movement?: {
          guid?: string,
          name?: string,
        },
        setStats?: List<{
          calories?: number,
          completed?: bool,
          duration?: number,
          heartRate?: number,
          number?: number,
          power?: number,
          reps?: {
            completed?: number,
            planned?: number,
          },
          resistanceMode?: 'standard' | 'concentric' | 'eccentric' | 'isokinetic' | 'chain',
          rest?: number,
          tension?: number,
          volume?: number,
        }>,
        totalStats?: {
          calories?: number,
          duration?: number,
          heartRate?: number,
          power?: number,
          reps?: {
            completed?: number,
            planned?: number,
          },
          rest?: number,
          sets?: number,
          tension?: number,
          volume?: number,
        },
      }>,
      status?: 'incomplete' | 'complete',
      user?: {
        id?: number,
      },
      workoutStats?: {
        calories?: number,
        duration?: number,
        heartRate?: number,
        power?: number,
        reps?: {
          completed?: number,
          planned?: number,
        },
        rest?: number,
        sets?: number,
        tension?: number,
        volume?: number,
      },
    },
    totalDuration?: number,
    totalReps?: number,
    totalTimeUnderTension?: number,
    totalWorkouts?: number,
    volume?: {
      max?: number,
      total?: number,
    },
  },
}

GET /strength-workouts/items/{guid}/summary

Response Body
{
  data: {

dateEnd?: number, dateStart?: number, guid?: string, movementStats?: List<{ interval?: bool, movement?: { guid?: string, name?: string, }, setStats?: List<{ calories?: number, completed?: bool, duration?: number, heartRate?: number, number?: number, power?: number, reps?: { completed?: number, planned?: number, }, resistanceMode?: 'standard' | 'concentric' | 'eccentric' | 'isokinetic' | 'chain', rest?: number, tension?: number, volume?: number, }>, totalStats?: { calories?: number, duration?: number, heartRate?: number, power?: number, reps?: { completed?: number, planned?: number, }, rest?: number, sets?: number, tension?: number, volume?: number, }, }>, status?: 'incomplete' | 'complete', user?: { id?: number, }, workoutStats?: { calories?: number, duration?: number, heartRate?: number, power?: number, reps?: { completed?: number, planned?: number, }, rest?: number, sets?: number, tension?: number, volume?: number, }, }, }

GET /strength-workouts/items/{guid}/summary

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,
+     }>,
+     name?: string,
+   },
    dateEnd?: number,
    dateStart?: number,
    guid?: string,
    movementStats?: List<{
      interval?: bool,
      movement?: {
        guid?: string,
        name?: string,
      },
      setStats?: List<{
        calories?: number,
        completed?: bool,
        duration?: number,
        heartRate?: number,
        number?: number,
        power?: number,
        reps?: {
          completed?: number,
          planned?: number,
        },
        resistanceMode?: 'standard' | 'concentric' | 'eccentric' | 'isokinetic' | 'chain',
        rest?: number,
        tension?: number,
        volume?: number,
      }>,
      totalStats?: {
        calories?: number,
        duration?: number,
        heartRate?: number,
        power?: number,
        reps?: {
          completed?: number,
          planned?: number,
        },
        rest?: number,
        sets?: number,
        tension?: number,
        volume?: number,
      },
    }>,
    status?: 'incomplete' | 'complete',
    user?: {
      id?: number,
    },
    workoutStats?: {
      calories?: number,
      duration?: number,
      heartRate?: number,
      power?: number,
      reps?: {
        completed?: number,
        planned?: number,
      },
      rest?: number,
      sets?: number,
      tension?: number,
      volume?: number,
    },
  },
}

GET /content/items

Admin only. Get list of content items.

Response Body
{
  data: List<{
    catalog?: {
      code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
    },
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    duration?: number,
    featuredRow?: string,

format?: { code?: string, }, guid?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, instructors?: List<{ id?: number, name?: string, precedence?: number, }>, keywords?: string, medium?: 'reflect' | 'standard' | 'strength', mediumLinked?: { guid?: string, }, name?: string, playlist?: { id?: number, }, schedule?: List<{ available?: { end?: number, live?: number, start?: number, }, content?: { guid?: string, }, guid?: string, legacy?: { id?: number, type?: 'reflect' | 'connect', }, playback?: List<{ type?: 'hls' | 'dash', url?: string, }>, type?: 'live' | 'vod' | 'encore' | 'rebroadcast', }>, sortOrder?: number, sourceUrl?: string, sourceVideo?: { type?: 'hls' | 'dash', url?: string, }, status?: 'draft' | 'published', studios?: List<{ id?: number, name?: string, precedence?: number, }>, tags?: List<{ images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, modality?: 'ride' | 'row' | 'run' | 'off' | 'all' | 'ellipse' | 'lift', translations?: record, type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus' | 'muscleGroup', value?: string, }>, updatedBy?: { id?: number, }, videoLength?: { id?: number, name?: string, value?: number, }, videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted' | 'processingFailed', }>, pagination: { page?: number, skip?: number, take?: number, total?: { pages?: number, rows?: number, }, }, }

GET /content/items

Admin only. Get list of content items.

Response Body
{
  data: List<{
    catalog?: {
      code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
    },
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    duration?: number,
    featuredRow?: string,
+   feedFm?: {
+     backupStation?: {
+       guid?: string,
+     },
+     playbackStation?: {
+       guid?: string,
+       type?: 'firstplay' | 'replay' | 'normal',
+     },
+     primaryStation?: {
+       guid?: string,
+     },
+     stationStatus?: 'notRequested' | 'requested' | 'testRequested' | 'cancelled' | 'active' | 'testActive',
+     stationType?: 'firstplay' | 'replay' | 'normal',
+   },
    format?: {
      code?: string,
    },
    guid?: string,
    images?: {
      default?: string,
      hd?: string,
      portrait?: string,
      sd?: string,
      square?: string,
    },
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    keywords?: string,
    medium?: 'reflect' | 'standard' | 'strength',
    mediumLinked?: {
      guid?: string,
    },
    name?: string,
    playlist?: {
      id?: number,
    },
    schedule?: List<{
      available?: {
        end?: number,
        live?: number,
        start?: number,
      },
      content?: {
        guid?: string,
      },
      guid?: string,
      legacy?: {
        id?: number,
        type?: 'reflect' | 'connect',
      },
      playback?: List<{
        type?: 'hls' | 'dash',
        url?: string,
      }>,
      type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
    }>,
    sortOrder?: number,
    sourceUrl?: string,
    sourceVideo?: {
      type?: 'hls' | 'dash',
      url?: string,
    },
    status?: 'draft' | 'published',
    studios?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    tags?: List<{
      images?: {
        default?: string,
        hd?: string,
        portrait?: string,
        sd?: string,
        square?: string,
      },
      modality?: 'ride' | 'row' | 'run' | 'off' | 'all' | 'ellipse' | 'lift',
      translations?: record,
      type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus' | 'muscleGroup',
      value?: string,
    }>,
    updatedBy?: {
      id?: number,
    },
    videoLength?: {
      id?: number,
      name?: string,
      value?: number,
    },
    videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted' | 'processingFailed',
  }>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total?: {
      pages?: number,
      rows?: number,
    },
  },
}

POST /content/items

Create a content item

Request Body
{
  catalog?: {
    code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
  },
  countries?: List<{
    code?: string,
  }>,
  description?: string,
  featuredRow?: string,

format?: { code?: string, }, instructors?: List<{ id?: number, precedence?: number, }>, medium?: 'reflect' | 'standard' | 'strength', mediumLinked: { guid?: string, }, name?: string, sortOrder?: number, status?: 'draft' | 'published', studios?: List<{ id?: number, precedence?: number, }>, tags?: List<{ value?: string, }>, videoLength?: { id?: number, }, }
Response Body
{
  data: {
    catalog?: {
      code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
    },
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    duration?: number,
    featuredRow?: string,

format?: { code?: string, }, guid?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, instructors?: List<{ id?: number, name?: string, precedence?: number, }>, keywords?: string, medium?: 'reflect' | 'standard' | 'strength', mediumLinked?: { guid?: string, }, name?: string, playlist?: { id?: number, }, schedule?: List<{ available?: { end?: number, live?: number, start?: number, }, content?: { guid?: string, }, guid?: string, legacy?: { id?: number, type?: 'reflect' | 'connect', }, playback?: List<{ type?: 'hls' | 'dash', url?: string, }>, type?: 'live' | 'vod' | 'encore' | 'rebroadcast', }>, sortOrder?: number, sourceUrl?: string, sourceVideo?: { type?: 'hls' | 'dash', url?: string, }, status?: 'draft' | 'published', studios?: List<{ id?: number, name?: string, precedence?: number, }>, tags?: List<{ images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, modality?: 'ride' | 'row' | 'run' | 'off' | 'all' | 'ellipse' | 'lift', translations?: record, type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus' | 'muscleGroup', value?: string, }>, updatedBy?: { id?: number, }, videoLength?: { id?: number, name?: string, value?: number, }, videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted' | 'processingFailed', }, }

POST /content/items

Create a content item

Request Body
{
  catalog?: {
    code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
  },
  countries?: List<{
    code?: string,
  }>,
  description?: string,
  featuredRow?: string,
+ feedFm: {
+   backupStation?: {
+     guid?: string,
+   },
+   playbackStation?: {
+     guid?: string,
+     type?: 'firstplay' | 'replay' | 'normal',
+   },
+   primaryStation?: {
+     guid?: string,
+   },
+   stationStatus?: 'notRequested' | 'requested' | 'testRequested' | 'cancelled' | 'active' | 'testActive',
+   stationType?: 'firstplay' | 'replay' | 'normal',
+ },
  format?: {
    code?: string,
  },
  instructors?: List<{
    id?: number,
    precedence?: number,
  }>,
  medium?: 'reflect' | 'standard' | 'strength',
  mediumLinked: {
    guid?: string,
  },
  name?: string,
  sortOrder?: number,
  status?: 'draft' | 'published',
  studios?: List<{
    id?: number,
    precedence?: number,
  }>,
  tags?: List<{
    value?: string,
  }>,
  videoLength?: {
    id?: number,
  },
}
Response Body
{
  data: {
    catalog?: {
      code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
    },
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    duration?: number,
    featuredRow?: string,
+   feedFm?: {
+     backupStation?: {
+       guid?: string,
+     },
+     playbackStation?: {
+       guid?: string,
+       type?: 'firstplay' | 'replay' | 'normal',
+     },
+     primaryStation?: {
+       guid?: string,
+     },
+     stationStatus?: 'notRequested' | 'requested' | 'testRequested' | 'cancelled' | 'active' | 'testActive',
+     stationType?: 'firstplay' | 'replay' | 'normal',
+   },
    format?: {
      code?: string,
    },
    guid?: string,
    images?: {
      default?: string,
      hd?: string,
      portrait?: string,
      sd?: string,
      square?: string,
    },
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    keywords?: string,
    medium?: 'reflect' | 'standard' | 'strength',
    mediumLinked?: {
      guid?: string,
    },
    name?: string,
    playlist?: {
      id?: number,
    },
    schedule?: List<{
      available?: {
        end?: number,
        live?: number,
        start?: number,
      },
      content?: {
        guid?: string,
      },
      guid?: string,
      legacy?: {
        id?: number,
        type?: 'reflect' | 'connect',
      },
      playback?: List<{
        type?: 'hls' | 'dash',
        url?: string,
      }>,
      type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
    }>,
    sortOrder?: number,
    sourceUrl?: string,
    sourceVideo?: {
      type?: 'hls' | 'dash',
      url?: string,
    },
    status?: 'draft' | 'published',
    studios?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    tags?: List<{
      images?: {
        default?: string,
        hd?: string,
        portrait?: string,
        sd?: string,
        square?: string,
      },
      modality?: 'ride' | 'row' | 'run' | 'off' | 'all' | 'ellipse' | 'lift',
      translations?: record,
      type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus' | 'muscleGroup',
      value?: string,
    }>,
    updatedBy?: {
      id?: number,
    },
    videoLength?: {
      id?: number,
      name?: string,
      value?: number,
    },
    videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted' | 'processingFailed',
  },
}

GET /content/items/{guid}

Get a specific content item.

Response Body
{
  data: {
    catalog?: {
      code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
    },
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    duration?: number,
    featuredRow?: string,

format?: { code?: string, }, guid?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, instructors?: List<{ id?: number, name?: string, precedence?: number, }>, keywords?: string, medium?: 'reflect' | 'standard' | 'strength', mediumLinked?: { guid?: string, }, name?: string, playlist?: { id?: number, }, schedule?: List<{ available?: { end?: number, live?: number, start?: number, }, content?: { guid?: string, }, guid?: string, legacy?: { id?: number, type?: 'reflect' | 'connect', }, playback?: List<{ type?: 'hls' | 'dash', url?: string, }>, type?: 'live' | 'vod' | 'encore' | 'rebroadcast', }>, sortOrder?: number, sourceUrl?: string, sourceVideo?: { type?: 'hls' | 'dash', url?: string, }, status?: 'draft' | 'published', studios?: List<{ id?: number, name?: string, precedence?: number, }>, tags?: List<{ images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, modality?: 'ride' | 'row' | 'run' | 'off' | 'all' | 'ellipse' | 'lift', translations?: record, type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus' | 'muscleGroup', value?: string, }>, updatedBy?: { id?: number, }, userData?: { favorite?: { content?: bool, }, workout?: { status?: 'finished' | 'DNF', }, }, videoLength?: { id?: number, name?: string, value?: number, }, videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted' | 'processingFailed', }, }

GET /content/items/{guid}

Get a specific content item.

Response Body
{
  data: {
    catalog?: {
      code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
    },
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    duration?: number,
    featuredRow?: string,
+   feedFm?: {
+     backupStation?: {
+       guid?: string,
+     },
+     playbackStation?: {
+       guid?: string,
+       type?: 'firstplay' | 'replay' | 'normal',
+     },
+     primaryStation?: {
+       guid?: string,
+     },
+     stationStatus?: 'notRequested' | 'requested' | 'testRequested' | 'cancelled' | 'active' | 'testActive',
+     stationType?: 'firstplay' | 'replay' | 'normal',
+   },
    format?: {
      code?: string,
    },
    guid?: string,
    images?: {
      default?: string,
      hd?: string,
      portrait?: string,
      sd?: string,
      square?: string,
    },
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    keywords?: string,
    medium?: 'reflect' | 'standard' | 'strength',
    mediumLinked?: {
      guid?: string,
    },
    name?: string,
    playlist?: {
      id?: number,
    },
    schedule?: List<{
      available?: {
        end?: number,
        live?: number,
        start?: number,
      },
      content?: {
        guid?: string,
      },
      guid?: string,
      legacy?: {
        id?: number,
        type?: 'reflect' | 'connect',
      },
      playback?: List<{
        type?: 'hls' | 'dash',
        url?: string,
      }>,
      type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
    }>,
    sortOrder?: number,
    sourceUrl?: string,
    sourceVideo?: {
      type?: 'hls' | 'dash',
      url?: string,
    },
    status?: 'draft' | 'published',
    studios?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    tags?: List<{
      images?: {
        default?: string,
        hd?: string,
        portrait?: string,
        sd?: string,
        square?: string,
      },
      modality?: 'ride' | 'row' | 'run' | 'off' | 'all' | 'ellipse' | 'lift',
      translations?: record,
      type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus' | 'muscleGroup',
      value?: string,
    }>,
    updatedBy?: {
      id?: number,
    },
    userData?: {
      favorite?: {
        content?: bool,
      },
      workout?: {
        status?: 'finished' | 'DNF',
      },
    },
    videoLength?: {
      id?: number,
      name?: string,
      value?: number,
    },
    videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted' | 'processingFailed',
  },
}

PATCH /content/items/{guid}

Update a content item

Request Body
{
  catalog: {
    code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
  },
  countries: List<{
    code?: string,
  }>,
  description: string,
  featuredRow: string,

format: { code?: string, }, instructors: List<{ id?: number, precedence?: number, }>, medium: 'reflect' | 'standard' | 'strength', mediumLinked: { guid?: string, }, name: string, playlist: { id?: number, }, sortOrder: number, status: 'draft' | 'published', studios: List<{ id?: number, precedence?: number, }>, tags: List<{ value?: string, }>, videoLength: { id?: number, }, videoStatus: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted' | 'processingFailed', }
Response Body
{
  data: {
    catalog?: {
      code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
    },
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    duration?: number,
    featuredRow?: string,

format?: { code?: string, }, guid?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, instructors?: List<{ id?: number, name?: string, precedence?: number, }>, keywords?: string, medium?: 'reflect' | 'standard' | 'strength', mediumLinked?: { guid?: string, }, name?: string, playlist?: { id?: number, }, schedule?: List<{ available?: { end?: number, live?: number, start?: number, }, content?: { guid?: string, }, guid?: string, legacy?: { id?: number, type?: 'reflect' | 'connect', }, playback?: List<{ type?: 'hls' | 'dash', url?: string, }>, type?: 'live' | 'vod' | 'encore' | 'rebroadcast', }>, sortOrder?: number, sourceUrl?: string, sourceVideo?: { type?: 'hls' | 'dash', url?: string, }, status?: 'draft' | 'published', studios?: List<{ id?: number, name?: string, precedence?: number, }>, tags?: List<{ images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, modality?: 'ride' | 'row' | 'run' | 'off' | 'all' | 'ellipse' | 'lift', translations?: record, type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus' | 'muscleGroup', value?: string, }>, updatedBy?: { id?: number, }, videoLength?: { id?: number, name?: string, value?: number, }, videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted' | 'processingFailed', }, }

PATCH /content/items/{guid}

Update a content item

Request Body
{
  catalog: {
    code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
  },
  countries: List<{
    code?: string,
  }>,
  description: string,
  featuredRow: string,
+ feedFm: {
+   backupStation?: {
+     guid?: string,
+   },
+   playbackStation?: {
+     guid?: string,
+     type?: 'firstplay' | 'replay' | 'normal',
+   },
+   primaryStation?: {
+     guid?: string,
+   },
+   stationStatus?: 'notRequested' | 'requested' | 'testRequested' | 'cancelled' | 'active' | 'testActive',
+   stationType?: 'firstplay' | 'replay' | 'normal',
+ },
  format: {
    code?: string,
  },
  instructors: List<{
    id?: number,
    precedence?: number,
  }>,
  medium: 'reflect' | 'standard' | 'strength',
  mediumLinked: {
    guid?: string,
  },
  name: string,
  playlist: {
    id?: number,
  },
  sortOrder: number,
  status: 'draft' | 'published',
  studios: List<{
    id?: number,
    precedence?: number,
  }>,
  tags: List<{
    value?: string,
  }>,
  videoLength: {
    id?: number,
  },
  videoStatus: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted' | 'processingFailed',
}
Response Body
{
  data: {
    catalog?: {
      code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
    },
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    duration?: number,
    featuredRow?: string,
+   feedFm?: {
+     backupStation?: {
+       guid?: string,
+     },
+     playbackStation?: {
+       guid?: string,
+       type?: 'firstplay' | 'replay' | 'normal',
+     },
+     primaryStation?: {
+       guid?: string,
+     },
+     stationStatus?: 'notRequested' | 'requested' | 'testRequested' | 'cancelled' | 'active' | 'testActive',
+     stationType?: 'firstplay' | 'replay' | 'normal',
+   },
    format?: {
      code?: string,
    },
    guid?: string,
    images?: {
      default?: string,
      hd?: string,
      portrait?: string,
      sd?: string,
      square?: string,
    },
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    keywords?: string,
    medium?: 'reflect' | 'standard' | 'strength',
    mediumLinked?: {
      guid?: string,
    },
    name?: string,
    playlist?: {
      id?: number,
    },
    schedule?: List<{
      available?: {
        end?: number,
        live?: number,
        start?: number,
      },
      content?: {
        guid?: string,
      },
      guid?: string,
      legacy?: {
        id?: number,
        type?: 'reflect' | 'connect',
      },
      playback?: List<{
        type?: 'hls' | 'dash',
        url?: string,
      }>,
      type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
    }>,
    sortOrder?: number,
    sourceUrl?: string,
    sourceVideo?: {
      type?: 'hls' | 'dash',
      url?: string,
    },
    status?: 'draft' | 'published',
    studios?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    tags?: List<{
      images?: {
        default?: string,
        hd?: string,
        portrait?: string,
        sd?: string,
        square?: string,
      },
      modality?: 'ride' | 'row' | 'run' | 'off' | 'all' | 'ellipse' | 'lift',
      translations?: record,
      type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus' | 'muscleGroup',
      value?: string,
    }>,
    updatedBy?: {
      id?: number,
    },
    videoLength?: {
      id?: number,
      name?: string,
      value?: number,
    },
    videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted' | 'processingFailed',
  },
}

GET /legacy/{id}/content

Get content for legacy class

Response Body
{
  data: {
    catalog?: {
      code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
    },
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    duration?: number,
    featuredRow?: string,

format?: { code?: string, }, guid?: string, images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, instructors?: List<{ id?: number, name?: string, precedence?: number, }>, keywords?: string, medium?: 'reflect' | 'standard' | 'strength', mediumLinked?: { guid?: string, }, name?: string, playlist?: { id?: number, }, schedule?: List<{ available?: { end?: number, live?: number, start?: number, }, content?: { guid?: string, }, guid?: string, legacy?: { id?: number, type?: 'reflect' | 'connect', }, playback?: List<{ type?: 'hls' | 'dash', url?: string, }>, type?: 'live' | 'vod' | 'encore' | 'rebroadcast', }>, sortOrder?: number, sourceUrl?: string, sourceVideo?: { type?: 'hls' | 'dash', url?: string, }, status?: 'draft' | 'published', studios?: List<{ id?: number, name?: string, precedence?: number, }>, tags?: List<{ images?: { default?: string, hd?: string, portrait?: string, sd?: string, square?: string, }, modality?: 'ride' | 'row' | 'run' | 'off' | 'all' | 'ellipse' | 'lift', translations?: record, type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus' | 'muscleGroup', value?: string, }>, updatedBy?: { id?: number, }, videoLength?: { id?: number, name?: string, value?: number, }, videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted' | 'processingFailed', }, }

GET /legacy/{id}/content

Get content for legacy class

Response Body
{
  data: {
    catalog?: {
      code?: 'SpinCo' | 'LabelMusic' | 'RoyaltyFree' | 'Select' | 'Flex' | 'FlexLabelMusic' | 'FitPass' | 'FitPassLabelMusic' | 'InstructorAudioOnly' | 'Just' | 'Free',
    },
    countries?: List<{
      code?: string,
    }>,
    createdBy?: {
      id?: number,
    },
    dateCreated?: number,
    dateUpdated?: number,
    description?: string,
    duration?: number,
    featuredRow?: string,
+   feedFm?: {
+     backupStation?: {
+       guid?: string,
+     },
+     playbackStation?: {
+       guid?: string,
+       type?: 'firstplay' | 'replay' | 'normal',
+     },
+     primaryStation?: {
+       guid?: string,
+     },
+     stationStatus?: 'notRequested' | 'requested' | 'testRequested' | 'cancelled' | 'active' | 'testActive',
+     stationType?: 'firstplay' | 'replay' | 'normal',
+   },
    format?: {
      code?: string,
    },
    guid?: string,
    images?: {
      default?: string,
      hd?: string,
      portrait?: string,
      sd?: string,
      square?: string,
    },
    instructors?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    keywords?: string,
    medium?: 'reflect' | 'standard' | 'strength',
    mediumLinked?: {
      guid?: string,
    },
    name?: string,
    playlist?: {
      id?: number,
    },
    schedule?: List<{
      available?: {
        end?: number,
        live?: number,
        start?: number,
      },
      content?: {
        guid?: string,
      },
      guid?: string,
      legacy?: {
        id?: number,
        type?: 'reflect' | 'connect',
      },
      playback?: List<{
        type?: 'hls' | 'dash',
        url?: string,
      }>,
      type?: 'live' | 'vod' | 'encore' | 'rebroadcast',
    }>,
    sortOrder?: number,
    sourceUrl?: string,
    sourceVideo?: {
      type?: 'hls' | 'dash',
      url?: string,
    },
    status?: 'draft' | 'published',
    studios?: List<{
      id?: number,
      name?: string,
      precedence?: number,
    }>,
    tags?: List<{
      images?: {
        default?: string,
        hd?: string,
        portrait?: string,
        sd?: string,
        square?: string,
      },
      modality?: 'ride' | 'row' | 'run' | 'off' | 'all' | 'ellipse' | 'lift',
      translations?: record,
      type?: 'format' | 'category' | 'music' | 'language' | 'closedCaptions' | 'equipment' | 'plan' | 'venue' | 'general' | 'level' | 'accessories' | 'focus' | 'muscleGroup',
      value?: string,
    }>,
    updatedBy?: {
      id?: number,
    },
    videoLength?: {
      id?: number,
      name?: string,
      value?: number,
    },
    videoStatus?: 'uninitiated' | 'uploadStarted' | 'uploadCompleted' | 'processingStarted' | 'processingCompleted' | 'processingFailed',
  },
}
4 added endpoints
Added endpoints

DELETE /redis

Admin only. Clear redis by pattern.

Guard: admin, service

Response Body
{
  data: List<string>,
  pagination: {
    page?: number,
    skip?: number,
    take?: number,
    total?: {
      pages?: number,
      rows?: number,
    },
  },
}

POST /webhooks/feedFm/feedfm

Request Body
{
  creator: string,
  event?: 'station_requested' | 'station_published_to_production' | 'station_published_to_development' | 'station_unpublished',
  name: string,
  testing: bool,
  uuid?: string,
}

GET /badges/milestones/conditions

Get a list of all milestones conditions. Not paginated.

Guard: marketing, service

Response Body
{
  data: List<{
    condition?: {
      comparator?: string,
      key?: string,
      value?: string,
    },
    description?: string,
    id?: number,
  }>,
}

GET /badges/milestones/conditions/{id}

Get a specific milestone condition by ID

Guard: marketing, service

Response Body
{
  data: {
    condition?: {
      comparator?: string,
      key?: string,
      value?: string,
    },
    description?: string,
    id?: number,
  },
}
WORK IN PROGRESS