Organizations
Organizations let partners manage teams of athletes under a single billing structure. This is designed for coaching platforms, team managers, and enterprise partners who onboard athletes in groups.Creating an organization
The response includes server-set
id, created_at, updated_at, and a maintained member_count.
Managing members
Members are the organization’s people directory (coaches and staff by email). They’re separate from athlete records — linking a member row to an athlete viaathlete_id is optional.
Adding members
Member roles
Listing and removing members
Seat subscriptions (team licensing)
A seat subscription is a block of paid seats the organization holds; assigning a license to an athlete grants them full-precision API responses while the subscription is active and in its date window. This is the lane for orgs that pay for their athletes’ access directly (vs. athletes paying at personal checkout).Create a seat block
type is "team" or "enterprise"; dates are unix seconds (end_date optional). The response includes used_seats (starts at 0) and status. Manage with GET /v1/organizations/{org_id}/subscriptions and PATCH .../subscriptions/{sub_id} (update seats, status, end_date).
Assign licenses to athletes
athlete_id is required per license (email/name are display metadata); the seat limit is enforced. The licensed athlete’s next API call returns full precision. GET .../licenses lists assignments; DELETE .../licenses/{athlete_id} frees the seat (access degrades on the athlete’s next call).
Organization offers (negotiated discounts)
A coach or team admin can negotiate a discount their athletes receive at personal checkout — “Team Alpine athletes get 15% off Saturday.” You record it as the organization’s offer; Saturday applies it automatically when an affiliated athlete follows a subscribe CTA from your app. Each organization has at most one active offer.PUT creates or replaces it (previous offers are deactivated, never deleted — the document trail is the negotiation audit log).
Setting the offer
The response echoes the stored offer plus
stack_cap_percent, the hard ceiling on the total stacked discount (currently 30).
Reading and removing the offer
Which athletes get it
The offer applies to athletes whoseorg_id field references this organization. Assert it when creating or updating the athlete:
org_id is partner-asserted (the same trust posture as partner_plan) and the organization must already exist. A seat license is not required — the discount is for the athlete’s own purchase, not a license entitlement. Set org_id to an empty string to remove the affiliation.
Stacking with partner offers
If your platform also has a partner-level offer (e.g. bundle pricing for your annual subscribers), eligible athletes get both: the percents combine multiplicatively, and the total is hard-capped at 30%.Listing organizations
Updating an organization
Finding an organization’s athletes
Athletes reference their organization through theorg_id field on the athlete record (POST/PATCH /v1/athletes, see Organization offers above). To build a team roster view, track your own athlete→org mapping when you assert org_id, or use the seat-subscription license list for licensed teams — GET .../licenses returns exactly the athletes the org covers.