# Synchronous Exports

Synchronous exports return one JSON page immediately. Use them for incremental syncs and reporting flows that do not need a downloadable file.

Responses are paginated. Each response contains up to 100 rows and may include a `nextCursor` for the next page.

Synchronous event exports are limited to recent data. Smart Strength workouts, Smart Strength assessments, flexibility measurements, and body measurements can go back only one month. Weekly analytics is the exception and can be queried synchronously for up to 365 days.

Event exports require member opt-in
Event exports (Smart Strength workouts, Smart Strength assessments, body measurements, and flexibility measurements) only include records for members who have opted in to health data and consumer-to-business (C2B) sharing. Records for members without this opt-in are excluded, so a response may contain fewer rows than the total number of events at the gym. Weekly analytics metrics are aggregated and are not subject to this filter.

Every user-related export item includes `externalAccountId`, a unique and stable identifier for the member's account. Store this ID alongside the data you export so you can reconcile records across exports and delete a specific member's previously exported data later if needed (for example, when they opt out).

## Query parameters

All synchronous endpoints use the same query parameters.

| Parameter | Required | Description |
|  --- | --- | --- |
| `startDate` | Yes | Start date in `YYYY-MM-DD` format. |
| `endDate` | Yes | End date in `YYYY-MM-DD` format. Must be the same as or after `startDate`. |
| `cursor` | No | Pagination cursor returned as `nextCursor` by the previous response. |


If the response contains `nextCursor`, call the same endpoint again with the same `startDate` and `endDate` and the returned cursor. When `nextCursor` is `null`, the export is complete.

`startDate` and `endDate` are interpreted as UTC calendar days, and timestamp fields in the response (such as `eventTimestamp`) are returned in UTC.

## Date range limits

| Endpoint | Maximum range | Additional rule |
|  --- | --- | --- |
| `GET /api/v1/data/analytics` | 365 days | None |
| `GET /api/v1/data/smart-strength-workouts` | 30 days | Event data can go back only one month. `startDate` must be within the last month. |
| `GET /api/v1/data/smart-strength-assessments` | 30 days | Event data can go back only one month. `startDate` must be within the last month. |
| `GET /api/v1/data/flexibility-measurements` | 30 days | Event data can go back only one month. `startDate` must be within the last month. |
| `GET /api/v1/data/body-measurements` | 30 days | Event data can go back only one month. `startDate` must be within the last month. |


For event data older than one month, use [Asynchronous Exports](/data-hub/async-exports).

## Weekly analytics

```http
GET /api/v1/data/analytics?startDate=2026-01-01&endDate=2026-03-31
x-api-key: <api-key>
```

```json
{
  "gym": {
    "name": "EGYM Gym Berlin"
  },
  "data": [
    {
      "periodStart": "2026-03-23",
      "periodEnd": "2026-03-29",
      "metricType": "workouts",
      "metricKey": "total",
      "metricSubType": "smart_strength",
      "value": 128.0
    }
  ],
  "nextCursor": null
}
```

## Smart Strength workouts

```http
GET /api/v1/data/smart-strength-workouts?startDate=2026-06-01&endDate=2026-06-15
x-api-key: <api-key>
```

```json
{
  "gym": {
    "name": "EGYM Gym Berlin"
  },
  "data": [
    {
      "eventTimestamp": "2026-06-12T09:21:13Z",
      "externalAccountId": "member-123",
      "mmsMembershipId": "mms-abc-123",
      "isGuestUser": false,
      "firstName": "Alex",
      "lastName": "Example",
      "email": "alex@example.com",
      "machineType": "LEG_PRESS",
      "trainingMethod": "ADAPTIVE",
      "operationMode": "STANDARD",
      "trainingVisualization": "CURVE"
    }
  ],
  "nextCursor": null
}
```

## Smart Strength assessments

```http
GET /api/v1/data/smart-strength-assessments?startDate=2026-06-01&endDate=2026-06-15
x-api-key: <api-key>
```

Assessment items include the assessed `bodyRegion`, the assessment `typeId`, and the human-readable `activityName`.

```json
{
  "gym": {
    "name": "EGYM Gym Berlin"
  },
  "data": [
    {
      "eventTimestamp": "2026-06-12T09:21:13Z",
      "bodyRegion": "LOWER",
      "typeId": "M4",
      "activityName": "Leg Press",
      "measurementCompleted": true,
      "chainName": "EGYM Chain",
      "firstName": "Alex",
      "lastName": "Example",
      "email": "alex@example.com",
      "externalAccountId": "member-123",
      "mmsMembershipId": "mms-abc-123"
    }
  ],
  "nextCursor": null
}
```

## Body measurements

```http
GET /api/v1/data/body-measurements?startDate=2026-06-01&endDate=2026-06-15
x-api-key: <api-key>
```

Body measurement items include `measurementSource`, which identifies where the measurement originated (for example, `SCALE`, `FITNESS_HUB`, or `ASSESSMENT`).

```json
{
  "gym": {
    "name": "EGYM Gym Berlin"
  },
  "data": [
    {
      "externalAccountId": "member-123",
      "mmsMembershipId": "mms-abc-123",
      "eventTimestamp": "2026-06-12T09:21:13Z",
      "measurementSource": "SCALE",
      "isStaff": true,
      "measurementCompleted": true,
      "chainName": "EGYM Chain",
      "firstName": "Alex",
      "lastName": "Example",
      "email": "alex@example.com"
    }
  ],
  "nextCursor": null
}
```

## Flexibility measurements

```http
GET /api/v1/data/flexibility-measurements?startDate=2026-06-01&endDate=2026-06-15
x-api-key: <api-key>
```

Flexibility measurement items include `measurementType`, which identifies the assessed movement (for example, `SHOULDER`, `HIP`, or `SQUAT`).

```json
{
  "gym": {
    "name": "EGYM Gym Berlin"
  },
  "data": [
    {
      "externalAccountId": "member-123",
      "mmsMembershipId": "mms-abc-123",
      "eventTimestamp": "2026-06-12T09:21:13Z",
      "measurementType": "SHOULDER",
      "isStaff": true,
      "measurementCompleted": true,
      "chainName": "EGYM Chain",
      "firstName": "Alex",
      "lastName": "Example",
      "email": "alex@example.com"
    }
  ],
  "nextCursor": null
}
```

## Opted-out users

```http
GET /api/v1/data/opted-out-users
x-api-key: <api-key>
```

Returns the members at the gym location who have **not** opted in to health data and consumer-to-business (C2B) sharing. Because these members are excluded from all event exports, use this endpoint to identify accounts whose previously exported data must be deleted to comply with GDPR and other data-protection requirements.

This endpoint takes no query parameters and is not paginated. It returns all opted-out users for the gym location in a single response. Each item contains only `externalAccountId` and `lastSeenAt`, the UTC timestamp when the member was last seen.

No personal details (name or email) are returned for opted-out members. EGYM shares only the `externalAccountId`, which is the same identifier included in the export endpoints. Match it against the data you previously exported to delete that member's records, so you can meet GDPR and other data-protection requirements without EGYM transmitting any identifiable user information.

```json
{
  "gym": {
    "name": "EGYM Gym Berlin"
  },
  "data": [
    {
      "externalAccountId": "member-456",
      "lastSeenAt": "2026-05-30T18:42:00Z"
    }
  ]
}
```

Use the [API Reference](/data-hub/api) for the exact fields returned by each endpoint.