NAV
shell

Introduction

Welcome to the Quevita Wearables Gateway (QWG) API. This API facilitates connection to various 3rd-party activity and wearable services. It combines multiple API's and exposes one clean interface to be implemented in your product.

Write us if you have any questions or need more information!
qwg@quevita.com

Available Wearables

The list of connectable services is constantly growing and includes the following wearables right now:

Wearable Data Website
Strava Activity strava.com
Garmin Activity, Daily Steps, Sleep garmin.com
Wahoo Activity wahoofitness.com
Fitbit Activity, Daily Steps, Sleep fitbit.com
Polar Activity, Daily Steps, Sleep polar.com
Suunto Activity, Daily Steps suunto.com

Are you interested in the QWG, but your are missing an integration from the list above? Write us and we'll be happy to talk to you about connecting new wearables and services!

Server URL

A deployment of QWG consists of three independently running services.

This documentation covers mainly communication with the client service, as this is the component which is responsible for exposing functionality to the clients (meaning: connected products). The client endpoint depends on the actual deployment and will be communicated to you during setup of QWG.

This documentation references the client endpoint as <client_host>.

Authentication

Authenticate requests

To authorize a request, use this header:

# With shell, you can just pass the correct header with each request
curl "api_endpoint_here" \
  -H "Authorization: Bearer <your_valid_token>"

Make sure to replace <your_valid_token> with real token.

The requests to the API need to be authenticated. QWG uses JWT tokens to authorize access to the API. QWG expects for the token to be included in all API requests to the server in a header that looks like the following:

Authorization: Bearer <your_valid_token>

Obtain token

To obtain a valid token, use this code:

curl -X POST <client_host>/auth/signin \
  -H "Content-Type: application/json" \
  -d '{ "name": "<client_name>", "secret": "<client_secret>" }'

Make sure to replace <client_name> and <client_secret> with your credentials.

Retrieve a valid JWT token.

HTTP Request

POST <client_host>/auth/signin

HTTP Body

{
  "name": "<client_name>",
  "secret": "<client_secret>"
}

HTTP Response

{
    "id": 1,
    "name": "client",
    "secret": "verysecret",
    "webhookUrl": "https://example.com/qwg/webhook",
    "enabledServices": [],
    "storageConfig": {...},
    "createdAt": "2022-10-18T12:36:47.838Z",
    "updatedAt": "2022-10-18T12:36:58.276Z",
    "deletedAt": null,
    "token": "<your_valid_JWT_token>"
}

Use the token from the response to authenticate requests to the API.

Users

User properties

Attribute Type Description
id string UID of the user
clientUserId string Given ID on the client system
email string (Optional) Email of the user
clientId int ID of the Client object
createdAt datetime Creation timestamp
updatedAt datetime Last update timestamp
deletedAt datetime Delete timestamp

Show user by id

curl "<client_host>/users/8d3cee76-ce9f-4c38-b5db-bf95211f410c" \
  -H "Authorization: <token>"

The above command returns JSON structured like this:

{
    "id": "8d3cee76-ce9f-4c38-b5db-bf95211f410c",
    "clientUserId": "5647",
    "email": "user@example.com",
    "clientId": 1,
    "createdAt": "2022-03-29T13:09:23.047Z",
    "updatedAt": "2022-03-29T13:09:23.048Z",
    "deletedAt": null
}

HTTP Request

GET <client_host>/users/:id

This endpoint retrieves a specific user.

Query Parameters

Parameter Default Description
id -- UID of the user to retrieve

Show user by clientUserId

curl "<client_host>/users/client-user-id/5647" \
  -H "Authorization: <token>"

The above command returns JSON structured like this:

{
    "id": "8d3cee76-ce9f-4c38-b5db-bf95211f410c",
    "clientUserId": "5647",
    "email": "user@example.com",
    "clientId": 1,
    "createdAt": "2022-03-29T13:09:23.047Z",
    "updatedAt": "2022-03-29T13:09:23.048Z",
    "deletedAt": null
}

HTTP Request

GET <client_host>/users/client-user-id/:clientUserId

This endpoint retrieves a specific user.

Query Parameters

Parameter Default Description
clientUserId -- clientUserId of the user to retrieve

Show user by email

curl "<client_host>/users/email/user@example.com" \
  -H "Authorization: <token>"

The above command returns JSON structured like this:

{
    "id": "8d3cee76-ce9f-4c38-b5db-bf95211f410c",
    "clientUserId": "5647",
    "email": "user@example.com",
    "clientId": 1,
    "createdAt": "2022-03-29T13:09:23.047Z",
    "updatedAt": "2022-03-29T13:09:23.048Z",
    "deletedAt": null
}

HTTP Request

GET <client_host>/users/email/:email

This endpoint retrieves a specific user.

Query Parameters

Parameter Default Description
email -- email of the user to retrieve

Create user

curl <client_host>/users \
  -X POST \
  -H "Authorization: <token>" \
  -d '{
    "clientUserId": "5647",
    "email": "user@example.com"
  }'

The above command returns JSON structured like this:

{
    "id": "8d3cee76-ce9f-4c38-b5db-bf95211f410c",
    "clientUserId": "5647",
    "email": "user@example.com",
    "clientId": 1,
    "createdAt": "2022-03-29T13:09:23.047Z",
    "updatedAt": "2022-03-29T13:09:23.048Z",
    "deletedAt": null
}

HTTP Request

POST <client_host>/users

This endpoint creates a user.

Query Parameters

Parameter Default Description
id -- UID of the user to retrieve

Body Params

Parameter Default Required
clientUserId -- true
email null false

Update user

curl <client_host>/users \
  -X PUT \
  -H "Authorization: <token>" \
  -d '{
    "clientUserId": "5647",
    "email": "user@example.com"
  }'

The above command returns JSON structured like this:

{
    "id": "8d3cee76-ce9f-4c38-b5db-bf95211f410c",
    "clientUserId": "5647",
    "email": "user@example.com",
    "clientId": 1,
    "createdAt": "2022-03-29T13:09:23.047Z",
    "updatedAt": "2022-03-29T13:09:23.048Z",
    "deletedAt": null
}

HTTP Request

PUT <client_host>/users/:id

This endpoint creates a user.

Query Parameters

Parameter Default Description
id -- UID of the user to retrieve

Body Params

Parameter Default Required
clientUserId -- false
email null false

Delete user

curl <client_host>/users/8d3cee76-ce9f-4c38-b5db-bf95211f410c \
  -X DELETE \
  -H "Authorization: <token>" \

The above command returns JSON structured like this:

{
    "id": "8d3cee76-ce9f-4c38-b5db-bf95211f410c",
    "clientUserId": "5647",
    "email": "user@example.com",
    "clientId": 1,
    "createdAt": "2022-03-29T13:09:23.047Z",
    "updatedAt": "2022-03-29T13:09:23.048Z",
    "deletedAt": null
}

HTTP Request

DELETE <client_host>/users/:id

This endpoint creates a user.

Query Parameters

Parameter Default Description
id -- UID of the user to retrieve

Services

Service properties

Attribute Type Description
id int ID of the Identity
clientId int ID of the client
name string Name of the service
type string Service type
settings object Service settings
createdAt datetime Creation timestamp
updatedAt datetime Last update timestamp

Service settings properties

Attribute Type Description
clientCallback string URL for redirection after connection authorization flow

All Services

curl "<client_host>/services" \
  -H "Authorization: <token>"

The above command returns JSON structured like this:

[
    {
        "id": 1,
        "clientId": 1,
        "name": "client-x-strava",
        "type": "strava",
        "settings": {
            "clientCallback": "https://quevita.com/qwg/connection_callback"
        },
        "createdAt": "2022-03-29T13:07:56.695Z",
        "updatedAt": "2022-03-29T13:08:26.421Z",
    }
]

HTTP Request

GET <client_host>/services

This endpoint retrieves all services.

Init connection

curl "<client_host>/services/connect/client-x-strava/init?userId=8d3cee76-ce9f-4c38-b5db-bf95211f410c&state=4e6374dl" \
  -H "Authorization: <token>"

The above command returns an URL structured like this:

https://<client_host>/grant/connect/strava?qwg-token=<random_token>

HTTP Request

GET <client_host>/services/connect/:serviceName/init?userId=:userId&state=:state

This endpoint initiates a connection request between given service and user. It returns an URL to the User authorization flow entrypoint.

After completion of the User authorization flow, the user will be redirected to the URL defined in clientCallback of the service settings. QWG will submit the following properties as query params:

Parameter Description
userId UID of the connected User
clientUserEmail Email of the connected User
clientUserId ID of the connected User in the client's application
identityId ID of the created Identity
serviceName Name of the connected Service
serviceType Type of the connected Service
state Client-provided state from connection init
error Error description if connection was no success

Path / Query Parameters

Parameter Default Description
serviceName -- UID of the User to retrieve
userId -- UID of the User to retrieve
state -- (Optional) Client-defined state which will be included in the callback

Identities

Identity properties

Attribute Type Description
id int ID of the Identity
userId string UID of the User
serviceId int ID of the Service
createdAt datetime Creation timestamp
updatedAt datetime Last update timestamp
service object Inline Service object

All Identities

curl "<client_host>/identities" \
  -H "Authorization: <token>"

The above command returns JSON structured like this:

[
    {
        "id": 1,
        "externalId": "5105067",
        "userId": "8d3cee76-ce9f-4c38-b5db-bf95211f410c",
        "serviceId": 1,
        "createdAt": "2022-03-30T06:32:33.370Z",
        "updatedAt": "2022-03-30T06:32:33.371Z",
        "service": {
            "id": 1,
            "clientId": 1,
            "name": "client-x-strava",
            "type": "strava",
            "createdAt": "2022-03-29T13:07:56.695Z",
            "updatedAt": "2022-03-29T13:08:26.421Z"
        }
    }, 
    {...}
]

HTTP Request

GET <client_host>/identities

This endpoint retrieves all identities.

Identity by User

curl "<client_host>/identities/user/8d3cee76-ce9f-4c38-b5db-bf95211f410c" \
  -H "Authorization: <token>"

The above command returns JSON structured like this:

[
    {
        "id": 1,
        "externalId": "5105067",
        "userId": "8d3cee76-ce9f-4c38-b5db-bf95211f410c",
        "serviceId": 1,
        "createdAt": "2022-03-30T06:32:33.370Z",
        "updatedAt": "2022-03-30T06:32:33.371Z",
        "service": {
            "id": 1,
            "clientId": 1,
            "name": "client-x-strava",
            "type": "strava",
            "createdAt": "2022-03-29T13:07:56.695Z",
            "updatedAt": "2022-03-29T13:08:26.421Z"
        }
    }, 
    {...}
]

HTTP Request

GET <client_host>/identities/user/:userId

This endpoint retrieves all identities of a user.

Query Parameters

Parameter Default Description
userId -- UID of the User to retrieve

Identity by Service

curl "<client_host>/identities/service/1" \
  -H "Authorization: <token>"

The above command returns JSON structured like this:

[
    {
        "id": 1,
        "externalId": "5105067",
        "userId": "8d3cee76-ce9f-4c38-b5db-bf95211f410c",
        "serviceId": 1,
        "createdAt": "2022-03-30T06:32:33.370Z",
        "updatedAt": "2022-03-30T06:32:33.371Z",
        "service": {
            "id": 1,
            "clientId": 1,
            "name": "client-x-strava",
            "type": "strava",
            "createdAt": "2022-03-29T13:07:56.695Z",
            "updatedAt": "2022-03-29T13:08:26.421Z"
        }
    }, 
    {...}
]

HTTP Request

GET <client_host>/identities/service/:serviceId

This endpoint retrieves all identities of a specific service.

Query Parameters

Parameter Default Description
serviceId -- ID of the Service for retrieved identities

Identity by Service type

curl "<client_host>/identities/service-type/strava" \
  -H "Authorization: <token>"

The above command returns JSON structured like this:

[
    {
        "id": 1,
        "externalId": "5105067",
        "userId": "8d3cee76-ce9f-4c38-b5db-bf95211f410c",
        "serviceId": 1,
        "createdAt": "2022-03-30T06:32:33.370Z",
        "updatedAt": "2022-03-30T06:32:33.371Z",
        "service": {
            "id": 1,
            "clientId": 1,
            "name": "client-x-strava",
            "type": "strava",
            "createdAt": "2022-03-29T13:07:56.695Z",
            "updatedAt": "2022-03-29T13:08:26.421Z"
        }
    }, 
    {...}
]

HTTP Request

GET <client_host>/identities/service-type/:serviceType

This endpoint retrieves all identities of a specific service type.

Query Parameters

Parameter Default Description
serviceType -- type of the Service for retrieved identities

Identity by User and Service type

curl "<client_host>/identities/user-connected/8d3cee76-ce9f-4c38-b5db-bf95211f410c/strava" \
  -H "Authorization: <token>"

The above command returns JSON structured like this:

{
    "id": 1,
    "externalId": "5105067",
    "userId": "8d3cee76-ce9f-4c38-b5db-bf95211f410c",
    "serviceId": 1,
    "createdAt": "2022-03-30T06:32:33.370Z",
    "updatedAt": "2022-03-30T06:32:33.371Z",
    "service": {
        "id": 1,
        "clientId": 1,
        "name": "client-x-strava",
        "type": "strava",
        "createdAt": "2022-03-29T13:07:56.695Z",
        "updatedAt": "2022-03-29T13:08:26.421Z"
    }
}

HTTP Request

GET <client_host>/identities/user-connected/:userId/:serviceType

This endpoint returns an the Identity of given :userId and :serviceType. It should be used to check whether a specific user is connected to a service.

Query Parameters

Parameter Default Description
userId -- UID of the User for the retrieved identity
serviceType -- type of the Service for the retrieved identity

Delete Identity

curl <client_host>/identities/1 \
  -X DELETE \
  -H "Authorization: <token>" \

The above command returns JSON structured like this:

{
    "id": 1,
    "externalId": "5105067",
    "userId": "8d3cee76-ce9f-4c38-b5db-bf95211f410c",
    "serviceId": 1,
    "createdAt": "2022-03-30T06:32:33.370Z",
    "updatedAt": "2022-03-30T06:32:33.371Z",
    "service": {
        "id": 1,
        "clientId": 1,
        "name": "client-x-strava",
        "type": "strava",
        "createdAt": "2022-03-29T13:07:56.695Z",
        "updatedAt": "2022-03-29T13:08:26.421Z"
    }
}

HTTP Request

DELETE <client_host>/identities/:id

This endpoint deletes an Identity and deauthorizes the connection to the corresponding service.

Query Parameters

Parameter Default Description
id -- UID of the Identity

Activities

Activity properties

Attribute Type Description
id string UID of the Activity
externalId string ID on the source service
source string Name of the source service
name string Name
description text Description
type string Sport type of activity
subType string Sport subType of activity
startDate datetime Beginning of activity in UTC
startDateLocal datetime Beginning of activity in local timezone
timezone string Timezone of activity
movingTime int Duration of workout in seconds
elapsedTime int Elapsed time during workout in seconds
distance int Distance in meters
ascent int Ascent in meters
elevationHigh int Highest elevation during workout in meters
elevationLow int Lowest elevation during workout in meters
calories int Active calories
gear string Gear (Shoes, Bike, ...) used for workout
device string Device/Wearable that recorded the activity
averageHeartrate int Avg. HR of activity
maxHeartrate int Max. HR of activity
averageSpeed int Avg. speed of activity in m/s
maxSpeed int Max. speed of activity in m/s
averageCadence int Avg. cadence (cycling/running) of activity in rpm
numSessions int Number of sessions (multisport) in this activity
laps array Array of Laps
availableStreams array Available data streams for this activity
boundingBoxNE coordinate North-East corner of coordinate bounding box
boundingBoxSW coordinate South-West corner of coordinate bounding box

Lap properties

Attribute Type Description
name string Name
type string Type of Lap
streamStart int Start index for data stream
streamEnd int End index for data stream
startDate datetime Beginning of lap in UTC
startDateLocal datetime Beginning of lap in local timezone
movingTime int Duration of lap in seconds
elapsedTime int Elapsed time during lap in seconds
distance int Distance in meters
ascent int Ascent in meters
elevationHigh int Highest elevation during lap in meters
elevationLow int Lowest elevation during lap in meters
averageHeartrate int Avg. HR of lap
maxHeartrate int Max. HR of lap
averageSpeed int Avg. speed of lap in m/s
maxSpeed int Max. speed of lap in m/s
averageCadence int Avg. cadence (cycling/running) of lap in rpm

Activity by id

curl "<client_host>/activities/3747ebda-c86f-44b5-a6bb-2414b7fbcee4" \
  -H "Authorization: <token>"

The above command returns JSON structured like this:

{
    "id": "3747ebda-c86f-44b5-a6bb-2414b7fbcee4",
    "externalId": "12345678",
    "source": "Strava",
    "name": "Evening ride",
    "description": "",
    "type": "cycling",
    "subType": "generic",
    "startDate": "2023-03-02T15:33:37Z",
    "startDateLocal": "2023-03-02T16:33:37+01:00",
    "timezone": "Europe/Zurich",
    "movingTime": 6805,
    "elapsedTime": 7496,
    "distance": 37614,
    "ascent": 678,
    "elevationHigh": 946.2,
    "elevationLow": 510,
    "calories": 140,
    "gear": "BMC Kaius 01 THREE",
    "device": "Suunto 9",
    "averageSpeed": 5.527,
    "maxSpeed": 17.2,
    "numSessions": 0,
    "laps": [
        {
            "name": "Lap 1",
            "type": "default",
            "streamStart": 0,
            "streamEnd": 1459,
            "movingTime": 1552,
            "elapsedTime": 1671,
            "startDate": "2023-03-02T15:33:37Z",
            "startDateLocal": "2023-03-02T16:33:37+01:00",
            "distance": 10000,
            "ascent": 103,
            "elevationHigh": 576.2,
            "elevationLow": 510,
            "averageSpeed": 6.44,
            "maxSpeed": 13
        },
        {...}
    ],
    "availableStreams": [
        "time",
        "distance",
        "elevation",
        "location",
        "speed"
    ],
    "boundingBoxNE": [
        46.993037,
        7.541595
    ],
    "boundingBoxSW": [
        46.917206,
        7.437174
    ]
}

HTTP Request

GET <client_host>/activities/:id

This endpoint retrieves an activity by id.

Query Parameters

Parameter Default Description
:id -- ID of the Activity to retrieve

Activity Stream by id

curl "<client_host>/activities/8d3cee76-ce9f-4c38-b5db-bf95211f410c/streams" \
  -H "Authorization: <token>"

The above command returns JSON structured like this:

{
    "time": "https://<url_to_time_stream>",
    "distance": "https://<url_to_distance_stream>",
    "elevation": "https://<url_to_elevation_stream>",
    "location": "https://<url_to_location_stream>",
    "speed": "https://<url_to_speed_stream>",
    "hr": "https://<url_to_hr_stream>",
    "power": "https://<url_to_power_stream>",
    "cadence": "https://<url_to_cadence_stream>"
}

HTTP Request

GET <client_host>/activities/:id/streams

This endpoint retrieves links to all available streams for the given activity. The generated links expire after 15 minutes. The data format of the streams can be found here

Query Parameters

Parameter Default Description
:id -- ID of the Activity to retrieve

Webhooks

QWG sends webhooks to the connected client to reduce the number of requests that need to be done to the API.

Example Webhook payload

{
    "id": "0101f142-ae2f-496c-ad5a-4c3da2123514",
    "object": "resource",
    "objectId": "c37a00e0-2100-4f79-8f77-10e73a9e8eaa",
    "objectMetadata": {
        "resourceType": "Activity"
    },
    "event": "create",
    "clientId": 1,
    "user": {
        "id": "44223c59-eda8-4c68-912c-048e221a51b5",
        "clientUserId": "7846789"
    },
    "data": {
        "id": "c37a00e0-2100-4e79-8f77-19e73a9e8eaa",
        "externalId": "10682224266",
        "source": "Garmin",
        "name": "Morning walk",
        "description": "",
        "type": "walking",
        "subType": "generic",
        "startDate": "2023-03-12T16:36:42Z",
        "startDateLocal": "2023-03-12T17:36:42+01:00",
        "timezone": "Europe/Zurich",
        "movingTime": 4390.922,
        "elapsedTime": 4390.922,
        "distance": 4410.74,
        "ascent": 41,
        "descent": 30,
        "elevationHigh": 455.2,
        "elevationLow": 426.6,
        "startLocation": [47.34950065695579, 7.906047415561776],
        "endLocation": [47.34950065695579, 7.906047415561776],
        "calories": 278,
        "device": "garmin fenix6",
        "averageHeartrate": 96,
        "maxHeartrate": 133,
        "averageSpeed": 1.23,
        "maxSpeed": 1.512,
        "averageCadence": 41,
        "maxCadence": 109,
        "numSessions": 0,
        "laps": [
            {
                "name": "Lap 1",
                "type": "distance",
                "streamStart": 0,
                "streamEnd": 111,
                "movingTime": 734.228,
                "elapsedTime": 734.228,
                "startDate": "2023-03-12T16:36:42Z",
                "startDateLocal": "2023-03-12T17:36:42+01:00",
                "distance": 1000,
                "ascent": 2,
                "descent": 12,
                "elevationHigh": 444.4,
                "elevationLow": 433.6,
                "averageHeartrate": 97,
                "maxHeartrate": 110,
                "averageSpeed": 1.4,
                "maxSpeed": 1.512,
                "averageCadence": 55,
                "maxCadence": 62,
                "calories": 52
            },
            {...}
        ],
        "availableStreams": [
            "time",
            "distance",
            "hr",
            "elevation",
            "location",
            "speed",
            "cadence"
        ],
        "boundingBoxNE": [47.34950065695579, 7.906047415561776],
        "boundingBoxSW": [47.34950065695579, 7.906047415561776]
    },
    "url": "https://<client_application_url>/webhooks/qwg",
    "createdAt": "2023-03-12T17:51:37.217Z"
}

Webhook Properties

Attribute Type Description
id string UID of the webhook
object string Object identifier
objectId string ID of the object
objectMetadata object Metadata of object
event string [create, update, delete]
clientId int ID of the client
user object {id, clientUserId} of the user
url string The url to which the webhook is sent
createdAt datetime Creation date of the webhook (first try)
data object The actual data object

Webhook Request

Webhooks will be sent to a client-defined URL as POST requests. All data is sent in the request body.

The server which receives the endpoint should respond within 3s with a 2XX HTTP status code. Otherwise the request will be logged as failed and retried at a later time.

A webhook will be retried 20 times with a constant constant backoff time of 1 minute.

Errors

The QWG API uses the following error codes:

Error Code Meaning
400 Bad Request -- Your request is invalid.
401 Unauthorized -- Your Authorization is wrong.
403 Forbidden -- You are not allowed to call this endpoint.
404 Not Found -- The specified resource could not be found.
405 Method Not Allowed -- You tried to access an endpoint with an invalid method.
406 Not Acceptable -- You requested a format that isn't json.
500 Internal Server Error -- We had a problem with our server. Try again later.
503 Service Unavailable -- We're temporarily offline for maintenance. Please try again later.

Appendix

Activity Streams

Example of a location stream

{
    "name": "location",
    "count": 6801,
    "data": [
        [ 46.948460, 7.458605 ],
        [ 46.948442, 7.458919 ],
        ... // 6799 more
    ]
}

Streams always have the following format:

Attribute Type Description
name string Name of the stream (location, time, heartrate, ...)
count int Number of datapoints in the stream
data array Array of datapoints

Streams of the same activity always have the same number of datapoints. This means the same index on the different streams yields data from exactly the same point in time.

Available stream types are:

Sport Types

All sport types as JSON

{
    "SPORT_TYPES": [
        "generic", "running", "cycling", "transition", "fitness_equipment", "swimming", "basketball", "handball", "volleyball", "softball", "soccer", "baseball", "american_football", "tennis", "table_tennis", "training", "walking", "cross_country_skiing", "ski_touring", "alpine_skiing", "snowboarding", "rowing", "mountaineering", "hiking", "multisport", "paddling", "flying", "e_biking", "motorcycling", "boating", "driving", "golf", "hang_gliding", "horseback_riding", "hunting", "fishing", "inline_skating", "rock_climbing", "sailing", "ice_skating", "sky_diving", "snowshoeing", "snowmobiling", "stand_up_paddleboarding", "surfing", "wakeboarding", "water_skiing", "kayaking", "rafting", "windsurfing", "kitesurfing", "tactical", "jumpmaster", "boxing", "floor_climbing", "diving", "aerobics", "ice_hockey", "hockey", "orienteering", "skateboarding", "wheelchair", "yoga", "archery"
    ],
    "SPORT_SUB_TYPES": [
        "generic", "treadmill", "street", "trail", "track", "spin", "indoor_cycling", "road", "mountain", "downhill", "recumbent", "cyclocross", "hand_cycling", "track_cycling", "indoor_rowing", "elliptical", "stair_climbing", "lap_swimming", "open_water", "flexibility_training", "strength_training", "warm_up", "match", "exercise", "challenge", "indoor_skiing", "cardio_training", "cross_training", "indoor_walking", "e_bike_fitness", "bmx", "casual_walking", "speed_walking", "bike_to_run_transition", "run_to_bike_transition", "swim_to_bike_transition", "atv", "motocross", "backcountry", "resort", "rc_drone", "wingsuit", "whitewater", "skate_skiing", "yoga", "pilates", "indoor_running", "gravel_cycling", "e_bike_mountain", "commuting", "mixed_surface", "navigate", "track_me", "map", "single_gas_diving", "multi_gas_diving", "gauge_diving", "apnea_diving", "apnea_hunting", "virtual_activity", "obstacle", "triathlon", "duathlon", "indoor_training", "football"
    ]
}

Types

All available (sport) types:

Sub-Types