Athletes
Athletes are the core entity in Saturday’s API. Each athlete has a profile of physical characteristics and fueling preferences that personalize their nutrition prescriptions. Athletes are partner-scoped: your organization can only reach athletes created through your API key. There is no cross-partner data access.Creating an athlete
External IDs
Theexternal_id field maps the Saturday athlete to your platform’s user. This is your user ID, not Saturday’s. Use it to look athletes up without storing Saturday’s own IDs.
Profile fields
Every field is optional at create time. The athlete’s fueling profile is what makes prescriptions exact, so the fields below split into two groups: the ones the engine needs before it will return exact numbers, and the ones that narrow the band further. An athlete missing any safety-core field gets a range instead of a number. See Athlete Onboarding.Top-level fields
Saturday sets
id, partner_id, created_at, updated_at, profile_complete, and subscription_status. Writes to those are ignored.
Settings: the fueling profile
settings holds the fields the engine reads. The 1-9 scales are odd-point selectors, not continuous sliders: send 1, 3, 5, 7, or 9.
carb_experience is the most carbohydrate per hour the athlete has ever fueled with; usual_carb_consumption is what they typically take. Both are stored as range tokens rather than numbers, because a range is what an athlete can answer without guessing.
Fueling concerns
Concerns are individual booleans insidesettings, not a list of tags:
Sending any concern key marks the concerns question answered, including when you send it as
false. An athlete who has never been asked and an athlete who answered “none of these” are different states to the precision engine, and only the second one counts as complete.
Settings change as athletes train their gut and their sweat rate adapts. A profile answered once and never revisited drifts. Re-ask
carb_experience, usual_carb_consumption, and sweat_level periodically.Listing athletes
limit defaults to 50 and is clamped to 1-200. The response carries pagination.next_cursor; pass it back as cursor for the next page, and stop when pagination.has_more is false.
Add ?profile_complete=false to list only the athletes whose profiles are still short of exact numbers. That is your nudge list.
Updating an athlete
Updating the fueling profile
GET /v1/athletes/{id}/settings and merge on your side.
The same replacement rule applies if you send a settings object through PATCH /v1/athletes/{id}.
Saturday rejects carb_upper_limit_override outside 50-150 g/hr and weight_kg outside 20-250 with a 400 rather than silently clamping, so a bad value in your data surfaces at the boundary instead of distorting a prescription.
Deleting an athlete
Two endpoints delete, and they are not interchangeable.Data export (GDPR)
Export all data held for an athlete:Settings schema
Fetch the global settings schema to build dynamic forms:GET /v1/athletes/{id}/settings.
For collecting the profile from scratch rather than editing it, GET /v1/onboarding/questions returns the same fields as athlete-facing questions with copy, ordering, and answer values. See Athlete Onboarding.