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
Both teaser responses and incomplete full-tier profiles carry range fields. Choose the number display from those fields; usetier separately to decide whether to show the subscription CTA. Exact zero values may be omitted, so the exact branch defaults them to zero.
The product catalog
The product routes are gated; Feature Gates covers access. Once open to you, 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 a curated product’s per-serving carbs, sodium, fluid and caffeine, 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 every product in the curated catalog is the
asset, and it stays priced.
30-day full-precision trial
An athlete-scoped calculation with real profile or optional activity inputs starts a 30-day trial of full-tier responses: 15 calls on the first UTC day (exploration allowance), then 5 calls per athlete per UTC day. Zero-data calls do not start the trial. Complete inputs are still required for exact numbers. 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 carries the apology and the reason. 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, and the athlete’s next API call returns full precision
- The unlock requires athlete-scoped requests. Only CTAs minted from requests that included an
athlete_idcarry thepst; identity-less CTAs are attribution-only and cannot auto-unlock anyone. - Subscribed Saturday users are never double-charged. If the athlete 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, or 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, so athletes land back in your product with full precision 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 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 were not driven through your platform (many predate it), so they do not appear on your revenue statement.
- Only entitlement is released. The match tells your platform the athlete’s subscription tier, and an expiry when one applies, 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. 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
The trial starts once real profile or optional activity inputs are present. Zero-data calculations never start or burn it. Collect the fueling profile and provide the per-activity inputs so trial calculations can return exact numbers.