Skip to main content

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

The external_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 inside settings, 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

Pagination is cursor-based, not offset-based. 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

Include only the top-level fields you want to change. Unspecified top-level fields are not modified.

Updating the fueling profile

The settings object is written as a unit. Send the athlete’s complete settings on every write, including the values you are not changing, or the omitted ones are cleared. Read the current values first with 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.
Removes the athlete document only. Their activities, prescriptions, and feedback stay in storage.
The erasure path. It deauthorizes connected providers, purges the athlete’s subcollections (activities, conversations, consent, integrations), and files the request the data warehouse honors.
Use POST /v1/athletes/{id}/delete for a GDPR erasure request. DELETE alone leaves the athlete’s activity data behind. Neither can be undone.

Data export (GDPR)

Export all data held for an athlete:
Returns JSON containing the athlete’s profile, every activity with its prescription and feedback, any AI coach conversations, and their consent records.

Settings schema

Fetch the global settings schema to build dynamic forms:
Returns each field’s type, valid range or option list, description, and default, so a settings UI does not have to hardcode Saturday’s requirements. This is a global schema, identical for every athlete; fetch one athlete’s current values with 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.