Skip to main content

PPL Workout Endpoints

Endpoints for the Push/Pull/Legs training system.


GET Today's Workout

GET /api/ppl/today

Returns today's workout based on PPL rotation, including fatigue status and deload modifiers.

Response

{
"templateDay": {
"id": "abc123",
"name": "Push A",
"dayType": "push",
"targetMuscles": ["chest", "shoulders", "triceps"],
"estimatedDuration": 60,
"notes": null
},
"slots": [
{
"id": "slot1",
"slotOrder": 1,
"slotType": "primary",
"movementPattern": "horizontal_push",
"targetMuscles": ["chest"],
"sets": 4,
"repRangeMin": 6,
"repRangeMax": 8,
"rpeTarget": 8,
"restSeconds": 180,
"suggestedExercise": {
"id": "ex123",
"name": "Barbell Bench Press",
"slug": "barbell-bench-press",
"equipment": ["barbell", "bench"]
}
}
],
"warmup": {
"id": "warmup1",
"name": "Push Day Warmup",
"estimatedDuration": 10,
"phases": [
{
"name": "General",
"exercises": [...]
}
]
},
"dayNumber": 1,
"trainingStatus": {
"fatigueScore": 4,
"fatigueLevel": "normal",
"isDeloadActive": false
}
}

Start Session

POST /api/ppl/session

Creates a new workout session for a template day.

Request Body

{
"templateDayId": "abc123"
}

Response

{
"session": {
"id": "session123",
"userId": "user456",
"templateDayId": "abc123",
"sessionNumber": 15,
"status": "in_progress",
"startedAt": "2024-12-22T10:00:00Z"
},
"exercises": [
{
"id": "se123",
"exerciseId": "ex123",
"slotId": "slot1",
"exerciseOrder": 1,
"targetSets": 4,
"targetReps": "6-8"
}
]
}

Complete Session

PATCH /api/ppl/session

Marks a session as complete and calculates summary metrics. Also triggers streak update.

Request Body

{
"sessionId": "session123",
"notes": "Felt strong today"
}

Response

{
"session": {
"id": "session123",
"status": "completed",
"completedAt": "2024-12-22T11:15:00Z",
"totalDuration": 75,
"totalVolume": 15240,
"totalSets": 18,
"avgRpe": 7.5,
"notes": "Felt strong today"
},
"metrics": {
"totalVolume": 15240,
"totalSets": 18,
"avgRpe": 7.5,
"duration": 75
},
"streak": {
"currentStreak": 5,
"longestStreak": 12,
"lastWorkoutDate": "2024-12-22"
}
}

Log Set

POST /api/ppl/session/sets

Logs a set for an exercise. Auto-detects personal records.

Request Body

{
"sessionExerciseId": "se123",
"setNumber": 1,
"weight": 185,
"weightUnit": "lbs",
"reps": 8,
"rpe": 7,
"isWarmup": false,
"notes": null
}

Response

{
"set": {
"id": "set123",
"sessionExerciseId": "se123",
"setNumber": 1,
"weight": 185,
"weightUnit": "lbs",
"reps": 8,
"rpe": 7,
"isWarmup": false,
"completedAt": "2024-12-22T10:15:00Z"
},
"pr": {
"isNewPR": true,
"prType": "weight",
"previousBest": 180,
"newRecord": 185,
"estimated1RM": 228
}
}

If no PR was set, pr will be null.


Delete Set

DELETE /api/ppl/session/sets?setId=set123

Removes a logged set.

Response

{
"success": true
}

Get Exercise Alternatives

GET /api/exercises/alternatives

Returns alternative exercises for a movement pattern slot.

Query Parameters

ParameterTypeDescription
patternstringMovement pattern (e.g., "horizontal_push")
exerciseIdstringCurrent exercise ID (optional)
equipmentstringEquipment level filter (optional)
limitnumberMax results (default: 10)

Response

{
"alternatives": [
{
"id": "ex456",
"name": "Dumbbell Bench Press",
"slug": "dumbbell-bench-press",
"equipment": ["dumbbells", "bench"],
"difficulty": "intermediate",
"priority": "essential",
"score": 85,
"previouslyUsed": true,
"isDirectAlternative": true
}
]
}