Freemium Model
Saturday’s API is free for partners to integrate. The monetization happens at the athlete level — athletes subscribe to Saturday for full-precision nutrition data.Teaser vs. full comparison
Safety is never gated. Both teaser and full responses include complete safety metadata. Safety information is always free.
Detecting response type
The product catalog
Saturday’s curated product database follows the same rule as the numbers: it opens on the athlete’s subscription, not on your partner account. Every product route (/v1/products/search, /v1/products/{barcode}, /v1/products/curated,
/v1/nutrition/products/fit, /v1/nutrition/products/compare) takes an
athlete_id, and the answer follows that athlete’s standing:
- Subscribed, or inside their 30-day trial:
tier: "full". Search and browse return products; a barcode lookup returns full label data for a curated product, or aproduct_not_found404. - Anyone else:
tier: "teaser". The product arrays come back empty and the response carries the category taxonomy plus the samectaobject your teaser prescriptions use. Still a 200, never a 403.
tier exactly as you do for prescriptions. A teaser is a product picker
that shows categories with an upgrade prompt behind them, not an error state.
GET /v1/products/categories is the one product route that never gates: the
taxonomy is the free tier, so it answers the same for every athlete.
The catalog is stricter here than in the Saturday app, on purpose. In the app a
free athlete can browse products and the subscription gates the prescription. An
API has no such natural limit, so the catalog itself sits behind the athlete’s
subscription. Verified label data for 186+ endurance products is the asset, and
it stays priced.
30-day full-precision trial
Every athlete’s first calculate request starts a 30-day trial of full-precision responses — 15 calls on the first UTC day (exploration allowance), then 5 calls per athlete per UTC day. During the trial, full responses carry trial metadata so you can build countdown UX:trial_cap_reached: true plus a human-readable trial_cap_note you can surface directly to the athlete — it does the apology and the why for you. Batch scenarios debit the cap individually. After 30 days, responses are teaser tier until the athlete subscribes.
Subscription flow
When an athlete wants full precision:- Your app shows teaser data with the upgrade CTA
- Athlete taps the upgrade link (
subscribe_urlfrom thesubscription_cta) — for athlete-scoped requests it carries a signed token (pst) identifying which athlete is upgrading - The athlete lands on Saturday’s checkout page (partner-branded), pays via Stripe, and is sent back toward your app
- Saturday writes the link and fires the
subscription.createdwebhook — the athlete’s next API call returns full precision data
- The unlock requires athlete-scoped requests. Only CTAs minted from requests that included an
athlete_idcarry thepst; identity-less CTAs are attribution-only and can’t auto-unlock anyone. - Already-subscribed Saturday users are never double-charged. If the athlete already has an active Saturday subscription, checkout links their account to your athlete instead of charging, and
subscription.createdfires withsource: "existing_subscription_linked".
Checking entitlement
GET /v1/athletes/{id} returns a computed subscription_status field — full | trial | teaser — for polling after checkout-return or support lookups.
Return-to-app handoff
Give Saturday areturn_url (https or deep link) at partner onboarding and the post-payment success page shows a “Back to your app” button — athletes land back in your product with full precision already flowing.
Automatic linking by email
Some paying Saturday athletes never touch your subscribe CTA — they subscribed inside the Saturday app (Apple/Google in-app purchase) or on saturday.fit before joining your platform. Saturday links these automatically: when theemail you set on an athlete exactly matches a Saturday account’s email (case-insensitive; no fuzzy matching), the records are linked and the athlete’s API responses unlock.
- Opt in by supplying emails. Set
emailon your athletes (POST /v1/athletesandPATCH /v1/athletes/{athlete_id}). Matching runs when you write an athlete email, when a Saturday subscription activates, and in a nightly sweep. - You get the same webhook. When a match links an actively paying account,
subscription.createdfires withsource: "email_match"— handle it exactly like a checkout unlock. - Ambiguity never auto-links. Multiple athletes sharing an email, or a conflict with an existing link, goes to Saturday-side human review instead.
- No revenue share on matched links. These subscriptions weren’t driven through your platform (many predate it), so they don’t appear on your revenue statement.
- Only a tier boolean is released. The match tells your platform the athlete’s subscription tier — never payment details, purchase history, or Saturday profile data.
partner_plan: "annual" on the athlete (PATCH /v1/athletes/{id}). Eligible athletes’ CTAs carry the offer claim and checkout prices accordingly. You may advertise the offer anywhere; only asserted athletes can redeem it.
Organization (team) offers
A coach or team on your platform can have a negotiated discount of their own. Record it on the organization (PUT /v1/organizations/{org_id}/offer) and assert each athlete’s affiliation via org_id — see Organizations → Organization offers.
How discounts stack
When an athlete qualifies for more than one discount source (a partner offer and an org offer), the percents combine multiplicatively and the total is hard-capped at 30%:Testing the loop (test environment)
The test environment has a zero-payment simulator so you can integration-test your webhook handlers and tier handling end to end:sk_test_ key at onboarding.
{"active": true} writes the same link fields and fires the same subscription.created webhook as a real purchase; {"active": false} fires subscription.cancelled. The endpoint does not exist in production.
You can also run a real test checkout with Stripe’s 4242 4242 4242 4242 card from the CTA link in any test-env teaser response.
iOS partners: opening Saturday’s web checkout from inside your iOS app is an external purchase link for digital content — review Apple’s current external-link entitlement rules for your app’s situation. The CTA URL works in any browser context.
Attribution
Teaser data must carry the “Powered by Saturday” mark, linked, near the numbers. Full data carries a lighter mark wherever Saturday data appears. That linked mark is how the loop closes: athletes seeing teasers find their way to full precision through it. Full placement rules, marks, sizing, and the per-surface matrix live on the Brand & Attribution page.Partner value exchange
- Partners get: Free nutrition intelligence for their platform
- Saturday gets: Distribution to athletes who may subscribe
- Athletes get: Personalized nutrition whether they subscribe or not
Trial clock (2026-06): the 30-day full-precision trial starts at the athlete’s first narrower-than-full-wide calculation — i.e., once any real profile data exists. Zero-data calculations never start (or burn) the trial. Collect the fueling profile first (Athlete Onboarding) and the trial window delivers genuinely exact numbers from day one.