EGYM Data Hub API

Analytics and measurement export API for the authenticated gym location. Offers six synchronous CSV/JSON export endpoints — general analytics, Smart Strength workouts, Smart Strength assessments, flexibility measurements, body measurements and opted-out users — plus an asynchronous export-job surface that creates a job and polls its status. EGYM documents Data Hub as a pilot available exclusively to Enterprise Pack customers, with contracts that may change. 8 operations.

OpenAPI Specification

egym-data-hub-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Data Hub API
  description: APIs for exporting analytics, Smart Strength workouts, and measurement data for the authenticated gym location.
    Data Hub is in pilot and available exclusively to EGYM Enterprise Pack customers; functionality and API contracts may
    change.
  termsOfService: https://egym.com/en/terms/
  contact:
    name: Operator Experience Team
    url: https://egym.com/
    email: ox-dev@egym.com
  version: Pilot
servers:
- url: https://analytics.api.egym.com
  description: Production
security:
- apiKeyAuth: []
tags:
- name: Synchronous exports
  description: Immediate paginated JSON exports for weekly analytics and recent event data.
- name: Asynchronous exports
  description: Background export jobs that produce downloadable JSON, JSONL, or CSV files.
paths:
  /api/v1/data/analytics:
    get:
      tags:
      - Synchronous exports
      summary: Export weekly analytics
      description: Returns weekly analytics metrics for the gym location associated with the API key. The maximum date range
        is 365 days.
      operationId: getAnalyticsExport
      parameters:
      - $ref: '#/components/parameters/startDate'
      - $ref: '#/components/parameters/endDate'
      - $ref: '#/components/parameters/cursor'
      responses:
        '200':
          description: Analytics export page.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnalyticsExportResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /api/v1/data/smart-strength-workouts:
    get:
      tags:
      - Synchronous exports
      summary: Export recent Smart Strength workouts
      description: Returns recent Smart Strength workout data for the gym location associated with the API key. The maximum
        date range is 30 days and startDate must be within the last month.
      operationId: getSmartStrengthWorkoutsExport
      parameters:
      - $ref: '#/components/parameters/startDate'
      - $ref: '#/components/parameters/endDate'
      - $ref: '#/components/parameters/cursor'
      responses:
        '200':
          description: Smart Strength workout export page.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SmartStrengthWorkoutsExportResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /api/v1/data/smart-strength-assessments:
    get:
      tags:
      - Synchronous exports
      summary: Export recent Smart Strength assessments
      description: Returns recent Smart Strength assessment data for the gym location associated with the API key. The maximum
        date range is 30 days and startDate must be within the last month.
      operationId: getSmartStrengthAssessmentsExport
      parameters:
      - $ref: '#/components/parameters/startDate'
      - $ref: '#/components/parameters/endDate'
      - $ref: '#/components/parameters/cursor'
      responses:
        '200':
          description: Smart Strength assessment export page.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SmartStrengthAssessmentsExportResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /api/v1/data/flexibility-measurements:
    get:
      tags:
      - Synchronous exports
      summary: Export recent flexibility measurements
      description: Returns recent flexibility measurement data for the gym location associated with the API key. The maximum
        date range is 30 days and startDate must be within the last month.
      operationId: getFlexibilityMeasurementsExport
      parameters:
      - $ref: '#/components/parameters/startDate'
      - $ref: '#/components/parameters/endDate'
      - $ref: '#/components/parameters/cursor'
      responses:
        '200':
          description: Flexibility measurement export page.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FlexibilityMeasurementsExportResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /api/v1/data/body-measurements:
    get:
      tags:
      - Synchronous exports
      summary: Export recent body measurements
      description: Returns recent body measurement data for the gym location associated with the API key. The maximum date
        range is 30 days and startDate must be within the last month.
      operationId: getBodyMeasurementsExport
      parameters:
      - $ref: '#/components/parameters/startDate'
      - $ref: '#/components/parameters/endDate'
      - $ref: '#/components/parameters/cursor'
      responses:
        '200':
          description: Body measurement export page.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BodyMeasurementsExportResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /api/v1/data/opted-out-users:
    get:
      tags:
      - Synchronous exports
      summary: Export opted-out users
      description: Returns the members at the gym location who have not opted in to health data and consumer-to-business (C2B)
        sharing. These members are excluded from all event exports, so use this endpoint to identify accounts whose previously
        exported data must be deleted to comply with GDPR and other data-protection requirements. The endpoint takes no query
        parameters and is not paginated; it returns all opted-out users for the gym location in a single response.
      operationId: getOptedOutUsersExport
      responses:
        '200':
          description: Opted-out users for the gym location.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OptedOutUsersExportResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /api/v1/data/async:
    post:
      tags:
      - Asynchronous exports
      summary: Create async export job
      description: Creates a background export job for a file-based event data export. Async exports can go back up to one
        year. Requests cannot include event data older than one year, and each export job can cover at most 365 days.
      operationId: createAsyncExportJob
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AsyncExportCreateRequest'
      responses:
        '201':
          description: Export job created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AsyncExportCreateResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /api/v1/data/async/jobs/{jobId}:
    get:
      tags:
      - Asynchronous exports
      summary: Get async export job status
      description: Returns the current status of an async export job. A downloadURL is returned only when the job status is
        DONE.
      operationId: getAsyncExportJobStatus
      parameters:
      - name: jobId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Export job status.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AsyncExportStatusResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      description: API key generated by EGYM for a gym location.
      name: x-api-key
      in: header
  parameters:
    startDate:
      name: startDate
      in: query
      required: true
      description: Start date in YYYY-MM-DD format.
      schema:
        type: string
        format: date
    endDate:
      name: endDate
      in: query
      required: true
      description: End date in YYYY-MM-DD format.
      schema:
        type: string
        format: date
    cursor:
      name: cursor
      in: query
      required: false
      description: Pagination cursor returned as nextCursor by the previous response.
      schema:
        type: string
  schemas:
    GymInfo:
      type: object
      properties:
        name:
          type: string
    AnalyticsExportResponse:
      type: object
      properties:
        gym:
          $ref: '#/components/schemas/GymInfo'
        data:
          type: array
          items:
            $ref: '#/components/schemas/AnalyticsExportItem'
        nextCursor:
          type: string
          nullable: true
    AnalyticsExportItem:
      type: object
      properties:
        periodStart:
          type: string
          format: date
        periodEnd:
          type: string
          format: date
        metricType:
          type: string
        metricKey:
          type: string
        metricSubType:
          type: string
        value:
          type: number
          format: double
    OptedOutUsersExportResponse:
      type: object
      properties:
        gym:
          $ref: '#/components/schemas/GymInfo'
        data:
          type: array
          items:
            $ref: '#/components/schemas/OptedOutUserExportItem'
    OptedOutUserExportItem:
      type: object
      properties:
        externalAccountId:
          type: string
          description: Unique, stable identifier for the member's account. When a member opts out, EGYM shares only this ID
            so the gym can identify and delete the member's previously exported data without EGYM transmitting any personal
            information.
        lastSeenAt:
          type: string
          format: date-time
          nullable: true
    SmartStrengthWorkoutsExportResponse:
      type: object
      properties:
        gym:
          $ref: '#/components/schemas/GymInfo'
        data:
          type: array
          items:
            $ref: '#/components/schemas/SmartStrengthWorkoutItem'
        nextCursor:
          type: string
          nullable: true
    SmartStrengthWorkoutItem:
      type: object
      properties:
        eventTimestamp:
          type: string
          format: date-time
          nullable: true
        externalAccountId:
          type: string
          description: Unique, stable identifier for the member's account. Use it to correlate exported records and to delete
            this member's previously exported data later if needed.
        mmsMembershipId:
          type: string
          nullable: true
          description: Optional membership identifier from source systems. May be null when unavailable.
        isGuestUser:
          type: boolean
          nullable: true
        firstName:
          type: string
          nullable: true
        lastName:
          type: string
          nullable: true
        email:
          type: string
          nullable: true
        machineType:
          type: string
          nullable: true
        trainingMethod:
          type: string
          nullable: true
        operationMode:
          type: string
          nullable: true
        trainingVisualization:
          type: string
          nullable: true
    SmartStrengthAssessmentsExportResponse:
      type: object
      properties:
        gym:
          $ref: '#/components/schemas/GymInfo'
        data:
          type: array
          items:
            $ref: '#/components/schemas/SmartStrengthAssessmentItem'
        nextCursor:
          type: string
          nullable: true
    SmartStrengthAssessmentItem:
      type: object
      properties:
        eventTimestamp:
          type: string
          format: date-time
          nullable: true
        bodyRegion:
          type: string
          nullable: true
        typeId:
          type: string
          nullable: true
        activityName:
          type: string
          nullable: true
        measurementCompleted:
          type: boolean
          nullable: true
        chainName:
          type: string
          nullable: true
        firstName:
          type: string
          nullable: true
        lastName:
          type: string
          nullable: true
        email:
          type: string
          nullable: true
        externalAccountId:
          type: string
          description: Unique, stable identifier for the member's account. Use it to correlate exported records and to delete
            this member's previously exported data later if needed.
        mmsMembershipId:
          type: string
          nullable: true
          description: Optional membership identifier from source systems. May be null when unavailable.
    FlexibilityMeasurementsExportResponse:
      type: object
      properties:
        gym:
          $ref: '#/components/schemas/GymInfo'
        data:
          type: array
          items:
            $ref: '#/components/schemas/FlexibilityMeasurementItem'
        nextCursor:
          type: string
          nullable: true
    FlexibilityMeasurementItem:
      type: object
      properties:
        externalAccountId:
          type: string
          description: Unique, stable identifier for the member's account. Use it to correlate exported records and to delete
            this member's previously exported data later if needed.
        mmsMembershipId:
          type: string
          nullable: true
          description: Optional membership identifier from source systems. May be null when unavailable.
        eventTimestamp:
          type: string
          format: date-time
          nullable: true
        measurementType:
          type: string
          nullable: true
        isStaff:
          type: boolean
          nullable: true
        measurementCompleted:
          type: boolean
          nullable: true
        chainName:
          type: string
          nullable: true
        firstName:
          type: string
          nullable: true
        lastName:
          type: string
          nullable: true
        email:
          type: string
          nullable: true
    BodyMeasurementsExportResponse:
      type: object
      properties:
        gym:
          $ref: '#/components/schemas/GymInfo'
        data:
          type: array
          items:
            $ref: '#/components/schemas/BodyMeasurementItem'
        nextCursor:
          type: string
          nullable: true
    BodyMeasurementItem:
      type: object
      properties:
        externalAccountId:
          type: string
          description: Unique, stable identifier for the member's account. Use it to correlate exported records and to delete
            this member's previously exported data later if needed.
        mmsMembershipId:
          type: string
          nullable: true
          description: Optional membership identifier from source systems. May be null when unavailable.
        eventTimestamp:
          type: string
          format: date-time
          nullable: true
        measurementSource:
          type: string
          nullable: true
        isStaff:
          type: boolean
          nullable: true
        measurementCompleted:
          type: boolean
          nullable: true
        chainName:
          type: string
          nullable: true
        firstName:
          type: string
          nullable: true
        lastName:
          type: string
          nullable: true
        email:
          type: string
          nullable: true
    AsyncExportCreateRequest:
      type: object
      required:
      - startDate
      - endDate
      - exportType
      properties:
        startDate:
          type: string
          format: date
          description: Start date in YYYY-MM-DD format. Must not be older than one year.
        endDate:
          type: string
          format: date
          description: End date in YYYY-MM-DD format. The requested period cannot exceed 365 days or include data older than
            one year.
        exportType:
          $ref: '#/components/schemas/ExportType'
        fileType:
          description: Optional output format. Defaults to JSONL when omitted.
          default: JSONL
          allOf:
          - $ref: '#/components/schemas/AsyncExportFileType'
    AsyncExportCreateResponse:
      type: object
      properties:
        jobId:
          type: string
          format: uuid
        status:
          $ref: '#/components/schemas/AsyncExportJobStatus'
    AsyncExportStatusResponse:
      type: object
      properties:
        status:
          $ref: '#/components/schemas/AsyncExportJobStatus'
        downloadURL:
          type: string
          format: uri
          nullable: true
    ExportType:
      type: string
      enum:
      - SMART_STRENGTH_WORKOUTS
      - SMART_STRENGTH_ASSESSMENTS
      - FLEXIBILITY_MEASUREMENTS
      - BODY_MEASUREMENTS
    AsyncExportFileType:
      type: string
      enum:
      - JSON
      - JSONL
      - CSV
    AsyncExportJobStatus:
      type: string
      enum:
      - IN_PROGRESS
      - DONE
      - FAILED
      - EXPIRED
    ErrorDTO:
      type: object
      properties:
        message:
          type: string
  responses:
    BadRequest:
      description: Invalid request parameters or body.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorDTO'
    Unauthorized:
      description: Missing, malformed, or invalid API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorDTO'
    Forbidden:
      description: API key is not authorized to access this resource.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorDTO'
    NotFound:
      description: Requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorDTO'
    InternalServerError:
      description: Unexpected server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorDTO'