Install
openclaw skills install strong-appInteract with the Strong v6 workout tracker REST API — login, list exercises, fetch workout logs and templates, manage folders, tags, measurements, and widgets. Use when the user asks about their Strong app workouts, exercises, or training data.
openclaw skills install strong-appUnofficial REST API for the Strong workout tracking app (v6+). All API
interaction goes through the CLI dispatcher at scripts/strong_runner.py.
Warning: This API is reverse-engineered and unofficial. Use at your own risk.
| Variable | Description |
|---|---|
STRONG_USERNAME | Strong account username or email |
STRONG_PASSWORD | Strong account password |
Both must be set before running any command. The CLI reads them automatically.
All commands are invoked via:
python3 scripts/strong_runner.py <command> [--param value ...]
Every command authenticates automatically (login is handled internally), prints JSON to stdout, and exits. No manual token management is needed.
_links, _embedded, and total.Authenticate and return tokens. Rarely needed directly — all other commands log in automatically.
python3 scripts/strong_runner.py login
Output: { "accessToken": "eyJ...", "refreshToken": "kf3Z...", "userId": "uuid" }
Renew an expired access token without re-entering credentials.
python3 scripts/strong_runner.py refresh_token
Output: { "accessToken": "eyJ...", "refreshToken": "...", "expiresIn": 1200, "userId": "uuid" }
Fetch the authenticated user's profile, preferences, and purchases.
python3 scripts/strong_runner.py get_profile
Response keys: id, created, lastChanged, username, email, emailVerified, name, goal, preferences, purchases, legacyPurchase, legacyGoals, startHistoryFromDate, firstWeekDay, availableLogins, migrated.
Fetch all exercises in the user's library.
python3 scripts/strong_runner.py list_exercises
Response (HAL):
{
"_links": { "self": {...} },
"_embedded": {
"measurement": [
{
"id": "uuid",
"created": "ISO8601",
"lastChanged": "ISO8601",
"name": { "custom": "Bench Press (Barbell)" },
"instructions": { "custom": "..." },
"media": [],
"cellTypeConfigs": [{ "cellType": "...", "mandatory": true }],
"measurementType": "EXERCISE"
}
]
},
"total": 360
}
python3 scripts/strong_runner.py get_exercise --measurement_id <uuid>
| Parameter | Required | Description |
|---|---|---|
--measurement_id | Yes | Exercise/measurement UUID |
Fetch all workout templates (routines).
python3 scripts/strong_runner.py list_templates
Response (HAL):
{
"_embedded": {
"template": [
{
"id": "uuid",
"created": "ISO8601",
"lastChanged": "ISO8601",
"name": { "custom": "Push Day" },
"access": "PRIVATE",
"logType": "TEMPLATE",
"_embedded": {
"cellSetGroup": [
{ "id": "uuid", "cellSets": [...] }
]
}
}
]
},
"total": 75
}
python3 scripts/strong_runner.py get_template --template_id <uuid>
| Parameter | Required | Description |
|---|---|---|
--template_id | Yes | Template UUID |
Response keys: id, created, lastChanged, name, access, logType, _embedded.cellSetGroup[] (each with id, cellSets[]).
Fetch all completed workout sessions.
python3 scripts/strong_runner.py list_logs
Response (HAL):
{
"_embedded": {
"log": [
{
"id": "uuid",
"created": "ISO8601",
"lastChanged": "ISO8601",
"name": { "custom": "Push Day" },
"access": "PUBLIC",
"startDate": "ISO8601",
"endDate": "ISO8601",
"logType": "WORKOUT",
"_embedded": {
"cellSetGroup": [
{ "id": "uuid", "cellSets": [...] }
]
}
}
]
},
"total": 552
}
Fetch a single workout log. Pass --include_measurement to embed exercise data.
python3 scripts/strong_runner.py get_log --log_id <uuid>
python3 scripts/strong_runner.py get_log --log_id <uuid> --include_measurement
| Parameter | Required | Description |
|---|---|---|
--log_id | Yes | Log UUID |
--include_measurement | No | Include exercise/measurement data in the response |
Response keys: id, created, lastChanged, name, access, startDate, endDate, logType, _embedded.cellSetGroup[] (each with id, cellSets[], _embedded.cellSet[]).
Fetch workout template folders.
python3 scripts/strong_runner.py list_folders
Response (HAL): _embedded.folder[] with keys: id, created, lastChanged, name, index.
Fetch exercise tags/categories.
python3 scripts/strong_runner.py list_tags
Response (HAL): _embedded.tag[] with keys: id, created, name, color, isGlobal.
Fetch dashboard widget configuration.
python3 scripts/strong_runner.py list_widgets
Response (HAL): _embedded.widget[] with keys: id, created, lastChanged, index, widgetType, parameters.
Generate a shareable link for a workout template.
python3 scripts/strong_runner.py share_template --template_id <uuid>
| Parameter | Required | Description |
|---|---|---|
--template_id | Yes | Template UUID |
Generate a shareable link for a workout log.
python3 scripts/strong_runner.py share_log --log_id <uuid>
| Parameter | Required | Description |
|---|---|---|
--log_id | Yes | Log UUID |
Retrieve a shared template or log by its link ID.
python3 scripts/strong_runner.py get_shared_link --link_id <id>
| Parameter | Required | Description |
|---|---|---|
--link_id | Yes | Shared link ID |
Fetch workout logs whose startDate falls on a specific date. Client-side filter over list_logs.
python3 scripts/strong_runner.py get_log_at_date --date 2025-03-15
python3 scripts/strong_runner.py get_log_at_date --date 2025-03-15T14:30:00+01:00
| Parameter | Required | Description |
|---|---|---|
--date | Yes | Target date (YYYY-MM-DD or ISO-8601 timestamp) |
Response (HAL): _embedded.log[] — only logs matching the given calendar date.
Fetch workout logs between two dates (inclusive). Client-side filter over list_logs.
python3 scripts/strong_runner.py get_logs_in_range --from 2025-01-01 --to 2025-03-31
| Parameter | Required | Description |
|---|---|---|
--from | Yes | Start date (YYYY-MM-DD or ISO-8601) |
--to | Yes | End date (YYYY-MM-DD or ISO-8601) |
Response (HAL): _embedded.log[] — logs sorted by startDate, within the range.
Return the single most recent workout log by startDate. Client-side filter over list_logs.
python3 scripts/strong_runner.py get_latest_log
Response: A single log object (not wrapped in _embedded).
Search workout logs by name using a case-insensitive substring match. Client-side filter over list_logs.
python3 scripts/strong_runner.py search_logs_by_name --name "push day"
| Parameter | Required | Description |
|---|---|---|
--name | Yes | Substring to match against log names |
Response (HAL): _embedded.log[] — matching logs.
Search exercises by name using a case-insensitive substring match. Client-side filter over list_exercises.
python3 scripts/strong_runner.py search_exercises_by_name --name "bench press"
| Parameter | Required | Description |
|---|---|---|
--name | Yes | Substring to match against exercise names |
Response (HAL): _embedded.measurement[] — matching exercises.
Return all workout logs that contain a specific exercise (by measurement ID). Client-side filter over list_logs.
python3 scripts/strong_runner.py get_exercise_history --measurement_id <uuid>
| Parameter | Required | Description |
|---|---|---|
--measurement_id | Yes | Exercise/measurement UUID to search for |
Response (HAL): _embedded.log[] — logs containing the exercise, sorted by startDate.
| Endpoint | Purpose |
|---|---|
https://back.strong.app/auth/login | Authenticate and obtain JWT tokens |
https://back.strong.app/auth/login/refresh | Refresh an expired access token |
https://back.strong.app/api/users/{userId} | User profile |
https://back.strong.app/api/users/{userId}/measurements | Exercises (measurements) |
https://back.strong.app/api/users/{userId}/templates | Workout templates |
https://back.strong.app/api/users/{userId}/logs | Workout logs |
https://back.strong.app/api/users/{userId}/folders | Template folders |
https://back.strong.app/api/users/{userId}/tags | Exercise tags |
https://back.strong.app/api/users/{userId}/widgets | Dashboard widgets |
https://back.strong.app/api/links/{linkId} | Shared links |
No other external endpoints are contacted.
STRONG_USERNAME and STRONG_PASSWORD environment variables and are never logged, cached, or written to disk.back.strong.app.scripts/strong_runner.py) is pure Python using only the standard library — no shell expansion or interpolation of user input occurs.The agent should invoke this skill whenever the user asks about their Strong app workouts,
exercises, templates, workout history, tags, folders, or training data. The agent should
call login implicitly before any data-fetching command and never expose raw tokens to the
user. Prefer list_logs and list_templates for broad queries, and get_log --log_id ...
or get_template --template_id ... for specific lookups.
This skill is unofficial and reverse-engineered. It is not affiliated with, endorsed by, or supported by Strong Fitness Ltd. The API surface may change without notice. Use at your own risk. The author assumes no liability for data loss or account restrictions resulting from use of this skill.