EGYM User Connect API

User-authorized API that lets third-party fitness and wearable apps write a member's own data into their EGYM ID account. Accepts workout submissions and cardio measurements — VO2 max, resting heart rate and blood pressure. Authentication is a user-scoped EGYM ID JWT that the member can revoke from EGYM ID settings, making this the one EGYM surface governed by end-user consent rather than a gym-scoped API key. 4 operations.

OpenAPI Specification

egym-user-connect-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: OpenAPI definition
  version: v0
servers:
- url: https://user-connect-api.cgn-3.test.co.egym.coffee/user-connect-api
  description: Test cgn-3
- url: https://user-connect.api.egym.com/user-connect-api
  description: Prod
- url: http://localhost:8080/user-connect-api
  description: Local
tags:
- name: 1. Cardio Measurements
  description: API for submitting cardio measurements
- name: 2. Workouts
  description: API for submitting workouts
paths:
  /workouts/v1/workouts:
    post:
      tags:
      - 2. Workouts
      summary: Submit Workout
      description: Submit a completed workout on behalf of a member
      operationId: submitWorkout
      parameters:
      - name: measurementSystem
        in: query
        required: true
        schema:
          type: string
          enum:
          - METRIC
          - IMPERIAL
      - name: gymLocationId
        in: query
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkoutRequest'
        required: true
      responses:
        '200':
          description: Workout submitted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkoutBriefResponse'
        '400':
          description: Bad Request — validation failure
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorDto'
        '401':
          description: Unauthorized — missing or invalid JWT
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkoutBriefResponse'
        '502':
          description: Bad Gateway — server-workout downstream error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkoutBriefResponse'
        '503':
          description: Service Unavailable — server-workout circuit breaker open
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkoutBriefResponse'
  /measurements/v1.0/cardio/vo2max:
    post:
      tags:
      - 1. Cardio Measurements
      summary: Submit VO2max
      description: Submit VO2max Measurement
      operationId: submitVo2MaxMeasurement
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitVo2MaxRequest'
        required: true
      responses:
        '200':
          description: OK
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorDto'
  /measurements/v1.0/cardio/resting-heart-rate:
    post:
      tags:
      - 1. Cardio Measurements
      summary: Submit Resting Heart Rate
      description: Submit Resting Heart Rate Measurement
      operationId: submitRestingHeartRateMeasurement
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitRestingHeartRateRequest'
        required: true
      responses:
        '200':
          description: OK
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorDto'
  /measurements/v1.0/cardio/blood-pressure:
    post:
      tags:
      - 1. Cardio Measurements
      summary: Submit Blood Pressure
      description: Submit Blood Pressure Measurement
      operationId: submitBloodPressureMeasurement
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitBloodPressureRequest'
        required: true
      responses:
        '200':
          description: OK
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorDto'
components:
  schemas:
    FieldErrorDto:
      type: object
      properties:
        name:
          type: string
        message:
          type: string
    ValidationErrorDto:
      type: object
      properties:
        code:
          type: integer
          format: int32
        error:
          type: string
        message:
          type: string
        fieldErrors:
          type: array
          items:
            $ref: '#/components/schemas/FieldErrorDto'
    WorkoutExerciseRequest:
      type: object
      properties:
        activityId:
          type: integer
          format: int64
          description: EGYM activity ID.
        completedAt:
          type: string
          format: date-time
          description: Exercise local completion time.
        timezone:
          type: string
          description: Exercise completion timezone.
        templateGroupId:
          type: integer
          format: int64
          description: Workout plan ID.
        templateId:
          type: integer
          format: int64
          description: Workout plan exercise ID.
        sets:
          type: array
          description: Exercise sets.
          items:
            $ref: '#/components/schemas/WorkoutExerciseSetRequest'
          minItems: 1
        originallyDisplayedSets:
          type: array
          description: Sets originally displayed to the user.
          items:
            $ref: '#/components/schemas/WorkoutExerciseSetRequest'
      required:
      - activityId
      - sets
    WorkoutExerciseSetRequest:
      type: object
      properties:
        setType:
          type: string
          description: REP_BASED or TIME_BASED.
          enum:
          - REP_BASED
          - TIME_BASED
        numberOfReps:
          type: integer
          format: int32
          description: Number of repetitions.
        weight:
          type: number
          format: double
          description: Weight in kilograms or pounds.
        duration:
          type: integer
          format: int64
          description: Duration in seconds.
        distance:
          type: number
          format: double
          description: Distance in meters or feet.
        heartRate:
          type: integer
          format: int32
          description: Heart rate (bpm).
        speed:
          type: number
          format: double
          description: Speed in metres/feet per second.
        incline:
          type: number
          format: double
          description: Incline.
        recoveryTime:
          type: integer
          format: int64
          description: Recovery time in seconds.
        trainingMethod:
          type: string
          description: Training method.
          enum:
          - REGULAR_TIMEBASED
          - REGULAR_REPBASED
          - NEGATIVE_TIMEBASED
          - NEGATIVE_REPBASED
          - ADAPTIVE_TIMEBASED
          - ADAPTIVE_REPBASED
          - MEASUREMENT
          - MEASUREMENT_DYNAMIC
          - ISOKINETIC
          - ELEMENTS
          - MAX_POWER
          - MAX_OUT
      required:
      - setType
    WorkoutRequest:
      type: object
      properties:
        exercises:
          type: array
          description: Exercises of the workout.
          items:
            $ref: '#/components/schemas/WorkoutExerciseRequest'
          minItems: 1
      required:
      - exercises
    WorkoutBriefResponse:
      type: object
      properties:
        exercises:
          type: array
          description: Submitted workout exercises.
          items:
            $ref: '#/components/schemas/WorkoutExerciseResponse'
        completedAt:
          type: string
          format: date-time
          description: Workout tracking local time.
        timezone:
          type: string
          description: Workout tracking timezone.
    WorkoutExerciseResponse:
      type: object
      properties:
        id:
          type: integer
          format: int64
          description: Server-workout exercise ID.
        activityId:
          type: integer
          format: int64
          description: EGYM activity ID.
        label:
          type: string
          description: Localized activity name.
    SubmitVo2MaxDto:
      type: object
      properties:
        createdAt:
          type: string
          format: date-time
          description: Measurement timestamp in UTC
        vo2Max:
          type: number
          format: double
          description: VO2 Max value
          maximum: 100
          minimum: 0
      required:
      - createdAt
      - vo2Max
    SubmitVo2MaxRequest:
      type: object
      properties:
        measurements:
          type: array
          items:
            $ref: '#/components/schemas/SubmitVo2MaxDto'
          minItems: 1
      required:
      - measurements
    SubmitRestingHeartRateDto:
      type: object
      properties:
        createdAt:
          type: string
          format: date-time
          description: Measurement timestamp in UTC
        bpm:
          type: integer
          format: int32
          description: Beats per minute value
          maximum: 230
          minimum: 30
      required:
      - bpm
      - createdAt
    SubmitRestingHeartRateRequest:
      type: object
      properties:
        measurements:
          type: array
          items:
            $ref: '#/components/schemas/SubmitRestingHeartRateDto'
          minItems: 1
      required:
      - measurements
    SubmitBloodPressureDto:
      type: object
      properties:
        createdAt:
          type: string
          format: date-time
          description: Measurement timestamp in UTC
        systolic:
          type: integer
          format: int32
          description: Systolic pressure value
          maximum: 250
          minimum: 30
        diastolic:
          type: integer
          format: int32
          description: Diastolic pressure value
          maximum: 250
          minimum: 30
      required:
      - createdAt
      - diastolic
      - systolic
    SubmitBloodPressureRequest:
      type: object
      properties:
        measurements:
          type: array
          items:
            $ref: '#/components/schemas/SubmitBloodPressureDto'
          minItems: 1
      required:
      - measurements