Unofficial 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.
VariableDescriptionSTRONG_USERNAMEStrong account username or emailSTRONG_PASSWORDStrong account password
Both must be set before running any command. The CLI reads them automatically.
All commands are invoked via:
bash
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.
bash
python3 scripts/strong_runner.py login
Output: { "accessToken": "eyJ...", "refreshToken": "kf3Z...", "userId": "uuid" }
Renew an expired access token without re-entering credentials.
bash
python3 scripts/strong_runner.py refresh_token
Output: { "accessToken": "eyJ...", "refreshToken": "...", "expiresIn": 1200, "userId": "uuid" }
Fetch the authenticated user's profile, preferences, and purchases.
bash
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.
bash
python3 scripts/strong_runner.py list_exercises
Response (HAL):
json
{
"_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
}
bash
python3 scripts/strong_runner.py get_exercise --measurement_id <uuid>
ParameterRequiredDescription--measurement_idYesExercise/measurement UUID
Fetch all workout templates (routines).
bash
python3 scripts/strong_runner.py list_templates
Response (HAL):
json
{
"_embedded": {
"template": [
{
"id": "uuid",
"created": "ISO8601",
"lastChanged": "ISO8601",
"name": { "custom": "Push Day" },
"access": "PRIVATE",
"logType": "TEMPLATE",
"_embedded": {
"cellSetGroup": [
{ "id": "uuid", "cellSets": [...] }
]
}
}
]
},
"total": 75
}
bash
python3 scripts/strong_runner.py get_template --template_id <uuid>
ParameterRequiredDescription--template_idYesTemplate UUID
Response keys: id, created, lastChanged, name, access, logType, _embedded.cellSetGroup[] (each with id, cellSets[]).
Fetch all completed workout sessions.
bash
python3 scripts/strong_runner.py list_logs
Response (HAL):
json
{
"_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.
bash
python3 scripts/strong_runner.py get_log --log_id <uuid>
python3 scripts/strong_runner.py get_log --log_id <uuid> --include_measurement
ParameterRequiredDescription--log_idYesLog UUID--include_measurementNoInclude 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.
bash
python3 scripts/strong_runner.py list_folders
Response (HAL): _embedded.folder[] with keys: id, created, lastChanged, name, index.
Fetch exercise tags/categories.
bash
python3 scripts/strong_runner.py list_tags
Response (HAL): _embedded.tag[] with keys: id, created, name, color, isGlobal.
Fetch dashboard widget configuration.
bash
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.
bash
python3 scripts/strong_runner.py share_template --template_id <uuid>
ParameterRequiredDescription--template_idYesTemplate UUID
Generate a shareable link for a workout log.
bash
python3 scripts/strong_runner.py share_log --log_id <uuid>
ParameterRequiredDescription--log_idYesLog UUID
Retrieve a shared template or log by its link ID.
bash
python3 scripts/strong_runner.py get_shared_link --link_id <id>
ParameterRequiredDescription--link_idYesShared link ID
Fetch workout logs whose startDate falls on a specific date. Client-side filter over list_logs.
bash
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
ParameterRequiredDescription--dateYesTarget 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.
bash
python3 scripts/strong_runner.py get_logs_in_range --from 2025-01-01 --to 2025-03-31
ParameterRequiredDescription--fromYesStart date ( YYYY-MM-DD or ISO-8601)--toYesEnd 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.
bash
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.
bash
python3 scripts/strong_runner.py search_logs_by_name --name "push day"
ParameterRequiredDescription--nameYesSubstring 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.
bash
python3 scripts/strong_runner.py search_exercises_by_name --name "bench press"
ParameterRequiredDescription--nameYesSubstring 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.
bash
python3 scripts/strong_runner.py get_exercise_history --measurement_id <uuid>
ParameterRequiredDescription--measurement_idYesExercise/measurement UUID to search for
Response (HAL): _embedded.log[] — logs containing the exercise, sorted by startDate.
EndpointPurposehttps://back.strong.app/auth/loginAuthenticate and obtain JWT tokenshttps://back.strong.app/auth/login/refreshRefresh an expired access tokenhttps://back.strong.app/api/users/{userId}User profilehttps://back.strong.app/api/users/{userId}/measurementsExercises (measurements)https://back.strong.app/api/users/{userId}/templatesWorkout templateshttps://back.strong.app/api/users/{userId}/logsWorkout logshttps://back.strong.app/api/users/{userId}/foldersTemplate foldershttps://back.strong.app/api/users/{userId}/tagsExercise tagshttps://back.strong.app/api/users/{userId}/widgetsDashboard widgetshttps://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.