curl -X GET "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/weekly-ranking" \
-H "Authorization: Bearer <access_token>"const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fitsociety.io/public/v1/workout/clients/{clientId}/weekly-ranking', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/weekly-ranking"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"enabled": true,
"hidden": false,
"resetLabel": "Reset in 4 days - Sunday Midnight",
"weekStart": "2026-07-12T00:00:00.000Z",
"weekEnd": "2026-07-19T00:00:00.000Z",
"podium": [
{
"rank": 4,
"clientId": "67f1234567890abcdef1234",
"firstName": "Kaylynn",
"lastName": "Lubin",
"name": "Kaylynn Lubin",
"image": "https://cdn.example.com/4.jpg",
"xp": 3895,
"trend": "up",
"anonymousAvatar": false,
"isCurrentUser": false
}
],
"data": [
{
"rank": 4,
"clientId": "67f1234567890abcdef1234",
"firstName": "Kaylynn",
"lastName": "Lubin",
"name": "Kaylynn Lubin",
"image": "https://cdn.example.com/4.jpg",
"xp": 3895,
"trend": "up",
"anonymousAvatar": false,
"isCurrentUser": false
}
],
"currentUser": {
"rank": 200,
"clientId": "67f1234567890abcdef1234",
"firstName": "Wilson",
"lastName": "Calzoni",
"name": "Wilson Calzoni",
"image": "https://cdn.example.com/you.jpg",
"anonymousAvatar": false,
"xp": 320,
"trend": "down",
"nextRank": 199,
"nextRankValue": 340,
"xpToNextRank": 20,
"progressToNextRank": 0.94,
"participating": true,
"inCurrentPage": false,
"isCurrentUser": true
},
"avatars": [
{
"clientId": "67f1234567890abcdef1234",
"image": "https://cdn.example.com/clients/a1.jpg",
"name": "Bryan Wolf"
}
],
"totalCount": 213,
"othersCount": 210,
"pagination": {
"page": 1,
"limit": 10,
"totalPages": 16,
"totalItems": 153,
"hasNextPage": true,
"hasPreviousPage": false,
"nextPage": 2,
"previousPage": false
}
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}{
"error": {
"code": 400,
"key": "request.invalid",
"message": "The request is invalid."
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}{
"error": {
"code": 500,
"key": "server.internal_error",
"message": "An unexpected Public API server error occurred."
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}Get the full paginated weekly ranking (leaderboard)
The full paginated ‘Your ranking this week’ list (the ‘See all’ screen behind the compact weeklyRanking card on the client Training page). Response shape mirrors the WOD leaderboard: podium[] (full top-3 rows), data[] (paginated slice starting at rank 4 — the podium is excluded and never repeated), currentUser (the client’s own row, ALWAYS returned and pinned statically — e.g. rank 200 stays fixed while data scrolls; carries the ‘XP to next rank’ progress), avatars (compact top-3 strip), totalCount, othersCount, pagination (counts participants excluding the podium). Page size defaults to 10. Self-gated by the leaderboard config (enabled + weeklyLeaderboardEnabled) and the client’s visibility. Anonymity (applied to data, avatars, and currentUser): company anonymousMode: 'names' masks other members’ names to ‘Member #rank’ (image kept); 'names_and_profiles' also drops the image (anonymousAvatar: true); a personally-anonymous member becomes ‘Anonymous’ with no image. Company modes never mask the current user, but their own personal anonymity does (‘Anonymous (You)’).
Requires the workout_progress:read scope. This operation maps to /app/v1/workout/client/weekly-ranking and retains its Workout V2 permission, feature-flag, and resource-scope checks.
The clientId path parameter identifies the client represented by the request context.
curl -X GET "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/weekly-ranking" \
-H "Authorization: Bearer <access_token>"const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fitsociety.io/public/v1/workout/clients/{clientId}/weekly-ranking', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.fitsociety.io/public/v1/workout/clients/{clientId}/weekly-ranking"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": {
"enabled": true,
"hidden": false,
"resetLabel": "Reset in 4 days - Sunday Midnight",
"weekStart": "2026-07-12T00:00:00.000Z",
"weekEnd": "2026-07-19T00:00:00.000Z",
"podium": [
{
"rank": 4,
"clientId": "67f1234567890abcdef1234",
"firstName": "Kaylynn",
"lastName": "Lubin",
"name": "Kaylynn Lubin",
"image": "https://cdn.example.com/4.jpg",
"xp": 3895,
"trend": "up",
"anonymousAvatar": false,
"isCurrentUser": false
}
],
"data": [
{
"rank": 4,
"clientId": "67f1234567890abcdef1234",
"firstName": "Kaylynn",
"lastName": "Lubin",
"name": "Kaylynn Lubin",
"image": "https://cdn.example.com/4.jpg",
"xp": 3895,
"trend": "up",
"anonymousAvatar": false,
"isCurrentUser": false
}
],
"currentUser": {
"rank": 200,
"clientId": "67f1234567890abcdef1234",
"firstName": "Wilson",
"lastName": "Calzoni",
"name": "Wilson Calzoni",
"image": "https://cdn.example.com/you.jpg",
"anonymousAvatar": false,
"xp": 320,
"trend": "down",
"nextRank": 199,
"nextRankValue": 340,
"xpToNextRank": 20,
"progressToNextRank": 0.94,
"participating": true,
"inCurrentPage": false,
"isCurrentUser": true
},
"avatars": [
{
"clientId": "67f1234567890abcdef1234",
"image": "https://cdn.example.com/clients/a1.jpg",
"name": "Bryan Wolf"
}
],
"totalCount": 213,
"othersCount": 210,
"pagination": {
"page": 1,
"limit": 10,
"totalPages": 16,
"totalItems": 153,
"hasNextPage": true,
"hasPreviousPage": false,
"nextPage": 2,
"previousPage": false
}
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}{
"error": {
"code": 400,
"key": "request.invalid",
"message": "The request is invalid."
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}{
"error": {
"code": 500,
"key": "server.internal_error",
"message": "An unexpected Public API server error occurred."
},
"meta": {
"requestId": "4f849d7d-f4f1-45cc-b4b7-3984a3d17f83",
"rateLimit": {
"limit": 10,
"remaining": 9,
"resetSeconds": 1
}
}
}Authorizations
Public API access token issued by /public/v1/oauth/token. Example: Authorization: Bearer fspt_.... Each resource request rechecks the token company's current provider access. Disabling access blocks existing tokens with 403 auth.provider_unavailable.
Path Parameters
Client in the company bound to the Public API token.
^[a-fA-F0-9]{24}$Query Parameters
Only required when the caller is a coach/admin. Client users are resolved from the auth token automatically.
"67f1234567890abcdef1234"
x >= 11
Page size. Defaults to 10.
10 <= x <= 10010