Nest Changelog

1.27.8

6/2/2023

1.28.0 PRE

5/30/2023

8 changed endpoints

POST /webhooks/invoice-upcoming

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTax?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
  currencyCode?: string,
  dateCreated?: number,
  dateNextAttempt?: number,
  datePeriodEnd?: number,
  datePeriodStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  invoiceId?: string,
  isAutomaticCollection?: bool,
  isManualPayment?: bool,
  isPaid?: bool,
  orderCode?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  sourceCode?: string,
  sourceName?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,

status?: string, }

POST /webhooks/invoice-upcoming

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTax?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
  currencyCode?: string,
  dateCreated?: number,
  dateNextAttempt?: number,
  datePeriodEnd?: number,
  datePeriodStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  invoiceId?: string,
  isAutomaticCollection?: bool,
  isManualPayment?: bool,
  isPaid?: bool,
  orderCode?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  sourceCode?: string,
  sourceName?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,
+ sourceUserEmail: string,
  status?: string,
}

POST /webhooks/invoice-updated

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTax?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
  currencyCode?: string,
  dateCreated?: number,
  dateNextAttempt?: number,
  datePeriodEnd?: number,
  datePeriodStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  invoiceId?: string,
  isAutomaticCollection?: bool,
  isManualPayment?: bool,
  isPaid?: bool,
  orderCode?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  sourceCode?: string,
  sourceName?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,

status?: string, }

POST /webhooks/invoice-updated

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTax?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
  currencyCode?: string,
  dateCreated?: number,
  dateNextAttempt?: number,
  datePeriodEnd?: number,
  datePeriodStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  invoiceId?: string,
  isAutomaticCollection?: bool,
  isManualPayment?: bool,
  isPaid?: bool,
  orderCode?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  sourceCode?: string,
  sourceName?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,
+ sourceUserEmail: string,
  status?: string,
}

POST /webhooks/invoice-paid

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTax?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
  currencyCode?: string,
  dateCreated?: number,
  dateNextAttempt?: number,
  datePeriodEnd?: number,
  datePeriodStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  invoiceId?: string,
  isAutomaticCollection?: bool,
  isManualPayment?: bool,
  isPaid?: bool,
  orderCode?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  sourceCode?: string,
  sourceName?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,

status?: string, }

POST /webhooks/invoice-paid

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTax?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
  currencyCode?: string,
  dateCreated?: number,
  dateNextAttempt?: number,
  datePeriodEnd?: number,
  datePeriodStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  invoiceId?: string,
  isAutomaticCollection?: bool,
  isManualPayment?: bool,
  isPaid?: bool,
  orderCode?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  sourceCode?: string,
  sourceName?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,
+ sourceUserEmail: string,
  status?: string,
}

POST /webhooks/payment-failure

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTax?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
  currencyCode?: string,
  dateCreated?: number,
  dateNextAttempt?: number,
  datePeriodEnd?: number,
  datePeriodStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  invoiceId?: string,
  isAutomaticCollection?: bool,
  isManualPayment?: bool,
  isPaid?: bool,
  orderCode?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  sourceCode?: string,
  sourceName?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,

status?: string, }

POST /webhooks/payment-failure

Request Body
{
  amountDue?: number,
  amountPaid?: number,
  amountTax?: number,
  amountTotal?: number,
  attemptCount?: number,
  attempted?: bool,
  billingReason?: 'subscriptionRenewed' | 'subscriptionCreate' | 'subscriptionChanged' | 'manual' | 'subscriptionRenewalUpcoming',
  currencyCode?: string,
  dateCreated?: number,
  dateNextAttempt?: number,
  datePeriodEnd?: number,
  datePeriodStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  invoiceId?: string,
  isAutomaticCollection?: bool,
  isManualPayment?: bool,
  isPaid?: bool,
  orderCode?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  sourceCode?: string,
  sourceName?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,
+ sourceUserEmail: string,
  status?: string,
}

POST /webhooks/subscription-created

Request Body
{
  billingCycleAnchor?: number,
  createdAt?: number,
  dateCancelled?: number,
  dateExpire?: number,
  datePausedUntil?: number,
  dateStart?: number,
  dateTrialEnd?: number,
  dateTrialStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  orderCode?: string,
  planId?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  renewedAt?: number,
  sourceCode?: string,
  sourceType?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,

status?: string, }

POST /webhooks/subscription-created

Request Body
{
  billingCycleAnchor?: number,
  createdAt?: number,
  dateCancelled?: number,
  dateExpire?: number,
  datePausedUntil?: number,
  dateStart?: number,
  dateTrialEnd?: number,
  dateTrialStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  orderCode?: string,
  planId?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  renewedAt?: number,
  sourceCode?: string,
  sourceType?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,
+ sourceUserEmail: string,
  status?: string,
}

POST /webhooks/subscription-deleted

Request Body
{
  billingCycleAnchor?: number,
  createdAt?: number,
  dateCancelled?: number,
  dateExpire?: number,
  datePausedUntil?: number,
  dateStart?: number,
  dateTrialEnd?: number,
  dateTrialStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  orderCode?: string,
  planId?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  renewedAt?: number,
  sourceCode?: string,
  sourceType?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,

status?: string, }

POST /webhooks/subscription-deleted

Request Body
{
  billingCycleAnchor?: number,
  createdAt?: number,
  dateCancelled?: number,
  dateExpire?: number,
  datePausedUntil?: number,
  dateStart?: number,
  dateTrialEnd?: number,
  dateTrialStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  orderCode?: string,
  planId?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  renewedAt?: number,
  sourceCode?: string,
  sourceType?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,
+ sourceUserEmail: string,
  status?: string,
}

POST /webhooks/subscription-updated

Request Body
{
  billingCycleAnchor?: number,
  createdAt?: number,
  dateCancelled?: number,
  dateExpire?: number,
  datePausedUntil?: number,
  dateStart?: number,
  dateTrialEnd?: number,
  dateTrialStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  orderCode?: string,
  planId?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  renewedAt?: number,
  sourceCode?: string,
  sourceType?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,

status?: string, }

POST /webhooks/subscription-updated

Request Body
{
  billingCycleAnchor?: number,
  createdAt?: number,
  dateCancelled?: number,
  dateExpire?: number,
  datePausedUntil?: number,
  dateStart?: number,
  dateTrialEnd?: number,
  dateTrialStart?: number,
  initiatedBy: {
    id?: number,
  },
  internalNote: string,
  orderCode?: string,
  planId?: string,
  publicNote: string,
  reason: {
    code?: 'competitor' | 'healthIssues' | 'notMetExpectations' | 'pricing' | 'noLongerHaveEquipment' | 'busy' | 'other' | 'planChange',
    message?: string,
  },
  renewedAt?: number,
  sourceCode?: string,
  sourceType?: 'stripe' | 'apple' | 'google' | 'amazon',
  sourceUserCode?: string,
+ sourceUserEmail: string,
  status?: string,
}

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,
-   product?: string,
    rideid: number,
    ridetype?: string,
    source: string,
    totalcalories: number,
    totaldistance: number,
    totalhrpoints: number,
    totaloutput: number,
    totalriders: number,
    userid?: number,
  },
  rideIndexById?: {
    appversion: string,
    avgcadence: number,
    avgheartrate: number,
    avgresistance: number,
    classimage: string,
    classname: string,
    device: string,
    dnf: bool,
    duration: number,
    encore: bool,
    finalrank: number,
    incline: number,
    instanceuuid?: string,
    instructorname: string,
    iscomplete: bool,
    osversion: string,
-   product?: string,
    rideid: number,
    ridetype: string,
    source: string,
    totalcalories: number,
    totaldistance: number,
    totalhrpoints: number,
    totaloutput: number,
    totalriders: number,
    userid: number,
  },
  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,
    timeOffset?: number,
    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, timeOffset?: number, type?: 'live' | 'vod' | 'encore' | 'freestyle', userId?: number, }, }
Added endpoints

GET /legacy/user/{userId}/badges

Get all legacy badges for this user

Guard: admin, family

Response Body
{
  data: List<{
    code?: string,
  }>,
}
WORK IN PROGRESS