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, URL-encoded and unchanged, 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}.
On create, on update and on calculate, Saturday rejects carb_upper_limit_override outside 50-150 g/hr and weight_kg outside 20-250 with a 400 of code out_of_range rather than clamping, so a bad value in your data surfaces at the boundary instead of distorting a prescription. Batch create reports the same code per item.
Saturday is for athletes 14 and up. On create and on update, a year_of_birth that makes the athlete younger than 14 (the current year minus the birth year) is refused with a 400 of code under_minimum_age and param year_of_birth, and nothing in that request is saved. The message names the minimum age:
year_of_birth must be a whole number; any other value is refused with invalid_value.
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.