API Reference
All API routes are App Router route handlers under src/app/api/ (plus src/app/auth/callback/route.js). There are ~82 handlers. They're grouped below; most require an authenticated, permission-checked caller.
| Route | Purpose |
|---|
POST /api/auth/signup | Create a coach account + org |
POST /api/auth/delete-account | Delete the current account |
GET /api/auth/frameio | Start Frame.io (Adobe IMS) OAuth |
GET /api/auth/frameio/callback | Frame.io OAuth callback |
GET /auth/callback | Supabase auth/session callback |
| Route | Purpose |
|---|
POST /api/clips/analyze | Sign a clip and submit it to the AI backend |
POST /api/clips/store | Download processed clip from the backend, cache to session-videos, save stats |
POST /api/sessions/store | Session-level variant of clip store |
GET /api/video/sign | Issue an HMAC-signed, access-checked stream URL (1h TTL) |
GET /api/video/stream | Byte-range video proxy (allowlisted hosts; token-gated) |
GET /api/video/check | Source availability check |
| Route | Purpose |
|---|
POST /api/sessions/coaching | Generate per-clip / batch coaching feedback (Gemini) |
POST /api/sessions/coaching/progress | Cross-session progress analysis |
GET /api/sessions/coaching/export | Export an HTML/JSON coaching report |
| Route | Purpose |
|---|
GET/POST /api/orgs, GET/PATCH /api/orgs/[id] | List/create orgs; read/update an org (incl. type change) |
/api/orgs/[id]/members, /members/[memberId] | List members; update role / remove member |
POST /api/orgs/[id]/members/invite | Invite a member (seat-cap enforced) |
/api/orgs/[id]/roles, /roles/[roleId] | Create/update/delete roles |
PATCH /api/orgs/[id]/modules | Toggle a feature module |
POST /api/orgs/invite/[token]/accept | Accept an org invite |
| Route | Purpose |
|---|
POST /api/billing/subscribe | Start/modify a platform subscription (org pays) |
POST /api/billing/portal | Open the platform Stripe Customer Portal |
POST /api/stripe/checkout | Marketplace checkout (student pays coach) |
POST /api/stripe/portal | Marketplace subscription portal |
POST /api/stripe/webhook | Stripe webhook (platform + marketplace events) |
| Route | Purpose |
|---|
POST /api/invite, /api/invite/send | Generate/send a student invite |
POST /api/athletes/import | CSV roster import |
/api/athletes/[id]/coaches, /coaches/[scId] | Multi-coach assignment CRUD |
/api/athletes/[id]/permissions | Effective-permission hydration |
POST /api/athletes/[id]/merge/[b] | Merge duplicate athletes (dedup) |
POST /api/athletes/[id]/publish | Publish/unpublish a public profile |
| Route | Purpose |
|---|
GET /api/athlete-search/search, /api/athlete-search/[source]/[id] | Multi-source search + fetch (WSL + LiveHeats) |
GET /api/discover | Provider directory (WSL + LiveHeats, filterable by tour) — powers circuit "Browse Roster" |
POST /api/athlete-search/import | Resolve a provider profile into a roster student + optional circuit enrollment |
/api/wsl/* | WSL scrape, import, live search, athletes search/sync, event bulk-add |
/api/liveheats/* | LiveHeats athletes/series/import-rankings, events bulk-add, organisation search/sync (/organisations, /organisations/sync, /series/[id]/athletes) |
/api/identity/match, /api/identity/links, /api/dedup/suggestions | Cross-source identity + dedup |
/api/watchlist, /api/watchlist/[id] | Watchlist CRUD |
/api/opponents | Opponent scouting CRUD |
| Route | Purpose |
|---|
GET /api/surf/forecast, /api/surf/spot/[slug] | Surfline forecasts (Open-Meteo fallback) |
GET /api/surfline/spots/search | Spot lookup |
POST /api/reports/season/[athleteId] | Generate a season report |
POST /api/achievements/check, /api/achievements/seed | Evaluate / seed achievements |
POST /api/notifications/send | Internal: create notification + push/email (service-role auth) |
POST /api/club/enroll | Public club self-enrollment |
/api/cron/wsl-sync, /api/cron/wsl-athletes-sync, /api/cron/wsl-avatars, /api/cron/liveheats-sync, /api/cron/liveheats-orgs-sync, /api/cron/backfill-spots. See Cron Jobs.