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.
- admin
- client
- provider
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
tokenfrom 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 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 |
| 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 |
| 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:
- time
- distance
- hr
- elevation
- location
- power
- speed
- cadence
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:
- 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
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