Static reference

Repeak Backend API

Fast HTML catalog of every documented operation. Use this when you want a zero-JS browseable reference, then jump to Swagger or Scalar for live request execution.

Version: v2 OpenAPI: 3.0.0 Server: https://api.repeak.in Operations: 3017

Action Center

4 operations

GET /v2/users/me/claimable-rewards

Challenge RC + earned badges ready to claim

Responses: 200 Auth required
POST /v2/users/me/claimable-rewards/{claimId}/claim

Claim a reward (credits RC / acknowledges a badge)

Responses: 201 Auth required
GET /v2/users/me/pending-proofs

Editions in their proof window awaiting an effort

Responses: 200 Auth required
POST /v2/users/me/pending-proofs/{participationId}/submit

Submit an effort for a virtual edition in its proof window

Responses: 201 Auth required

Activities

6 operations

GET /v2/activities

GET /v2/activities

Responses: 200 Public or optional auth
POST /v2/activities

POST /v2/activities

Responses: 201 Public or optional auth
DELETE /v2/activities/{id}

DELETE /v2/activities/{id}

Responses: 200 Public or optional auth
GET /v2/activities/{id}

GET /v2/activities/{id}

Responses: 200 Public or optional auth
PATCH /v2/activities/{id}

PATCH /v2/activities/{id}

Responses: 200 Public or optional auth
GET /v2/activities/{id}/public

GET /v2/activities/{id}/public

Responses: 200 Public or optional auth

Activity Appeals

3 operations

POST /v2/users/{userId}/activities/{activityId}/appeal

POST /v2/users/{userId}/activities/{activityId}/appeal

Responses: 201 Public or optional auth
GET /v2/users/{userId}/activities/{activityId}/review-state

GET /v2/users/{userId}/activities/{activityId}/review-state

Responses: 200 Public or optional auth
GET /v2/users/{userId}/activity-appeals

GET /v2/users/{userId}/activity-appeals

Responses: 200 Public or optional auth

Admin - AI Configuration

4 operations

GET /v2/admin/ai-config

Get all AI configurations

Returns all AI provider configurations for different features

Responses: 200 Public or optional auth
GET /v2/admin/ai-config/{feature}

Get AI configuration for a specific feature

Returns AI provider configuration for training_plan, chatbot, or plan_adjustment

Responses: 200, 400 Public or optional auth
PUT /v2/admin/ai-config/{feature}

Update AI configuration for a feature

Update the AI provider settings for a specific feature (training_plan, chatbot, plan_adjustment)

Responses: 200, 400 Public or optional auth
GET /v2/admin/ai-config/providers/info

Get available AI providers information

Returns information about available AI providers and their capabilities

Responses: 200 Public or optional auth

Admin - Challenge Management

12 operations

GET /v2/admin/challenge-management/activities

Get all user activities (admin view)

Responses: 200 Public or optional auth
GET /v2/admin/challenge-management/activities/{activityId}

Get activity detail by ID

Responses: 200 Public or optional auth
PATCH /v2/admin/challenge-management/activities/{activityId}/validation

Set an activity validation status (operator)

Responses: 200 Public or optional auth
GET /v2/admin/challenge-management/challenges

List challenges (admin moderation table)

Responses: 200 Public or optional auth
PATCH /v2/admin/challenge-management/challenges/{id}/close

Force-close a challenge (deactivate)

Responses: 200 Public or optional auth
PATCH /v2/admin/challenge-management/challenges/{id}/reopen

Reopen a previously force-closed challenge

Responses: 200 Public or optional auth
GET /v2/admin/challenge-management/history-logs

Get challenge update history logs

Responses: 200 Public or optional auth
GET /v2/admin/challenge-management/participations

Get all challenge participations (admin view)

Responses: 200 Public or optional auth
GET /v2/admin/challenge-management/participations/{participationId}

Get challenge participation detail with daily progress

Responses: 200 Public or optional auth
POST /v2/admin/challenge-management/participations/{participationId}/revoke

Revoke an athlete challenge participation

Responses: 201 Public or optional auth
GET /v2/admin/challenge-management/stats

Get challenge progress dashboard stats

Responses: 200 Public or optional auth
GET /v2/admin/challenge-management/users/{userId}/summary

Get user challenge summary (participations, activities, logs)

Responses: 200 Public or optional auth

Admin - Declaration Form Templates

7 operations

GET /v2/admins/declaration-form-templates

Get all declaration form templates

Retrieve all declaration form templates including deleted

Responses: 200 Auth required
POST /v2/admins/declaration-form-templates

Create a new declaration form template

Create a new declaration form template with HTML content and required fields. Only one template can be active at a time.

Responses: 201 Auth required
DELETE /v2/admins/declaration-form-templates/{id}

Delete a declaration form template

Soft delete a declaration form template. Cannot delete active template.

Responses: 200 Auth required
GET /v2/admins/declaration-form-templates/{id}

Get a declaration form template by ID

Retrieve a specific declaration form template

Responses: 200 Auth required
PATCH /v2/admins/declaration-form-templates/{id}

Update a declaration form template

Update a declaration form template. Setting isActive=true will deactivate all other templates.

Responses: 200 Auth required
PATCH /v2/admins/declaration-form-templates/{id}/activate

Activate a declaration form template

Set a template as active. This will deactivate all other templates.

Responses: 200 Auth required
GET /v2/admins/declaration-form-templates/active

Get active declaration form template

Retrieve the currently active declaration form template

Responses: 200 Auth required

Admin - Editions Oversight

4 operations

GET /v2/admin/editions

List all editions across events/organizers

Responses: 200 Public or optional auth
GET /v2/admin/editions/{id}

Get one edition (admin detail)

Responses: 200 Public or optional auth
PATCH /v2/admin/editions/{id}/status

Override an edition status (publish / cancel / etc.)

Responses: 200 Public or optional auth
GET /v2/admin/editions/stats

Edition status breakdown (dashboard tiles)

Responses: 200 Public or optional auth

Admin - Event Ticket Sales

2 operations

GET /v2/admin/events/{eventId}/ticket-sales/slot-wise

Slot-wise ticket-sales breakdown for any event (admin, cross-organizer).

Responses: 200, 404 Public or optional auth
GET /v2/admin/events/{eventId}/ticket-sales/ticket-wise

Ticket-wise ticket-sales breakdown for any event (admin, cross-organizer).

Responses: 200, 404 Public or optional auth

Admin - Events Oversight

11 operations

GET /v2/admin/events

List all events across organizers (admin)

Responses: 200 Public or optional auth
GET /v2/admin/events/{id}

Get one event (admin detail)

Responses: 200 Public or optional auth
GET /v2/admin/events/{id}/bookings

List registrations/bookings for an event (admin)

Responses: 200 Public or optional auth
GET /v2/admin/events/{id}/participants

List participants for an event (admin roster)

Responses: 200 Public or optional auth
POST /v2/admin/events/{id}/replace-uuid

Replace an event primary UUID and move all relational references

Responses: 201 Public or optional auth
POST /v2/admin/events/{id}/restore-cancelled

Restore a cancelled event to a public, active published listing

Responses: 201 Public or optional auth
GET /v2/admin/events/{id}/revenue

Revenue summary for an event (admin)

Responses: 200 Public or optional auth
PATCH /v2/admin/events/{id}/status

Override an event status (suspend / reinstate / cancel)

Responses: 200 Public or optional auth
POST /v2/admin/events/{id}/suspend

Suspend an event (blocks writes + new registrations, holds settlements)

Responses: 201 Public or optional auth
POST /v2/admin/events/{id}/unsuspend

Unsuspend an event (restores prior status, clears holds)

Responses: 201 Public or optional auth
GET /v2/admin/events/stats

Event status breakdown (dashboard tiles)

Responses: 200 Public or optional auth

Admin - Goodies

4 operations

GET /v2/admin/goodies/auto-award-config

Read goodie auto-award trigger config for one sponsor attachment.

Responses: 200 Public or optional auth
PATCH /v2/admin/goodies/auto-award-config/{sponsorAttachmentId}

Update goodie auto-award trigger config for one sponsor attachment.

Responses: 200 Public or optional auth
GET /v2/admin/goodies/auto-award-config/list

List sponsor attachments with auto-award trigger config (admin master-detail).

Responses: 200 Public or optional auth
GET /v2/admin/prize-contributions

List sponsor goodie prize contributions across every brand and both lanes (event + challenge), newest first.

Responses: 200 Public or optional auth

Admin - GST Declaration

11 operations

GET /v2/admin/gst-declaration/{id}

Get declaration details

Get detailed information about a specific declaration

Responses: 200 Auth required
GET /v2/admin/gst-declaration/{id}/audit-logs

Get declaration audit logs

Get the complete audit trail for a declaration

Responses: 200 Auth required
GET /v2/admin/gst-declaration/{id}/pdf

Get declaration PDF URL

Generate a presigned URL to download the declaration PDF

Responses: 200 Auth required
POST /v2/admin/gst-declaration/{id}/reject

Reject declaration

Reject a GST declaration with a reason. The organizer will need to restart.

Responses: 201 Auth required
POST /v2/admin/gst-declaration/{id}/reset-template

Reset a declaration to the latest active template

Re-points one PENDING_VARIABLES declaration onto the current active template.

Responses: 201 Auth required
GET /v2/admin/gst-declaration/{id}/signed-document

Get signed document URL

Generate a presigned URL to download the uploaded signed document

Responses: 200 Auth required
POST /v2/admin/gst-declaration/{id}/verify

Verify declaration

Verify and approve a GST declaration. This completes the organizer onboarding.

Responses: 201 Auth required
GET /v2/admin/gst-declaration/all

Get all declarations

List all declarations with pagination and optional status filtering

Responses: 200 Auth required
POST /v2/admin/gst-declaration/backfill-template-version

Backfill stale template versions

Re-points PENDING_VARIABLES declarations still pinned to an old template onto the current active template. Doesn't touch declarations that already have filled variables.

Responses: 201 Auth required
GET /v2/admin/gst-declaration/pending

Get pending declarations

List all declarations waiting for admin review with pagination

Responses: 200 Auth required
GET /v2/admin/gst-declaration/statistics

Get declaration statistics

Get summary statistics about GST declarations

Responses: 200 Auth required

Admin - GST Template

9 operations

GET /v2/admin/gst-template

List templates

Get all declaration templates with optional filtering

Responses: 200 Auth required
POST /v2/admin/gst-template

Create new template

Create a new declaration template (creates new version)

Responses: 201 Auth required
DELETE /v2/admin/gst-template/{id}

Delete template

Soft delete a template (cannot delete active templates)

Responses: 200 Auth required
GET /v2/admin/gst-template/{id}

Get template by ID

Get detailed information about a specific template

Responses: 200 Auth required
PUT /v2/admin/gst-template/{id}

Update template

Update an existing template (creates new version)

Responses: 200 Auth required
POST /v2/admin/gst-template/{id}/activate

Activate template

Activate a template (deactivates all others)

Responses: 201 Auth required
POST /v2/admin/gst-template/{id}/deactivate

Deactivate template

Deactivate a template

Responses: 201 Auth required
GET /v2/admin/gst-template/active

Get active template

Get the currently active template used for new declarations

Responses: 200 Auth required
GET /v2/admin/gst-template/versions/{name}

Get template versions

Get all versions of a template by name

Responses: 200 Auth required

Admin - Notification Categories

4 operations

GET /v2/admin/notification-categories

GET /v2/admin/notification-categories

Responses: 200 Public or optional auth
POST /v2/admin/notification-categories

POST /v2/admin/notification-categories

Responses: 201 Public or optional auth
DELETE /v2/admin/notification-categories/{id}

DELETE /v2/admin/notification-categories/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-categories/{id}

PATCH /v2/admin/notification-categories/{id}

Responses: 200 Public or optional auth

Admin - Notification Journeys

3 operations

GET /v2/admin/notification-journeys/{role}

GET /v2/admin/notification-journeys/{role}

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-journeys/{role}/steps/{stepId}

PATCH /v2/admin/notification-journeys/{role}/steps/{stepId}

Responses: 200 Public or optional auth
GET /v2/admin/notification-journeys/summary

GET /v2/admin/notification-journeys/summary

Responses: 200 Public or optional auth

Admin - Notification Logs

6 operations

GET /v2/admin/notification-logs

GET /v2/admin/notification-logs

Responses: 200 Public or optional auth
GET /v2/admin/notification-logs/{id}

GET /v2/admin/notification-logs/{id}

Responses: 200 Public or optional auth
POST /v2/admin/notification-logs/{id}/resend

Re-send a previously-FAILED dispatch log using the same step + channel + recipient + variables. Writes a NEW log row (append-only audit). PUSH channel is not supported because the push payload is not persisted on the log row.

Responses: 200 Public or optional auth
GET /v2/admin/notification-logs/batches

GET /v2/admin/notification-logs/batches

Responses: 200 Public or optional auth
GET /v2/admin/notification-logs/batches/{id}

GET /v2/admin/notification-logs/batches/{id}

Responses: 200 Public or optional auth
GET /v2/admin/notification-logs/stats

GET /v2/admin/notification-logs/stats

Responses: 200 Public or optional auth

Admin - Notification Mappings

6 operations

GET /v2/admin/notification-mappings

GET /v2/admin/notification-mappings

Responses: 200 Public or optional auth
POST /v2/admin/notification-mappings

POST /v2/admin/notification-mappings

Responses: 201 Public or optional auth
DELETE /v2/admin/notification-mappings/{id}

DELETE /v2/admin/notification-mappings/{id}

Responses: 200 Public or optional auth
PUT /v2/admin/notification-mappings/{id}

PUT /v2/admin/notification-mappings/{id}

Responses: 200 Public or optional auth
POST /v2/admin/notification-mappings/bulk

POST /v2/admin/notification-mappings/bulk

Responses: 201 Public or optional auth
GET /v2/admin/notification-mappings/template-candidates

GET /v2/admin/notification-mappings/template-candidates

Responses: 200 Public or optional auth

Admin - Notification Outbox

5 operations

GET /v2/admin/notifications/outbox

Outbox list (paginated). Body NEVER returned — only a fixed-shape preview for triage.

Responses: 200 Public or optional auth
POST /v2/admin/notifications/outbox/{id}/retry

Manually re-drive a DEAD or FAILED outbox row. Resets attempts, clears last error, sets status=PENDING — the next processor tick picks it up. SENT and PROCESSING rows return 409.

Responses: 200 Public or optional auth
POST /v2/admin/notifications/outbox/bulk-redrive

Filter-based bulk re-drive of FAILED/DEAD outbox rows. Default dryRun=true.

Responses: 200 Public or optional auth
POST /v2/admin/notifications/outbox/retry

Bulk re-drive a list of outbox row ids (cap 100). Returns per-id outcome — partial success is allowed.

Responses: 200 Public or optional auth
GET /v2/admin/notifications/outbox/summary

Outbox summary: counts by status + channel, oldest-pending age, dead count, last 10 failures.

Responses: 200 Public or optional auth

Admin - Notification Settlements

3 operations

GET /v2/admin/notification-settlements

GET /v2/admin/notification-settlements

Responses: 200 Public or optional auth
POST /v2/admin/notification-settlements/{id}/process

POST /v2/admin/notification-settlements/{id}/process

Responses: 201 Public or optional auth
POST /v2/admin/notification-settlements/calculate

POST /v2/admin/notification-settlements/calculate

Responses: 201 Public or optional auth

Admin - Notification Steps

3 operations

GET /v2/admin/notification-steps

GET /v2/admin/notification-steps

Responses: 200 Public or optional auth
GET /v2/admin/notification-steps/{stepId}

GET /v2/admin/notification-steps/{stepId}

Responses: 200 Public or optional auth
GET /v2/admin/notification-steps/summary

GET /v2/admin/notification-steps/summary

Responses: 200 Public or optional auth

Admin - Notification Templates

49 operations

GET /v2/admin/notification-template-records

GET /v2/admin/notification-template-records

Responses: 200 Public or optional auth
POST /v2/admin/notification-template-records

POST /v2/admin/notification-template-records

Responses: 201 Public or optional auth
DELETE /v2/admin/notification-template-records/{id}

DELETE /v2/admin/notification-template-records/{id}

Responses: 200 Public or optional auth
GET /v2/admin/notification-template-records/{id}

GET /v2/admin/notification-template-records/{id}

Responses: 200 Public or optional auth
PUT /v2/admin/notification-template-records/{id}

PUT /v2/admin/notification-template-records/{id}

Responses: 200 Public or optional auth
GET /v2/admin/notification-templates/email

GET /v2/admin/notification-templates/email

Responses: 200 Public or optional auth
POST /v2/admin/notification-templates/email

POST /v2/admin/notification-templates/email

Responses: 201 Public or optional auth
DELETE /v2/admin/notification-templates/email/{id}

DELETE /v2/admin/notification-templates/email/{id}

Responses: 200 Public or optional auth
GET /v2/admin/notification-templates/email/{id}

GET /v2/admin/notification-templates/email/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-templates/email/{id}

PATCH /v2/admin/notification-templates/email/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-templates/email/{id}/pricing

PATCH /v2/admin/notification-templates/email/{id}/pricing

Responses: 200 Public or optional auth
GET /v2/admin/notification-templates/email/{id}/version-details

GET /v2/admin/notification-templates/email/{id}/version-details

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-templates/email/{id}/visibility

PATCH /v2/admin/notification-templates/email/{id}/visibility

Responses: 200 Public or optional auth
POST /v2/admin/notification-templates/email/create-via-msg91

POST /v2/admin/notification-templates/email/create-via-msg91

Responses: 201 Public or optional auth
POST /v2/admin/notification-templates/email/css-inline

POST /v2/admin/notification-templates/email/css-inline

Responses: 201 Public or optional auth
POST /v2/admin/notification-templates/email/sync

POST /v2/admin/notification-templates/email/sync

Responses: 201 Public or optional auth
GET /v2/admin/notification-templates/email/validate

GET /v2/admin/notification-templates/email/validate

Responses: 200 Public or optional auth
GET /v2/admin/notification-templates/push

GET /v2/admin/notification-templates/push

Responses: 200 Public or optional auth
POST /v2/admin/notification-templates/push

POST /v2/admin/notification-templates/push

Responses: 201 Public or optional auth
DELETE /v2/admin/notification-templates/push/{id}

DELETE /v2/admin/notification-templates/push/{id}

Responses: 200 Public or optional auth
GET /v2/admin/notification-templates/push/{id}

GET /v2/admin/notification-templates/push/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-templates/push/{id}

PATCH /v2/admin/notification-templates/push/{id}

Responses: 200 Public or optional auth
POST /v2/admin/notification-templates/push/{id}/preview

POST /v2/admin/notification-templates/push/{id}/preview

Responses: 201 Public or optional auth
PATCH /v2/admin/notification-templates/push/{id}/pricing

PATCH /v2/admin/notification-templates/push/{id}/pricing

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-templates/push/{id}/visibility

PATCH /v2/admin/notification-templates/push/{id}/visibility

Responses: 200 Public or optional auth
GET /v2/admin/notification-templates/sms

GET /v2/admin/notification-templates/sms

Responses: 200 Public or optional auth
POST /v2/admin/notification-templates/sms

POST /v2/admin/notification-templates/sms

Responses: 201 Public or optional auth
DELETE /v2/admin/notification-templates/sms/{id}

DELETE /v2/admin/notification-templates/sms/{id}

Responses: 200 Public or optional auth
GET /v2/admin/notification-templates/sms/{id}

GET /v2/admin/notification-templates/sms/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-templates/sms/{id}

PATCH /v2/admin/notification-templates/sms/{id}

Responses: 200 Public or optional auth
POST /v2/admin/notification-templates/sms/{id}/add-version

POST /v2/admin/notification-templates/sms/{id}/add-version

Responses: 201 Public or optional auth
GET /v2/admin/notification-templates/sms/{id}/mark-default

GET /v2/admin/notification-templates/sms/{id}/mark-default

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-templates/sms/{id}/pricing

PATCH /v2/admin/notification-templates/sms/{id}/pricing

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-templates/sms/{id}/visibility

PATCH /v2/admin/notification-templates/sms/{id}/visibility

Responses: 200 Public or optional auth
POST /v2/admin/notification-templates/sms/create-via-msg91

POST /v2/admin/notification-templates/sms/create-via-msg91

Responses: 201 Public or optional auth
GET /v2/admin/notification-templates/sms/msg91-analytics

GET /v2/admin/notification-templates/sms/msg91-analytics

Responses: 200 Public or optional auth
GET /v2/admin/notification-templates/sms/msg91-logs

GET /v2/admin/notification-templates/sms/msg91-logs

Responses: 200 Public or optional auth
POST /v2/admin/notification-templates/sms/sync

POST /v2/admin/notification-templates/sms/sync

Responses: 201 Public or optional auth
GET /v2/admin/notification-templates/whatsapp

GET /v2/admin/notification-templates/whatsapp

Responses: 200 Public or optional auth
POST /v2/admin/notification-templates/whatsapp

POST /v2/admin/notification-templates/whatsapp

Responses: 201 Public or optional auth
DELETE /v2/admin/notification-templates/whatsapp/{id}

DELETE /v2/admin/notification-templates/whatsapp/{id}

Responses: 200 Public or optional auth
GET /v2/admin/notification-templates/whatsapp/{id}

GET /v2/admin/notification-templates/whatsapp/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-templates/whatsapp/{id}

PATCH /v2/admin/notification-templates/whatsapp/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-templates/whatsapp/{id}/pricing

PATCH /v2/admin/notification-templates/whatsapp/{id}/pricing

Responses: 200 Public or optional auth
PATCH /v2/admin/notification-templates/whatsapp/{id}/provider-mapping

PATCH /v2/admin/notification-templates/whatsapp/{id}/provider-mapping

Responses: 200 Public or optional auth
POST /v2/admin/notification-templates/whatsapp/{id}/rollback-mapping

POST /v2/admin/notification-templates/whatsapp/{id}/rollback-mapping

Responses: 201 Public or optional auth
POST /v2/admin/notification-templates/whatsapp/{id}/verify-gupshup

POST /v2/admin/notification-templates/whatsapp/{id}/verify-gupshup

Responses: 201 Public or optional auth
PATCH /v2/admin/notification-templates/whatsapp/{id}/visibility

PATCH /v2/admin/notification-templates/whatsapp/{id}/visibility

Responses: 200 Public or optional auth
POST /v2/admin/notification-templates/whatsapp/sync

POST /v2/admin/notification-templates/whatsapp/sync

Responses: 201 Public or optional auth

Admin - Notification Wallets

3 operations

GET /v2/admin/notification-wallets

GET /v2/admin/notification-wallets

Responses: 200 Public or optional auth
GET /v2/admin/notification-wallets/{organizerId}

GET /v2/admin/notification-wallets/{organizerId}

Responses: 200 Public or optional auth
POST /v2/admin/notification-wallets/{organizerId}/adjust

POST /v2/admin/notification-wallets/{organizerId}/adjust

Responses: 201 Public or optional auth

Admin - Notifications

3 operations

GET /v2/admin/notifications/pipeline-readiness

GET /v2/admin/notifications/pipeline-readiness

Responses: 200 Public or optional auth
GET /v2/admin/notifications/provider-health

GET /v2/admin/notifications/provider-health

Responses: 200 Public or optional auth
POST /v2/admin/notifications/send

POST /v2/admin/notifications/send

Responses: 201 Public or optional auth

Admin - Organizers Oversight

3 operations

GET /v2/admin/organizers/{organizerId}

Get one organizer (admin detail incl. suspension)

Responses: 200 Public or optional auth
POST /v2/admin/organizers/{organizerId}/suspend

Suspend an organizer (revokes access + active sessions)

Responses: 201 Public or optional auth
POST /v2/admin/organizers/{organizerId}/unsuspend

Unsuspend an organizer (restores APPROVED status)

Responses: 201 Public or optional auth

Admin - Promotion Templates

5 operations

GET /v2/admin/promotion-templates

GET /v2/admin/promotion-templates

Responses: 200 Public or optional auth
POST /v2/admin/promotion-templates

POST /v2/admin/promotion-templates

Responses: 201 Public or optional auth
GET /v2/admin/promotion-templates/{id}

GET /v2/admin/promotion-templates/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/promotion-templates/{id}

PATCH /v2/admin/promotion-templates/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/promotion-templates/{id}/enabled

PATCH /v2/admin/promotion-templates/{id}/enabled

Responses: 200 Public or optional auth

Admin - System Notifications

6 operations

GET /v2/admin/system-notifications

GET /v2/admin/system-notifications

Responses: 200 Public or optional auth
POST /v2/admin/system-notifications

POST /v2/admin/system-notifications

Responses: 201 Public or optional auth
DELETE /v2/admin/system-notifications/{id}

DELETE /v2/admin/system-notifications/{id}

Responses: 200 Public or optional auth
GET /v2/admin/system-notifications/{id}

GET /v2/admin/system-notifications/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/system-notifications/{id}

PATCH /v2/admin/system-notifications/{id}

Responses: 200 Public or optional auth
GET /v2/admin/system-notifications/events

GET /v2/admin/system-notifications/events

Responses: 200 Public or optional auth

Admin - Training Plans

4 operations

GET /v2/admin/training-plans/list

Get all training plans with filters

Returns a paginated list of all training plans with detailed information for admin review.

Responses: 200, 403 Public or optional auth
GET /v2/admin/training-plans/revenue

Get revenue summary

Returns detailed revenue breakdown including total revenue, paid/free plans count, and revenue by program level.

Responses: 200, 403 Public or optional auth
GET /v2/admin/training-plans/stats

Get training plan statistics for dashboard

Returns comprehensive statistics including total plans, revenue breakdown, program level distribution, sport type distribution, and monthly trends.

Responses: 200, 403 Public or optional auth
GET /v2/admin/training-plans/users

Get user-wise training plan statistics

Returns a paginated list of users with their training plan statistics including total plans, revenue, and active plans.

Responses: 200, 403 Public or optional auth

Admin — Charity Verification

4 operations

GET /v2/admin/charities

List charities, optionally filtered by status (e.g. ?status=verified or ?status=pending).

Responses: 200 Public or optional auth
POST /v2/admin/charities

Register a new charity. Defaults to UNVERIFIED.

Responses: 201 Public or optional auth
GET /v2/admin/charities/{id}

Get a charity by ID.

Responses: 200 Public or optional auth
PATCH /v2/admin/charities/{id}/status

Transition a charity to a new verification status. Only legal transitions accepted; audit-logged.

Responses: 200 Public or optional auth

Admin — Growth Loops (§84)

2 operations

GET /v2/admin/growth-loops

List the 8 Repeak growth loops with stage / conversion / indicator metrics and explicit sourceStatus per signal. Admin-only.

Responses: 200 Public or optional auth
GET /v2/admin/growth-loops/{loopCode}

Detail view for a single growth loop. Same loop-row shape as the list endpoint. Admin-only.

Responses: 200 Public or optional auth

Admin — sponsorship finance

3 operations

GET /v2/admin/sponsorship-finance/dashboard

Platform-wide sponsorship finance totals — collected, retained, held, settled.

Responses: 200 Public or optional auth
GET /v2/admin/sponsorship-finance/payments

The sponsorship payment ledger: brand → Repeak → payee, with the gateway leg, the settlement leg, and the frozen fee breakdown on every row.

Responses: 200 Public or optional auth
GET /v2/admin/sponsorship-finance/payments/{contractId}

One sponsorship in full. Release actions stay on /v2/settlements/:id — use `settlement.id` from this row.

Responses: 200 Public or optional auth

Admin — User Verification Tiers

2 operations

GET /v2/admin/users/{userId}/verification-tier

Get a user's current verification tier (admin diagnostic).

Responses: 200 Public or optional auth
POST /v2/admin/users/{userId}/verification-tier

Set a user's verification tier. Tier changes are audited and append-only.

Responses: 201 Public or optional auth

Admin: 2FA enforcement

2 operations

POST /v2/admin/admins/{adminId}/require-totp

Flip `totpRequiredAt` for another admin. Forces enrollment on their next login (or clears the forcing clock when {required:false}).

Responses: 201 Public or optional auth
POST /v2/admin/admins/{adminId}/reset-totp

Reset another admin's TOTP enrollment (lost device / peer-enforcement). Clears their existing secret and immediately re-forces enrollment on next login. Cannot target yourself — use POST /v2/auth/totp/disable (requires your current code) for self-service.

Responses: 201 Public or optional auth

Admin: Account merge

6 operations

GET /v2/admin/compliance/account-merge

List merge proposals; filter by status.

Responses: 200 Public or optional auth
GET /v2/admin/compliance/account-merge/{id}

GET /v2/admin/compliance/account-merge/{id}

Responses: 200 Public or optional auth
POST /v2/admin/compliance/account-merge/{id}/cancel

POST /v2/admin/compliance/account-merge/{id}/cancel

Responses: 201 Public or optional auth
POST /v2/admin/compliance/account-merge/{id}/execute

Execute a PROPOSED merge. Feature-flag gated — returns 503 with code ACCOUNT_MERGE_EXECUTE_DISABLED until Sprint 10.

Responses: 201 Public or optional auth
POST /v2/admin/compliance/account-merge/preview

Compute the dependent-row preview without persisting anything. Safe to call repeatedly.

Responses: 201 Public or optional auth
POST /v2/admin/compliance/account-merge/propose

Persist a merge proposal. Reason ≥ 8 chars; conflict if either user has an open proposal.

Responses: 201 Public or optional auth

Admin: Activity Audit Log

1 operations

GET /v2/admin/activities/{id}/audit-log

List edit-audit log entries for an activity (PRD §17.8 G-6). Admin-only. Filter by editor / role / date-range; pagination via limit + offset.

Responses: 200 Public or optional auth

Admin: AI Cost Budget

2 operations

POST /v2/admin/ai-cost-budget/run

Run dispatcher: aggregates usage logs + emits ai_cost_budget.<level> event. Returns the same verdict shape as snapshot.

Responses: 201 Public or optional auth
GET /v2/admin/ai-cost-budget/snapshot

Read-only snapshot of current period AI cost vs budget. Returns alert level + projection + top-5 burners. Does NOT emit events.

Responses: 200 Public or optional auth

Admin: Ambassador messages

2 operations

GET /v2/admin/ambassador/offers/{offerId}/messages

Read a deal’s conversation.

Responses: 200 Auth required
POST /v2/admin/ambassador/offers/{offerId}/messages

Post into a deal’s conversation as Repeak. Both sides are told.

Responses: 201 Auth required

Admin: Ambassador money

12 operations

GET /v2/admin/ambassador/commission-settings

The commission rate and hold window in force.

Responses: 200 Auth required
PUT /v2/admin/ambassador/commission-settings

Set the commission rate. Applies to deals accepted from now on — never to ones already agreed.

Responses: 200 Auth required
GET /v2/admin/ambassador/disputes

Deals with an open dispute, oldest first.

Responses: 200 Auth required
POST /v2/admin/ambassador/disputes/{offerId}/resolve

Decide a dispute. RELEASED/WITHDRAWN let the payout proceed; UPHELD leaves it held for a manual refund.

Responses: 201 Auth required
GET /v2/admin/ambassador/payouts

Deals ready to pay out.

Responses: 200 Auth required
POST /v2/admin/ambassador/payouts/{offerId}/hold

Put a payout back on hold, with a reason the athlete can read. Omit `until` to hold indefinitely.

Responses: 201 Auth required
GET /v2/admin/ambassador/payouts/{offerId}/instructions

Payout instructions for one deal — masked account + net of TDS.

Responses: 200 Auth required
POST /v2/admin/ambassador/payouts/{offerId}/mark-brand-paid

Record that the brand’s money was received.

Responses: 201 Auth required
POST /v2/admin/ambassador/payouts/{offerId}/release

Release one held deal early. Refused while a dispute is open.

Responses: 201 Auth required
POST /v2/admin/ambassador/payouts/{offerId}/settle

Record that a matured deal was actually paid. Requires a verified payout account.

Responses: 201 Auth required
POST /v2/admin/ambassador/payouts/release-matured

Release every hold whose window has matured.

Responses: 201 Auth required
GET /v2/admin/ambassador/shipments

Product-deal delivery queue and carrier exceptions.

Responses: 200 Auth required

Admin: Analytics readiness

5 operations

GET /v2/admin/analytics/engagement-retention

V3-P1-026 — DAU/WAU/MAU + D1/D7/D30 retention. Retention buckets return null (NOT_INSTRUMENTED) until cohort signup-day audit access ships.

Responses: 200 Public or optional auth
GET /v2/admin/analytics/five-funnels

V3-P1-024 — 5-funnel attribution counts

Responses: 200 Public or optional auth
GET /v2/admin/analytics/onboarding-funnel

V3-P1-023 — onboarding funnel drop-off counts

Responses: 200 Public or optional auth
GET /v2/admin/analytics/performance

V3-P1-041 — performance monitoring (p50/p95/p99). Honestly NOT_INSTRUMENTED until OpenTelemetry/Datadog wired; runbook returned.

Responses: 200 Public or optional auth
GET /v2/admin/analytics/waa

V3-P1-025 — weekly active athletes (last 7d)

Responses: 200 Public or optional auth

Admin: Anti-Cheat

10 operations

GET /v2/admin/anti-cheat/appeals

GET /v2/admin/anti-cheat/appeals

Responses: 200 Public or optional auth
GET /v2/admin/anti-cheat/appeals/{appealId}

GET /v2/admin/anti-cheat/appeals/{appealId}

Responses: 200 Public or optional auth
POST /v2/admin/anti-cheat/appeals/{appealId}/decision

POST /v2/admin/anti-cheat/appeals/{appealId}/decision

Responses: 201 Public or optional auth
GET /v2/admin/anti-cheat/flags/{flagId}

GET /v2/admin/anti-cheat/flags/{flagId}

Responses: 200 Public or optional auth
POST /v2/admin/anti-cheat/flags/{flagId}/decision

POST /v2/admin/anti-cheat/flags/{flagId}/decision

Responses: 201 Public or optional auth
GET /v2/admin/anti-cheat/flags/{flagId}/responses

GET /v2/admin/anti-cheat/flags/{flagId}/responses

Responses: 200 Public or optional auth
GET /v2/admin/anti-cheat/governance

GET /v2/admin/anti-cheat/governance

Responses: 200 Public or optional auth
PATCH /v2/admin/anti-cheat/governance/mode

PATCH /v2/admin/anti-cheat/governance/mode

Responses: 200 Public or optional auth
PATCH /v2/admin/anti-cheat/governance/rules/{ruleKey}

PATCH /v2/admin/anti-cheat/governance/rules/{ruleKey}

Responses: 200 Public or optional auth
GET /v2/admin/anti-cheat/queue

GET /v2/admin/anti-cheat/queue

Responses: 200 Public or optional auth

Admin: App Versions

3 operations

GET /v2/admin/app-version-policies

List both platform policies + audit metadata.

Responses: 200 Public or optional auth
PUT /v2/admin/app-version-policies/{platform}

Update a platform policy. 400 on bad semver or min>latest (lockout guard).

Responses: 200 Public or optional auth
GET /v2/admin/app-version-policies/{platform}/impact

Best-effort blast radius for a proposed minimum (users it would force-update).

Responses: 200 Public or optional auth

Admin: Audit log (viewer)

3 operations

GET /v2/admin/audit-log

Admin audit-log viewer — closed-allowlist projection + redacted metadata. Filter by actor / subjectType+subjectId / action / date range. Cursor-paginated.

Responses: 200 Auth required
GET /v2/admin/audit-log/chain-health

Audit-log chain health — recomputes SHA-256 entry_hash for the latest N rows and walks prev_hash linkage. Returns brokenLinkCount, firstBrokenSequence, and up to 10 broken-link diagnostics. Window param defaults to 10000 (capped at 100000).

Responses: 200 Auth required
POST /v2/admin/audit-log/export

Admin audit-log CSV export. Body carries the same filters as the viewer plus a 10–500 char reason; backend emits `admin.audit_log.exported` audit with `{ filterDigest, rowCount, reasonLen }`. Hard cap 5000 rows.

Responses: 201 Auth required

Admin: Audit logs

1 operations

GET /v2/admin/audit-logs

DEPRECATED — use /v2/admin/audit-log (singular) instead. Retained for back-compat; metadata is now defense-in-depth redacted to match the canonical viewer.

Responses: 200 Auth required

Admin: Brand readiness

8 operations

POST /v2/admin/brand-challenge-approvals/{challengeId}/approve

Approve a brand-sponsored challenge

Responses: 201 Public or optional auth
POST /v2/admin/brand-challenge-approvals/{challengeId}/reject

Reject a brand-sponsored challenge

Responses: 201 Public or optional auth
GET /v2/admin/brand-challenge-approvals/pending

List brand challenges awaiting admin approval

Responses: 200 Public or optional auth
GET /v2/admin/fulfillment-tasks

List fulfillment queue (admin)

Responses: 200 Public or optional auth
POST /v2/admin/fulfillment-tasks

Create a fulfillment task (admin or auto-flow)

Responses: 201 Public or optional auth
POST /v2/admin/fulfillment-tasks/{id}/assign

Assign a PENDING fulfillment task to an ops user

Responses: 201 Public or optional auth
POST /v2/admin/fulfillment-tasks/{id}/transition

Transition a fulfillment task

Responses: 201 Public or optional auth
GET /v2/admin/fulfillment-tasks/aging

List fulfillment tasks with SLA aging class

Responses: 200 Public or optional auth

Admin: Brand stories

2 operations

GET /v2/admin/brand-stories

List brand stories across every brand (moderation queue).

Responses: 200 Auth required
POST /v2/admin/brand-stories/{storyId}/takedown

Force a story out of public view (→ ARCHIVED), bypassing brand ownership. Requires an audited reason (≥10 chars).

Responses: 201 Auth required

Admin: Challenge Badge Requests

4 operations

GET /v2/admins/challenge-badge-requests

GET /v2/admins/challenge-badge-requests

Responses: 200 Public or optional auth
GET /v2/admins/challenge-badge-requests/{id}

GET /v2/admins/challenge-badge-requests/{id}

Responses: 200 Public or optional auth
POST /v2/admins/challenge-badge-requests/{id}/complete

POST /v2/admins/challenge-badge-requests/{id}/complete

Responses: 201 Public or optional auth
POST /v2/admins/challenge-badge-requests/{id}/reject

POST /v2/admins/challenge-badge-requests/{id}/reject

Responses: 201 Public or optional auth

Admin: Chargeback defend flow

9 operations

GET /v2/admin/chargebacks/defend

List chargebacks with defend-flow projection. Filters: defendStatus / search (gatewayCaseId) / fromDate / toDate. Paginated.

Responses: 200 Auth required
GET /v2/admin/chargebacks/defend/{chargebackId}

Detail projection: includes evidence list + defense draft + reviewer fields. paymentId is unmasked here (admin scope).

Responses: 200 Auth required
POST /v2/admin/chargebacks/defend/{chargebackId}/cancel

Cancel a non-terminal chargeback (e.g. duplicate webhook, gateway dropped the case).

Responses: 201 Auth required
PATCH /v2/admin/chargebacks/defend/{chargebackId}/defense-draft

Save defense draft (autosave-friendly). Caps at 4000 chars. Recomputes derived defendStatus.

Responses: 200 Auth required
POST /v2/admin/chargebacks/defend/{chargebackId}/evidence

Add an evidence item. kind enum + (fileUrl absolute http(s) OR description) required.

Responses: 201 Auth required
POST /v2/admin/chargebacks/defend/{chargebackId}/mark-expired

Mark a non-SUBMITTED chargeback as EXPIRED. Allowed when the gateway deadline has passed without submission.

Responses: 201 Auth required
POST /v2/admin/chargebacks/defend/{chargebackId}/mark-lost

Mark a SUBMITTED chargeback as LOST. Records resolvedByUserId + resolvedAt + resolutionReason.

Responses: 201 Auth required
POST /v2/admin/chargebacks/defend/{chargebackId}/mark-won

Mark a SUBMITTED chargeback as WON. Records resolvedByUserId + resolvedAt + resolutionReason.

Responses: 201 Auth required
POST /v2/admin/chargebacks/defend/{chargebackId}/submit-defense

Submit defense packet. Requires ≥2 evidence items + ≥40-char draft. Honesty: gatewaySubmissionStatus is set to MANUAL_GATEWAY_UPLOAD_REQUIRED — no real Cashfree/Razorpay dispute API integrated yet.

Responses: 201 Auth required

Admin: Club chat moderation

3 operations

GET /v2/admin/clubs/{clubId}/chat/messages

GET /v2/admin/clubs/{clubId}/chat/messages

Responses: 200 Auth required
DELETE /v2/admin/clubs/{clubId}/chat/messages/{msgId}

DELETE /v2/admin/clubs/{clubId}/chat/messages/{msgId}

Responses: 200 Auth required
GET /v2/admin/clubs/chat/recent-activity

GET /v2/admin/clubs/chat/recent-activity

Responses: 200 Auth required

Admin: Club Commission

3 operations

PATCH /v2/clubs/{clubId}/commission

Platform admin: set/clear the club-wide subscription commission override.

Responses: 200 Public or optional auth
PATCH /v2/clubs/{clubId}/tiers/{tierId}/commission

Platform admin: set/clear the per-tier club subscription commission.

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/tiers/{tierId}/commission/breakdown

Platform admin: resolved commission split for a saved tier, plus the raw tier/club overrides.

Responses: 200 Public or optional auth

Admin: Club KYC

6 operations

GET /v2/admin/club-kyc

List club KYC submissions awaiting review. Defaults to UNDER_REVIEW; supports ?state= and ?page=&limit=.

Responses: 200 Auth required
GET /v2/admin/club-kyc/{kycId}

Full club KYC detail — includes the document URLs and full bank account details so the reviewer can actually inspect the submission.

Responses: 200 Auth required
POST /v2/admin/club-kyc/{kycId}/approve

Approve an UNDER_REVIEW club KYC.

Responses: 201 Auth required
POST /v2/admin/club-kyc/{kycId}/reject

Reject an UNDER_REVIEW club KYC. Reason required (10-500 chars), shown verbatim to the club.

Responses: 201 Auth required
POST /v2/admin/club-kyc/{kycId}/request-resubmission

Send an UNDER_REVIEW club KYC back for changes (RESUBMIT) without a hard rejection. Reason required (10-500 chars).

Responses: 201 Auth required
GET /v2/admin/club-kyc/by-club/{clubId}

Full club KYC detail for a given club, looked up by clubId rather than kycId. Returns null (not 404) when the club has never started a KYC submission — powers the combined onboarding+KYC review page.

Responses: 200 Auth required

Admin: Club onboarding queue

3 operations

GET /v2/admin/club-onboarding

Paginated admin queue. Default status = PENDING_APPROVAL. Other accepted: ACTIVE, SUSPENDED.

Responses: 200 Auth required
POST /v2/admin/club-onboarding/{clubId}/approve

Approve a PENDING_APPROVAL club. PENDING_APPROVAL → ACTIVE.

Responses: 201 Auth required
POST /v2/admin/club-onboarding/{clubId}/reject

Reject a PENDING_APPROVAL club. PENDING_APPROVAL → SUSPENDED. Reason required (10-500 chars), returned verbatim to the organizer.

Responses: 201 Auth required

Admin: Club RC Grants

4 operations

GET /v2/admin/club-rc-grants

RC grant queue, OLDEST FIRST (longest-waiting club at the top). Filter with ?status=REQUESTED|APPROVED|REJECTED|CANCELLED, ?clubId=, ?page=, ?limit=.

Responses: 200 Auth required
GET /v2/admin/club-rc-grants/{id}

One RC grant request, plus the requesting club's total outstanding granted-RC debt in COINS (with a rupee estimate at today's rate) — the number a reviewer needs before handing over more.

Responses: 200 Auth required
POST /v2/admin/club-rc-grants/{id}/approve

Approve an RC grant. Omit approvedRc to grant the full ask; supply a smaller number to trim it (never larger). In one transaction this records the granted COINS as the debt, notes the current platform rate as history only, and credits the club creator wallet. The rupee amount is NOT fixed here — it is computed at payout time from the live rate. Idempotent — approving twice credits once.

Responses: 200 Auth required
POST /v2/admin/club-rc-grants/{id}/reject

Reject an RC grant request. Reason required (10-1000 chars), shown verbatim to the club. Credits nothing and creates no debt.

Responses: 200 Auth required

Admin: Clubs

17 operations

GET /v2/admin/clubs

GET /v2/admin/clubs

Responses: 200 Public or optional auth
GET /v2/admin/clubs/{id}

GET /v2/admin/clubs/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/clubs/{id}

PATCH /v2/admin/clubs/{id}

Responses: 200 Public or optional auth
GET /v2/admin/clubs/{id}/announcements

GET /v2/admin/clubs/{id}/announcements

Responses: 200 Public or optional auth
POST /v2/admin/clubs/{id}/announcements

POST /v2/admin/clubs/{id}/announcements

Responses: 201 Public or optional auth
POST /v2/admin/clubs/{id}/deactivate

POST /v2/admin/clubs/{id}/deactivate

Responses: 201 Public or optional auth
GET /v2/admin/clubs/{id}/members

GET /v2/admin/clubs/{id}/members

Responses: 200 Public or optional auth
POST /v2/admin/clubs/{id}/members

POST /v2/admin/clubs/{id}/members

Responses: 201 Public or optional auth
DELETE /v2/admin/clubs/{id}/members/{userId}

DELETE /v2/admin/clubs/{id}/members/{userId}

Responses: 200 Public or optional auth
PATCH /v2/admin/clubs/{id}/members/{userId}

PATCH /v2/admin/clubs/{id}/members/{userId}

Responses: 200 Public or optional auth
GET /v2/admin/clubs/{id}/moderation-reports

GET /v2/admin/clubs/{id}/moderation-reports

Responses: 200 Public or optional auth
POST /v2/admin/clubs/{id}/reactivate

POST /v2/admin/clubs/{id}/reactivate

Responses: 201 Public or optional auth
POST /v2/admin/clubs/{id}/verify-approve

POST /v2/admin/clubs/{id}/verify-approve

Responses: 201 Public or optional auth
POST /v2/admin/clubs/{id}/verify-reject

POST /v2/admin/clubs/{id}/verify-reject

Responses: 201 Public or optional auth
DELETE /v2/admin/clubs/announcements/{annId}

DELETE /v2/admin/clubs/announcements/{annId}

Responses: 200 Public or optional auth
GET /v2/admin/clubs/runs

GET /v2/admin/clubs/runs

Responses: 200 Public or optional auth
GET /v2/admin/clubs/verification-queue

GET /v2/admin/clubs/verification-queue

Responses: 200 Public or optional auth

Admin: Clubs Depth

3 operations

POST /v2/admin/clubs/attendance/infer

POST /v2/admin/clubs/attendance/infer

Responses: 201 Public or optional auth
GET /v2/admin/clubs/runs/{runId}/attendance

GET /v2/admin/clubs/runs/{runId}/attendance

Responses: 200 Public or optional auth
POST /v2/admin/clubs/runs/{runId}/attendance/manual

POST /v2/admin/clubs/runs/{runId}/attendance/manual

Responses: 201 Public or optional auth

Admin: Community Guidelines

4 operations

GET /v2/admin/community-guidelines

GET /v2/admin/community-guidelines

Responses: 200 Public or optional auth
POST /v2/admin/community-guidelines

POST /v2/admin/community-guidelines

Responses: 201 Public or optional auth
GET /v2/admin/community-guidelines/{id}

GET /v2/admin/community-guidelines/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/community-guidelines/{id}

PATCH /v2/admin/community-guidelines/{id}

Responses: 200 Public or optional auth

Admin: Compliance

5 operations

GET /v2/admin/compliance/consent-manager/status

Consent-Manager vendor wiring status. Reports whether credentials are configured; never leaks the creds.

Responses: 200 Public or optional auth
GET /v2/admin/compliance/erasure-requests

List erasure requests filtered by status.

Responses: 200 Public or optional auth
POST /v2/admin/compliance/erasure-requests/{id}/reject

Reject an erasure request because a legal hold blocks it. Statute + retention date mandatory.

Responses: 201 Public or optional auth
POST /v2/admin/compliance/erasure-requests/tick

Advance cool-off-eligible requests to CONFIRMED. Scheduled worker calls this too.

Responses: 201 Public or optional auth
GET /v2/admin/compliance/users/{userId}/consent/history

View a principal's full consent history (admin support).

Responses: 200 Public or optional auth

Admin: Content Feed

9 operations

GET /v2/admin/content-feed

GET /v2/admin/content-feed

Responses: 200 Public or optional auth
POST /v2/admin/content-feed

POST /v2/admin/content-feed

Responses: 201 Public or optional auth
DELETE /v2/admin/content-feed/{id}

DELETE /v2/admin/content-feed/{id}

Responses: 200 Public or optional auth
GET /v2/admin/content-feed/{id}

GET /v2/admin/content-feed/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/content-feed/{id}

PATCH /v2/admin/content-feed/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/content-feed/{id}/publish

PATCH /v2/admin/content-feed/{id}/publish

Responses: 200 Public or optional auth
POST /v2/admin/content-feed/{id}/restore

POST /v2/admin/content-feed/{id}/restore

Responses: 201 Public or optional auth
PATCH /v2/admin/content-feed/{id}/unpublish

PATCH /v2/admin/content-feed/{id}/unpublish

Responses: 200 Public or optional auth
POST /v2/admin/content-feed/cover-images

POST /v2/admin/content-feed/cover-images

Responses: 201 Public or optional auth

Admin: CSAT (Wave 6 §63.4)

4 operations

POST /v2/admin/csat

POST /v2/admin/csat

Responses: 201 Public or optional auth
GET /v2/admin/csat/by-ticket/{ticketId}

GET /v2/admin/csat/by-ticket/{ticketId}

Responses: 200 Public or optional auth
GET /v2/admin/csat/recent

GET /v2/admin/csat/recent

Responses: 200 Public or optional auth
GET /v2/admin/csat/summary

GET /v2/admin/csat/summary

Responses: 200 Public or optional auth

Admin: DM compliance

2 operations

GET /v2/admin/dm/threads

GET /v2/admin/dm/threads

Responses: 200 Auth required
GET /v2/admin/dm/threads/{id}/messages

GET /v2/admin/dm/threads/{id}/messages

Responses: 200 Auth required

Admin: Enrichment (Wave 6)

4 operations

GET /v2/admin/enrichment/active-alerts

GET /v2/admin/enrichment/active-alerts

Responses: 200 Public or optional auth
GET /v2/admin/enrichment/anti-cheat/peer-comparison/{activityId}

GET /v2/admin/enrichment/anti-cheat/peer-comparison/{activityId}

Responses: 200 Public or optional auth
GET /v2/admin/enrichment/organizers/{id}/feedback

GET /v2/admin/enrichment/organizers/{id}/feedback

Responses: 200 Public or optional auth
GET /v2/admin/enrichment/organizers/{id}/risk

GET /v2/admin/enrichment/organizers/{id}/risk

Responses: 200 Public or optional auth

Admin: Experiments (Wave 6 §64.2/§64.3)

7 operations

GET /v2/admin/experiments

GET /v2/admin/experiments

Responses: 200 Public or optional auth
POST /v2/admin/experiments

POST /v2/admin/experiments

Responses: 201 Public or optional auth
DELETE /v2/admin/experiments/{key}

DELETE /v2/admin/experiments/{key}

Responses: 200 Public or optional auth
GET /v2/admin/experiments/{key}

GET /v2/admin/experiments/{key}

Responses: 200 Public or optional auth
PATCH /v2/admin/experiments/{key}

PATCH /v2/admin/experiments/{key}

Responses: 200 Public or optional auth
GET /v2/admin/experiments/{key}/results

GET /v2/admin/experiments/{key}/results

Responses: 200 Public or optional auth
POST /v2/admin/experiments/significance

POST /v2/admin/experiments/significance

Responses: 201 Public or optional auth

Admin: External Readiness

1 operations

GET /v2/admin/ext-readiness

Read-only snapshot of all 8 EXT adapter readiness flags + blockers + NOT_CONFIGURED error codes.

Responses: 200 Public or optional auth

Admin: Feature Flag Inventory

5 operations

GET /v2/admin/feature-flags/canonical

GET /v2/admin/feature-flags/canonical

Responses: 200 Public or optional auth
GET /v2/admin/feature-flags/canonical/{key}

GET /v2/admin/feature-flags/canonical/{key}

Responses: 200 Public or optional auth
GET /v2/admin/feature-flags/inventory

GET /v2/admin/feature-flags/inventory

Responses: 200 Public or optional auth
GET /v2/admin/feature-flags/inventory/{key}

GET /v2/admin/feature-flags/inventory/{key}

Responses: 200 Public or optional auth
POST /v2/admin/feature-flags/mutation-check

POST /v2/admin/feature-flags/mutation-check

Responses: 201 Public or optional auth

Admin: Feature Flags

5 operations

GET /v2/admin/platform-feature-flags

GET /v2/admin/platform-feature-flags

Responses: 200 Public or optional auth
POST /v2/admin/platform-feature-flags

POST /v2/admin/platform-feature-flags

Responses: 201 Public or optional auth
DELETE /v2/admin/platform-feature-flags/{key}

DELETE /v2/admin/platform-feature-flags/{key}

Responses: 200 Public or optional auth
PATCH /v2/admin/platform-feature-flags/{key}/rollout

PATCH /v2/admin/platform-feature-flags/{key}/rollout

Responses: 200 Public or optional auth
POST /v2/admin/platform-feature-flags/guarded

POST /v2/admin/platform-feature-flags/guarded

Responses: 201 Public or optional auth

Admin: Feed moderation

13 operations

GET /v2/admin/feed

GET /v2/admin/feed

Responses: 200 Auth required
DELETE /v2/admin/feed/{id}

DELETE /v2/admin/feed/{id}

Responses: 200 Auth required
GET /v2/admin/feed/{id}

GET /v2/admin/feed/{id}

Responses: 200 Auth required
POST /v2/admin/feed/{id}/hide

POST /v2/admin/feed/{id}/hide

Responses: 201 Auth required
PATCH /v2/admin/feed/{id}/trust

PATCH /v2/admin/feed/{id}/trust

Responses: 200 Auth required
POST /v2/admin/feed/{id}/unhide

POST /v2/admin/feed/{id}/unhide

Responses: 201 Auth required
GET /v2/admin/feed/comments

GET /v2/admin/feed/comments

Responses: 200 Auth required
PATCH /v2/admin/feed/comments/{id}/hide

PATCH /v2/admin/feed/comments/{id}/hide

Responses: 200 Auth required
PATCH /v2/admin/feed/comments/{id}/unhide

PATCH /v2/admin/feed/comments/{id}/unhide

Responses: 200 Auth required
GET /v2/admin/feed/hashtags

GET /v2/admin/feed/hashtags

Responses: 200 Auth required
PATCH /v2/admin/feed/hashtags/{tag}/ban

PATCH /v2/admin/feed/hashtags/{tag}/ban

Responses: 200 Auth required
GET /v2/admin/feed/hashtags/{tag}/posts

GET /v2/admin/feed/hashtags/{tag}/posts

Responses: 200 Auth required
PATCH /v2/admin/feed/hashtags/{tag}/unban

PATCH /v2/admin/feed/hashtags/{tag}/unban

Responses: 200 Auth required

Admin: Hybrid Race Edge Cases

2 operations

GET /v2/admin/hybrid-race/edge-cases/flagged

List edge-case verdicts flagged for admin review. Paginated. Cross-link §71 G-71-9 review queue.

Responses: 200 Public or optional auth
GET /v2/admin/hybrid-race/edge-cases/result/{resultId}

Recent edge-case verdicts for a single hybrid-race result. Used by admin result-detail UI to show timeline of observations.

Responses: 200 Public or optional auth

Admin: Impersonation

2 operations

POST /v2/admin/impersonation/end

End an impersonation session. Revokes the minted token so the session dies before its TTL.

Responses: 201 Public or optional auth
POST /v2/admin/users/{userId}/impersonate

Start an impersonation session. Returns a short-lived USER-role access token for the target user. Reason is required and logged.

Responses: 201 Public or optional auth

Admin: Integrations

3 operations

POST /v2/admin/integrations/apple-health/upload

POST /v2/admin/integrations/apple-health/upload

Responses: 201 Public or optional auth
GET /v2/admin/integrations/health

GET /v2/admin/integrations/health

Responses: 200 Public or optional auth
GET /v2/admin/integrations/logs

GET /v2/admin/integrations/logs

Responses: 200 Public or optional auth

Admin: Knowledge Base

6 operations

GET /v2/admin/kb-articles

List KB articles, optionally by status.

Responses: 200 Auth required
POST /v2/admin/kb-articles

Create a KB article (DRAFT).

Responses: 201 Auth required
GET /v2/admin/kb-articles/{id}

Get a KB article by id.

Responses: 200 Auth required
PUT /v2/admin/kb-articles/{id}

Update a KB article (bumps version).

Responses: 200 Auth required
POST /v2/admin/kb-articles/{id}/archive

Archive a KB article.

Responses: 201 Auth required
POST /v2/admin/kb-articles/{id}/publish

Publish a KB article.

Responses: 201 Auth required

Admin: Lifecycle Triggers

4 operations

POST /v2/admin/lifecycle/triggers/run

POST /v2/admin/lifecycle/triggers/run

Responses: 201 Public or optional auth
GET /v2/admin/lifecycle/triggers/summary

GET /v2/admin/lifecycle/triggers/summary

Responses: 200 Public or optional auth
GET /v2/admin/lifecycle/triggers/trends

GET /v2/admin/lifecycle/triggers/trends

Responses: 200 Public or optional auth
GET /v2/admin/lifecycle/users/{userId}/history

GET /v2/admin/lifecycle/users/{userId}/history

Responses: 200 Public or optional auth

Admin: Marketplace economics

7 operations

GET /v2/admin/marketplace/economics

List marketplace economics configs with optional status filter (DRAFT/ACTIVE/INACTIVE/ARCHIVED).

Responses: 200 Auth required
POST /v2/admin/marketplace/economics

Create marketplace economics config (admin)

Responses: 201 Auth required
GET /v2/admin/marketplace/economics/{configId}

Single config detail

Responses: 200 Auth required
PATCH /v2/admin/marketplace/economics/{configId}

Update marketplace economics config (admin)

Responses: 200 Auth required
POST /v2/admin/marketplace/economics/{configId}/activate

Activate config. Auto-deactivates the prior ACTIVE row to INACTIVE. Refuses ARCHIVED → ACTIVE.

Responses: 201 Auth required
POST /v2/admin/marketplace/economics/{configId}/archive

Archive config (permanent retire — audit trail)

Responses: 201 Auth required
GET /v2/admin/marketplace/economics/projections

Honest revenue projection — gross/platformFee/sellerPayout/tax/net/orderCount/refundAmount. ALWAYS null with sourceStatus today; no marketplace order/payment source table exists yet.

Responses: 200 Auth required

Admin: Master Events

9 operations

GET /v2/admin/master-events

List master events for governance.

Responses: 200 Auth required
GET /v2/admin/master-events/{eventId}

Inspect one master event.

Responses: 200 Auth required
GET /v2/admin/master-events/{eventId}/orders

GET /v2/admin/master-events/{eventId}/orders

Responses: 200 Auth required
GET /v2/admin/master-events/{eventId}/participants

GET /v2/admin/master-events/{eventId}/participants

Responses: 200 Auth required
GET /v2/admin/master-events/{eventId}/rewards

GET /v2/admin/master-events/{eventId}/rewards

Responses: 200 Auth required
PATCH /v2/admin/master-events/{eventId}/status

Moderate master-event publication status.

Responses: 200 Auth required
POST /v2/admin/master-events/orders/{orderId}/reconcile-refund

POST /v2/admin/master-events/orders/{orderId}/reconcile-refund

Responses: 201 Auth required
POST /v2/admin/master-events/orders/{orderId}/reconcile-settlement

POST /v2/admin/master-events/orders/{orderId}/reconcile-settlement

Responses: 201 Auth required
PATCH /v2/admin/master-events/rewards/{grantId}

PATCH /v2/admin/master-events/rewards/{grantId}

Responses: 200 Auth required

Admin: Media moderation

4 operations

GET /v2/admin/moderation/media

GET /v2/admin/moderation/media

Responses: 200 Public or optional auth
GET /v2/admin/moderation/media/{assetId}

GET /v2/admin/moderation/media/{assetId}

Responses: 200 Public or optional auth
POST /v2/admin/moderation/media/{assetId}/approve

POST /v2/admin/moderation/media/{assetId}/approve

Responses: 201 Public or optional auth
POST /v2/admin/moderation/media/{assetId}/reject

POST /v2/admin/moderation/media/{assetId}/reject

Responses: 201 Public or optional auth

Admin: Mobile Experiences

13 operations

GET /v2/admin/mobile-experiences

GET /v2/admin/mobile-experiences

Responses: 200 Public or optional auth
POST /v2/admin/mobile-experiences

POST /v2/admin/mobile-experiences

Responses: 201 Public or optional auth
DELETE /v2/admin/mobile-experiences/{id}

DELETE /v2/admin/mobile-experiences/{id}

Responses: 200 Public or optional auth
GET /v2/admin/mobile-experiences/{id}

GET /v2/admin/mobile-experiences/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/mobile-experiences/{id}

PATCH /v2/admin/mobile-experiences/{id}

Responses: 200 Public or optional auth
GET /v2/admin/mobile-experiences/{id}/analytics

GET /v2/admin/mobile-experiences/{id}/analytics

Responses: 200 Public or optional auth
GET /v2/admin/mobile-experiences/{id}/eligibility

GET /v2/admin/mobile-experiences/{id}/eligibility

Responses: 200 Public or optional auth
POST /v2/admin/mobile-experiences/{id}/pause

POST /v2/admin/mobile-experiences/{id}/pause

Responses: 201 Public or optional auth
POST /v2/admin/mobile-experiences/{id}/publish

POST /v2/admin/mobile-experiences/{id}/publish

Responses: 201 Public or optional auth
GET /v2/admin/mobile-experiences/destinations

GET /v2/admin/mobile-experiences/destinations

Responses: 200 Public or optional auth
GET /v2/admin/mobile-experiences/destinations/search

GET /v2/admin/mobile-experiences/destinations/search

Responses: 200 Public or optional auth
POST /v2/admin/mobile-experiences/media

Upload one promotional image or MP4 creative

Responses: 201 Public or optional auth
GET /v2/admin/mobile-experiences/options

GET /v2/admin/mobile-experiences/options

Responses: 200 Public or optional auth

Admin: North-Star Metrics

2 operations

GET /v2/admin/metrics/north-star

GET /v2/admin/metrics/north-star

Responses: 200 Public or optional auth
GET /v2/admin/metrics/revenue-series

GET /v2/admin/metrics/revenue-series

Responses: 200 Public or optional auth

Admin: Notification Retry Policies

4 operations

GET /v2/admin/notifications/retry-policies

GET /v2/admin/notifications/retry-policies

Responses: 200 Public or optional auth
POST /v2/admin/notifications/retry-policies

POST /v2/admin/notifications/retry-policies

Responses: 201 Public or optional auth
GET /v2/admin/notifications/retry-policies/{id}

GET /v2/admin/notifications/retry-policies/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/notifications/retry-policies/{id}

PATCH /v2/admin/notifications/retry-policies/{id}

Responses: 200 Public or optional auth

Admin: Nutrition Fueling Templates

6 operations

GET /v2/admin/nutrition/fueling-templates

GET /v2/admin/nutrition/fueling-templates

Responses: 200 Public or optional auth
POST /v2/admin/nutrition/fueling-templates

POST /v2/admin/nutrition/fueling-templates

Responses: 201 Public or optional auth
DELETE /v2/admin/nutrition/fueling-templates/{id}

DELETE /v2/admin/nutrition/fueling-templates/{id}

Responses: 200 Public or optional auth
GET /v2/admin/nutrition/fueling-templates/{id}

GET /v2/admin/nutrition/fueling-templates/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/nutrition/fueling-templates/{id}

PATCH /v2/admin/nutrition/fueling-templates/{id}

Responses: 200 Public or optional auth
POST /v2/admin/nutrition/fueling-templates/{id}/restore

POST /v2/admin/nutrition/fueling-templates/{id}/restore

Responses: 201 Public or optional auth

Admin: Nutrition sources

5 operations

GET /v2/admin/nutrition/sources

GET /v2/admin/nutrition/sources

Responses: 200 Public or optional auth
POST /v2/admin/nutrition/sources

POST /v2/admin/nutrition/sources

Responses: 201 Public or optional auth
PATCH /v2/admin/nutrition/sources/{key}

PATCH /v2/admin/nutrition/sources/{key}

Responses: 200 Public or optional auth
POST /v2/admin/nutrition/sources/{key}/enable

Toggle source enabled flag.

Responses: 200 Public or optional auth
POST /v2/admin/nutrition/sources/seed/ifct

Idempotently seed the IFCT 2017 dataset (~40 staples). Repeatable; subsequent calls update existing rows.

Responses: 200 Public or optional auth

Admin: Observability

4 operations

GET /v2/admin/observability/metrics

GET /v2/admin/observability/metrics

Responses: 200 Public or optional auth
GET /v2/admin/observability/metrics.prom

GET /v2/admin/observability/metrics.prom

Responses: 200 Public or optional auth
GET /v2/admin/observability/otlp-status

GET /v2/admin/observability/otlp-status

Responses: 200 Public or optional auth
POST /v2/admin/observability/otlp/export-now

POST /v2/admin/observability/otlp/export-now

Responses: 201 Public or optional auth

Admin: Observability v2

5 operations

GET /v2/admin/observability/errors

GET /v2/admin/observability/errors

Responses: 200 Public or optional auth
GET /v2/admin/observability/pagerduty

GET /v2/admin/observability/pagerduty

Responses: 200 Public or optional auth
POST /v2/admin/observability/pagerduty/test

POST /v2/admin/observability/pagerduty/test

Responses: 201 Public or optional auth
GET /v2/admin/observability/queues

GET /v2/admin/observability/queues

Responses: 200 Public or optional auth
GET /v2/admin/observability/slo

GET /v2/admin/observability/slo

Responses: 200 Public or optional auth

Admin: Official Partners

11 operations

GET /v2/admin/official-partners

GET /v2/admin/official-partners

Responses: 200 Public or optional auth
POST /v2/admin/official-partners

Create an Organizer/Club official partnership

Responses: 201 Public or optional auth
DELETE /v2/admin/official-partners/{id}

Remove an Official Repeak Partner record

Responses: 200 Public or optional auth
GET /v2/admin/official-partners/{id}

GET /v2/admin/official-partners/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/official-partners/{id}

Update an Official Repeak Partner record

Responses: 200 Public or optional auth
GET /v2/admin/official-partners/benefit-definitions

GET /v2/admin/official-partners/benefit-definitions

Responses: 200 Public or optional auth
GET /v2/admin/official-partners/candidates

GET /v2/admin/official-partners/candidates

Responses: 200 Public or optional auth
GET /v2/admin/official-partners/exclusive-tab

GET /v2/admin/official-partners/exclusive-tab

Responses: 200 Public or optional auth
PUT /v2/admin/official-partners/exclusive-tab

Configure the single athlete exclusive partner tab

Responses: 200 Public or optional auth
GET /v2/admin/official-partners/exclusive-tab/targets

GET /v2/admin/official-partners/exclusive-tab/targets

Responses: 200 Public or optional auth
POST /v2/admin/official-partners/logo-images

Upload an Official Partner image logo

Responses: 201 Public or optional auth

Admin: Operations

33 operations

GET /v2/admin/ab-tests

GET /v2/admin/ab-tests

Responses: 200 Public or optional auth
PUT /v2/admin/ab-tests/{key}

PUT /v2/admin/ab-tests/{key}

Responses: 200 Public or optional auth
GET /v2/admin/chargebacks

GET /v2/admin/chargebacks

Responses: 200 Public or optional auth
POST /v2/admin/chargebacks/{id}/resolve

POST /v2/admin/chargebacks/{id}/resolve

Responses: 201 Public or optional auth
GET /v2/admin/disputes

GET /v2/admin/disputes

Responses: 200 Public or optional auth
GET /v2/admin/disputes/{id}

GET /v2/admin/disputes/{id}

Responses: 200 Public or optional auth
GET /v2/admin/disputes/{id}/evidence

GET /v2/admin/disputes/{id}/evidence

Responses: 200 Public or optional auth
POST /v2/admin/disputes/{id}/evidence

POST /v2/admin/disputes/{id}/evidence

Responses: 201 Public or optional auth
GET /v2/admin/disputes/{id}/messages

GET /v2/admin/disputes/{id}/messages

Responses: 200 Public or optional auth
POST /v2/admin/disputes/{id}/messages

POST /v2/admin/disputes/{id}/messages

Responses: 201 Public or optional auth
POST /v2/admin/disputes/{id}/resolve

POST /v2/admin/disputes/{id}/resolve

Responses: 201 Public or optional auth
GET /v2/admin/feature-flags

GET /v2/admin/feature-flags

Responses: 200 Public or optional auth
PUT /v2/admin/feature-flags/{key}

PUT /v2/admin/feature-flags/{key}

Responses: 200 Public or optional auth
PUT /v2/admin/feature-flags/{key}/audience

PUT /v2/admin/feature-flags/{key}/audience

Responses: 200 Public or optional auth
POST /v2/admin/feature-flags/{key}/audience/preview

POST /v2/admin/feature-flags/{key}/audience/preview

Responses: 201 Public or optional auth
POST /v2/admin/feature-flags/{key}/guarded

POST /v2/admin/feature-flags/{key}/guarded

Responses: 201 Public or optional auth
GET /v2/admin/moderation/report-strikes

GET /v2/admin/moderation/report-strikes

Responses: 200 Public or optional auth
GET /v2/admin/moderation/warning-standings

GET /v2/admin/moderation/warning-standings

Responses: 200 Public or optional auth
GET /v2/admin/reports

GET /v2/admin/reports

Responses: 200 Public or optional auth
GET /v2/admin/reports/{id}

GET /v2/admin/reports/{id}

Responses: 200 Public or optional auth
POST /v2/admin/reports/{id}/resolve

POST /v2/admin/reports/{id}/resolve

Responses: 201 Public or optional auth
GET /v2/admin/reports/appeals

GET /v2/admin/reports/appeals

Responses: 200 Public or optional auth
GET /v2/admin/reports/appeals/{appealId}

GET /v2/admin/reports/appeals/{appealId}

Responses: 200 Public or optional auth
POST /v2/admin/reports/appeals/{appealId}/decide

POST /v2/admin/reports/appeals/{appealId}/decide

Responses: 201 Public or optional auth
POST /v2/admin/reports/appeals/bulk-decide

POST /v2/admin/reports/appeals/bulk-decide

Responses: 201 Public or optional auth
POST /v2/admin/users/{id}/password-reset

POST /v2/admin/users/{id}/password-reset

Responses: 201 Public or optional auth
POST /v2/admin/users/{id}/rc-adjust

POST /v2/admin/users/{id}/rc-adjust

Responses: 201 Public or optional auth
POST /v2/admin/users/{id}/restrict

POST /v2/admin/users/{id}/restrict

Responses: 201 Public or optional auth
GET /v2/admin/users/{id}/restrictions

GET /v2/admin/users/{id}/restrictions

Responses: 200 Public or optional auth
GET /v2/admin/users/{id}/restrictions/history

GET /v2/admin/users/{id}/restrictions/history

Responses: 200 Public or optional auth
POST /v2/admin/users/{id}/suspend

POST /v2/admin/users/{id}/suspend

Responses: 201 Public or optional auth
POST /v2/admin/users/{id}/unrestrict

POST /v2/admin/users/{id}/unrestrict

Responses: 201 Public or optional auth
POST /v2/admin/users/{id}/unsuspend

POST /v2/admin/users/{id}/unsuspend

Responses: 201 Public or optional auth

Admin: Organizer KYC

3 operations

GET /v2/admin/organizer-kyc

List organizer KYC submissions awaiting admin review. Defaults to UNDER_REVIEW; supports ?state= and ?page=&limit=.

Responses: 200 Auth required
POST /v2/admin/organizer-kyc/{kycId}/approve

Approve an UNDER_REVIEW organizer KYC.

Responses: 201 Auth required
POST /v2/admin/organizer-kyc/{kycId}/reject

Reject an UNDER_REVIEW organizer KYC. Reason required (10-500 chars), returned verbatim to the organizer.

Responses: 201 Auth required

Admin: Organizer SaaS Plans

2 operations

GET /v2/admin/saas/plans

GET /v2/admin/saas/plans

Responses: 200 Public or optional auth
PUT /v2/admin/saas/plans/{planKey}

PUT /v2/admin/saas/plans/{planKey}

Responses: 200 Public or optional auth

Admin: Organizer SaaS Subscriptions

1 operations

GET /v2/admin/saas/subscriptions

GET /v2/admin/saas/subscriptions

Responses: 200 Public or optional auth

Admin: Payment Providers

1 operations

GET /v2/admin/payment-providers

GET /v2/admin/payment-providers

Responses: 200 Public or optional auth

Admin: Payment Reconciliation

1 operations

GET /v2/admin/payments

GET /v2/admin/payments

Responses: 200 Public or optional auth

Admin: Payment Webhook Events

5 operations

GET /v2/admin/webhook-events

GET /v2/admin/webhook-events

Responses: 200 Public or optional auth
GET /v2/admin/webhook-events/{id}

GET /v2/admin/webhook-events/{id}

Responses: 200 Public or optional auth
POST /v2/admin/webhook-events/{id}/acknowledge

Acknowledge a webhook event log row (manual reconciliation). Emits webhook_event.acknowledged.

Responses: 201 Public or optional auth
POST /v2/admin/webhook-events/{id}/cancel

Cancel a poisoned webhook event log row. Emits webhook_event.cancelled.

Responses: 201 Public or optional auth
POST /v2/admin/webhook-events/{id}/replay

Mark a webhook event for replay. Emits webhook_event.replayed.

Responses: 201 Public or optional auth

Admin: Payout Requests

5 operations

GET /v2/admin/payout-requests

List payout requests, optionally by status / payee type / club. `payeeType=CLUB` (or any `clubId`) narrows to the club payout queue.

Responses: 200 Auth required
POST /v2/admin/payout-requests/{id}/approve

Approve (UNDER_REVIEW → APPROVED).

Responses: 201 Auth required
POST /v2/admin/payout-requests/{id}/mark-paid

Mark paid (APPROVED → PAID). Payment reference required.

Responses: 201 Auth required
POST /v2/admin/payout-requests/{id}/reject

Reject (UNDER_REVIEW → REJECTED). Reason required.

Responses: 201 Auth required
POST /v2/admin/payout-requests/{id}/review

Start review (REQUESTED → UNDER_REVIEW).

Responses: 201 Auth required

Admin: Permission editor

3 operations

GET /v2/admin-permissions

GET /v2/admin-permissions

Responses: 200 Public or optional auth
GET /v2/admin-permissions/{id}

GET /v2/admin-permissions/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin-permissions/{id}

PATCH /v2/admin-permissions/{id}

Responses: 200 Public or optional auth

Admin: Photos

7 operations

GET /v2/admin/photos

GET /v2/admin/photos

Responses: 200 Public or optional auth
GET /v2/admin/photos/{id}

GET /v2/admin/photos/{id}

Responses: 200 Public or optional auth
POST /v2/admin/photos/{id}/moderate

POST /v2/admin/photos/{id}/moderate

Responses: 201 Public or optional auth
PATCH /v2/admin/photos/{id}/visibility

PATCH /v2/admin/photos/{id}/visibility

Responses: 200 Public or optional auth
POST /v2/admin/photos/{photoId}/matches/manual

POST /v2/admin/photos/{photoId}/matches/manual

Responses: 201 Public or optional auth
DELETE /v2/admin/photos/matches/{matchId}

DELETE /v2/admin/photos/matches/{matchId}

Responses: 200 Public or optional auth
GET /v2/admin/photos/stats

GET /v2/admin/photos/stats

Responses: 200 Public or optional auth

Admin: Platform Health

1 operations

GET /v2/admin/platform-health

GET /v2/admin/platform-health

Responses: 200 Public or optional auth

Admin: Platform Health (services / jobs)

3 operations

GET /v2/admin/platform-health/jobs

GET /v2/admin/platform-health/jobs

Responses: 200 Public or optional auth
GET /v2/admin/platform-health/services

GET /v2/admin/platform-health/services

Responses: 200 Public or optional auth
GET /v2/admin/platform-health/slow-queries

GET /v2/admin/platform-health/slow-queries

Responses: 200 Public or optional auth

Admin: Pricing matrix

5 operations

GET /v2/admin/pricing/tiers

List pricing tiers (DRAFT/INACTIVE/ARCHIVED included).

Responses: 200 Auth required
POST /v2/admin/pricing/tiers

Create pricing tier (admin)

Responses: 201 Auth required
PATCH /v2/admin/pricing/tiers/{tierId}

Update pricing tier (admin)

Responses: 200 Auth required
POST /v2/admin/pricing/tiers/{tierId}/activate

Activate pricing tier (admin)

Responses: 201 Auth required
POST /v2/admin/pricing/tiers/{tierId}/archive

Archive pricing tier (admin)

Responses: 201 Auth required

Admin: Proof Review

3 operations

POST /v2/admin/proofs/{proofId}/resolve

Approve or reject a pending edition proof (idempotent).

Responses: 201 Auth required
POST /v2/admin/proofs/{proofId}/revoke

A1 — revoke a granted (valid) proof: strip leaderboard, revoke certificate, claw back finisher RC.

Responses: 201 Auth required
GET /v2/admin/proofs/review-queue

Edition proofs awaiting manual anti-cheat review.

Responses: 200 Auth required

Admin: Provider Readiness

1 operations

GET /v2/admin/provider-readiness

GET /v2/admin/provider-readiness

Responses: 200 Public or optional auth

Admin: Rate limits

2 operations

GET /v2/admin/rate-limits/blocked

GET /v2/admin/rate-limits/blocked

Responses: 200 Public or optional auth
POST /v2/admin/rate-limits/unblock

POST /v2/admin/rate-limits/unblock

Responses: 201 Public or optional auth

Admin: RC Rules & Store

10 operations

GET /v2/admin/rc/redemptions

GET /v2/admin/rc/redemptions

Responses: 200 Public or optional auth
POST /v2/admin/rc/redemptions/{id}/cancel

POST /v2/admin/rc/redemptions/{id}/cancel

Responses: 201 Public or optional auth
POST /v2/admin/rc/redemptions/{id}/deliver

POST /v2/admin/rc/redemptions/{id}/deliver

Responses: 201 Public or optional auth
POST /v2/admin/rc/redemptions/{id}/fulfill

POST /v2/admin/rc/redemptions/{id}/fulfill

Responses: 201 Public or optional auth
POST /v2/admin/rc/redemptions/{id}/ship

POST /v2/admin/rc/redemptions/{id}/ship

Responses: 201 Public or optional auth
POST /v2/admin/rc/redemptions/{id}/ship-via-shiprocket

POST /v2/admin/rc/redemptions/{id}/ship-via-shiprocket

Responses: 201 Public or optional auth
GET /v2/admin/rc/rules

GET /v2/admin/rc/rules

Responses: 200 Public or optional auth
PUT /v2/admin/rc/rules/{ruleKey}

PUT /v2/admin/rc/rules/{ruleKey}

Responses: 200 Public or optional auth
GET /v2/admin/rc/store-items

GET /v2/admin/rc/store-items

Responses: 200 Public or optional auth
PUT /v2/admin/rc/store-items/{sku}

PUT /v2/admin/rc/store-items/{sku}

Responses: 200 Public or optional auth

Admin: Referrals

6 operations

GET /v2/admin/referrals/by-referrer/{userId}

GET /v2/admin/referrals/by-referrer/{userId}

Responses: 200 Public or optional auth
POST /v2/admin/referrals/replay/dry-run

POST /v2/admin/referrals/replay/dry-run

Responses: 201 Public or optional auth
POST /v2/admin/referrals/replay/execute

POST /v2/admin/referrals/replay/execute

Responses: 201 Public or optional auth
GET /v2/admin/referrals/settlements

GET /v2/admin/referrals/settlements

Responses: 200 Public or optional auth
GET /v2/admin/referrals/summary

GET /v2/admin/referrals/summary

Responses: 200 Public or optional auth
GET /v2/admin/referrals/trends

GET /v2/admin/referrals/trends

Responses: 200 Public or optional auth

Admin: Refunds

3 operations

GET /v2/admin/refunds

GET /v2/admin/refunds

Responses: 200 Public or optional auth
POST /v2/admin/refunds/{id}/cancel

POST /v2/admin/refunds/{id}/cancel

Responses: 201 Public or optional auth
POST /v2/admin/refunds/{id}/mark-manual-refunded

POST /v2/admin/refunds/{id}/mark-manual-refunded

Responses: 201 Public or optional auth

Admin: Retention

5 operations

POST /v2/admin/retention/cohorts/snapshot

POST /v2/admin/retention/cohorts/snapshot

Responses: 201 Public or optional auth
GET /v2/admin/retention/cohorts/summary

GET /v2/admin/retention/cohorts/summary

Responses: 200 Public or optional auth
GET /v2/admin/retention/dashboard

GET /v2/admin/retention/dashboard

Responses: 200 Public or optional auth
GET /v2/admin/retention/trends

GET /v2/admin/retention/trends

Responses: 200 Public or optional auth
GET /v2/admin/retention/users/{userId}/cohort

GET /v2/admin/retention/users/{userId}/cohort

Responses: 200 Public or optional auth

Admin: Revenue streams

2 operations

GET /v2/admin/revenue-streams

List all 8 revenue stream rows. Filters apply post-aggregation.

Responses: 200 Auth required
GET /v2/admin/revenue-streams/{streamCode}

Single stream detail. 404 on unknown streamCode.

Responses: 200 Auth required

Admin: Reward Pools

4 operations

GET /v2/admin/reward-pools

GET /v2/admin/reward-pools

Responses: 200 Public or optional auth
POST /v2/admin/reward-pools/{id}/manually-fund

POST /v2/admin/reward-pools/{id}/manually-fund

Responses: 201 Public or optional auth
POST /v2/admin/reward-pools/{id}/refund

POST /v2/admin/reward-pools/{id}/refund

Responses: 201 Public or optional auth
POST /v2/admin/reward-pools/{id}/review

POST /v2/admin/reward-pools/{id}/review

Responses: 201 Public or optional auth

Admin: Risk register

4 operations

GET /v2/admin/risk-register

Risk register snapshot — 13 launch-blocking domain probes with current health, signal, last-checked, recommended action, and runbook anchor.

Responses: 200 Auth required
GET /v2/admin/risk-register/{riskId}

Drill-down for a specific risk id.

Responses: 200 Auth required
POST /v2/admin/risk-register/{riskId}/acknowledge

Admin acknowledges current risk state. Writes a hash-chained audit row "risk.acknowledged".

Responses: 201 Auth required
POST /v2/admin/risk-register/{riskId}/escalate

Admin escalates a risk. Writes a hash-chained audit row "risk.escalated". Use for SEV1 invocation per crisis runbook.

Responses: 201 Auth required

Admin: Routes

5 operations

GET /v2/admin/routes

List all routes (incl. inactive) for admin management.

Responses: 200 Public or optional auth
POST /v2/admin/routes

Create a curated route.

Responses: 201 Public or optional auth
DELETE /v2/admin/routes/{id}

Soft-delete a route.

Responses: 200 Public or optional auth
PATCH /v2/admin/routes/{id}

Update a route (partial).

Responses: 200 Public or optional auth
PATCH /v2/admin/routes/{id}/active

Show/hide a route from the athlete list.

Responses: 200 Public or optional auth

Admin: Scheduler Observability

3 operations

GET /v2/admin/scheduler/jobs

GET /v2/admin/scheduler/jobs

Responses: 200 Public or optional auth
GET /v2/admin/scheduler/jobs/{name}

GET /v2/admin/scheduler/jobs/{name}

Responses: 200 Public or optional auth
POST /v2/admin/scheduler/jobs/{name}/run

POST /v2/admin/scheduler/jobs/{name}/run

Responses: 200 Public or optional auth

Admin: Sponsor Accounts

10 operations

GET /v2/admin/sponsors/accounts/{accountId}/activity

GET /v2/admin/sponsors/accounts/{accountId}/activity

Responses: 200 Public or optional auth
PATCH /v2/admin/sponsors/accounts/{accountId}/status

PATCH /v2/admin/sponsors/accounts/{accountId}/status

Responses: 200 Public or optional auth
GET /v2/admin/sponsors/brands/{brandId}/accounts

GET /v2/admin/sponsors/brands/{brandId}/accounts

Responses: 200 Public or optional auth
POST /v2/admin/sponsors/brands/{brandId}/accounts

POST /v2/admin/sponsors/brands/{brandId}/accounts

Responses: 201 Public or optional auth
PATCH /v2/admin/sponsors/brands/{brandId}/approval

PATCH /v2/admin/sponsors/brands/{brandId}/approval

Responses: 200 Public or optional auth
GET /v2/admin/sponsors/brands/{brandId}/contracts

GET /v2/admin/sponsors/brands/{brandId}/contracts

Responses: 200 Public or optional auth
POST /v2/admin/sponsors/brands/{brandId}/contracts

POST /v2/admin/sponsors/brands/{brandId}/contracts

Responses: 201 Public or optional auth
POST /v2/admin/sponsors/contracts/{contractId}/activate

POST /v2/admin/sponsors/contracts/{contractId}/activate

Responses: 201 Public or optional auth
POST /v2/admin/sponsors/contracts/{contractId}/cancel

POST /v2/admin/sponsors/contracts/{contractId}/cancel

Responses: 201 Public or optional auth
POST /v2/admin/sponsors/contracts/{contractId}/end

POST /v2/admin/sponsors/contracts/{contractId}/end

Responses: 201 Public or optional auth

Admin: Sponsor Analytics

1 operations

GET /v2/admin/sponsors/brands/{brandId}/metrics

GET /v2/admin/sponsors/brands/{brandId}/metrics

Responses: 200 Public or optional auth

Admin: Sponsor Attachments

1 operations

GET /v2/admin/sponsors/attachments/{id}/history

GET /v2/admin/sponsors/attachments/{id}/history

Responses: 200 Public or optional auth

Admin: Sponsor campaigns

3 operations

GET /v2/admin/sponsor-campaigns

List sponsor campaigns in the review queue. Defaults to PENDING_APPROVAL; supports ?status= and ?page=&limit=.

Responses: 200 Auth required
POST /v2/admin/sponsor-campaigns/{campaignId}/approve

Approve a PENDING_APPROVAL campaign. Transitions to LIVE if startDate ≤ now, otherwise SCHEDULED.

Responses: 201 Auth required
POST /v2/admin/sponsor-campaigns/{campaignId}/reject

Reject a PENDING_APPROVAL campaign. Reason required (10-500 chars); returned verbatim to brand owner.

Responses: 201 Auth required

Admin: Sponsor cohorts

3 operations

GET /v2/admin/sponsor-cohorts

List sponsor cohorts in the review queue. Defaults to PENDING_APPROVAL; supports ?status= and standard ?page=&limit= pagination.

Responses: 200 Auth required
POST /v2/admin/sponsor-cohorts/{cohortId}/approve

Approve a PENDING_APPROVAL sponsor cohort.

Responses: 201 Auth required
POST /v2/admin/sponsor-cohorts/{cohortId}/reject

Reject a PENDING_APPROVAL sponsor cohort. Reason is required (10-500 chars) and is returned verbatim to the brand owner.

Responses: 201 Auth required

Admin: Sponsor RC Grants

3 operations

GET /v2/admin/sponsor-rc-grants

Queue. Defaults to every status; filter with ?status=.

Responses: 200 Auth required
POST /v2/admin/sponsor-rc-grants/{grantId}/approve

Approve and credit the brand wallet. approvedRc may be less than requested, never more. Re-running is a no-op.

Responses: 201 Auth required
POST /v2/admin/sponsor-rc-grants/{grantId}/reject

Reject. Reason is mandatory, 10-500 chars.

Responses: 201 Auth required

Admin: Sponsorship deals

6 operations

GET /v2/admin/sponsorship-deals

List sponsorship deals in the review queue. Defaults to PROPOSED; supports ?status= and ?page=&limit=.

Responses: 200 Auth required
POST /v2/admin/sponsorship-deals/{dealId}/accept

Accept a PROPOSED or UNDER_REVIEW deal. Transitions to CONTRACT_PENDING.

Responses: 201 Auth required
POST /v2/admin/sponsorship-deals/{dealId}/activate

Activate a CONTRACT_UPLOADED deal. Transitions to ACTIVE.

Responses: 201 Auth required
POST /v2/admin/sponsorship-deals/{dealId}/counter

Counter-offer a PROPOSED or UNDER_REVIEW deal. amount > 0; notes 10-500 chars (returned verbatim to brand).

Responses: 201 Auth required
POST /v2/admin/sponsorship-deals/{dealId}/reject

Reject a PROPOSED, UNDER_REVIEW, or COUNTERED deal. Reason required (10-500 chars), returned verbatim to brand.

Responses: 201 Auth required
POST /v2/admin/sponsorship-deals/{dealId}/under-review

Mark a PROPOSED deal as UNDER_REVIEW (lighter touch than accept).

Responses: 201 Auth required

Admin: Subscription Config

13 operations

GET /v2/admin/subscriptions/config/feature-categories

List feature categories

Responses: 200 Public or optional auth
GET /v2/admin/subscriptions/config/feature-dependencies

List feature dependencies, by code

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/config/feature-dependencies

Declare that one feature requires another. Cycles are rejected — they would make publish validation unsatisfiable for both.

Responses: 201 Public or optional auth
DELETE /v2/admin/subscriptions/config/feature-dependencies/{id}

Remove a feature dependency

Responses: 200 Public or optional auth
GET /v2/admin/subscriptions/config/feature-inventory

Reconcile feature codes gated in CODE against feature rows in CONFIG. Reports gates with no row (unconfigurable) and rows with no gate (unenforced).

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/config/provider-refs

Map a plan price to its provider-side plan id. Required before a paid price can be published.

Responses: 201 Public or optional auth
GET /v2/admin/subscriptions/config/providers

Payment providers with `adapterDeployed` — a false value means the row is inert and must not be offered as a choice.

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/config/providers

Create or update a provider. Enabling one with no compiled adapter is rejected.

Responses: 201 Public or optional auth
GET /v2/admin/subscriptions/config/regions

List pricing regions

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/config/regions

Create or update a pricing region. A country may belong to only one region.

Responses: 201 Public or optional auth
GET /v2/admin/subscriptions/config/tax-categories

Tax categories with their effective-dated rates

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/config/tax-categories

Create or rename a tax category

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/config/tax-rates

Add an effective-dated rate. Supersedes the open rate for the same scope rather than editing it — historic invoices must stay reconstructable.

Responses: 201 Public or optional auth

Admin: Subscription Coupons

10 operations

GET /v2/admin/subscriptions/coupons

List coupons with claim counts

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/coupons

Create a coupon (money fields are minor units)

Responses: 201 Public or optional auth
GET /v2/admin/subscriptions/coupons/{id}

Coupon detail + scopes + committed/pending/remaining

Responses: 200 Public or optional auth
PATCH /v2/admin/subscriptions/coupons/{id}

Edit a coupon. Discount value fields return 409 COUPON_VALUE_FROZEN once claimed.

Responses: 200 Public or optional auth
GET /v2/admin/subscriptions/coupons/{id}/analytics

Redemption counts and total discount given, in minor units

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/coupons/{id}/preview

Preview the exact line items and rejection reason a user would get for this coupon

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/coupons/{id}/scopes

Replace eligibility scopes. OR within a scope type, AND across types.

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/coupons/{id}/toggle

Pause / resume instantly — the promo kill switch

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/coupons/bulk-generate

Generate N unique codes from a prefix, sharing one config via batchTag

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/coupons/release-expired-reservations

Release PENDING reservations past their TTL so abandoned checkouts stop holding slots

Responses: 201 Public or optional auth

Admin: Subscription IAP + Settings

17 operations

GET /v2/admin/subscriptions/analytics/churn

Churn rate and counts over N days (default 30), broken down by cancellation reason.

Responses: 200 Public or optional auth
GET /v2/admin/subscriptions/analytics/summary

MRR (normalised monthly), active/trial/past-due counts, ARPU, plan and store breakdown.

Responses: 200 Public or optional auth
GET /v2/admin/subscriptions/analytics/trial-conversion

Trial-to-paid conversion for trials STARTED in the window, so the cohort is fixed.

Responses: 200 Public or optional auth
GET /v2/admin/subscriptions/iap-events

Store event ledger. Filter `status=UNMAPPED` for purchases that landed with no matching plan mapping — those are real customers waiting on config.

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/iap-events/{id}/replay

Re-run a stored event through ingest. Re-normalises from the raw payload, so it picks up mapping and code fixes.

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/lifecycle/sweep

Expire lapsed subscriptions now. Idempotent. Intended for Cloud Scheduler, since Cloud Run scale-to-zero can starve the in-process cron.

Responses: 201 Public or optional auth
GET /v2/admin/subscriptions/organizer-drift

Read-only comparison of the engine against the legacy organizer subscriptions. Migration gate: drifted must be 0.

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/seed-athlete-tiers

Seed the Athlete / Passport / Champion tiers, prices and feature mappings. Idempotent — existing rows are skipped, never overwritten.

Responses: 201 Public or optional auth
GET /v2/admin/subscriptions/settings

Subscription master switch, plus launch-readiness signals (store mappings, unmapped events, engine source).

Responses: 200 Public or optional auth
PATCH /v2/admin/subscriptions/settings

Update the master switch. Partial — only supplied fields change. Turning the master off also stands down enforcement.

Responses: 200 Public or optional auth
GET /v2/admin/subscriptions/store-products

Store product mappings joined to plan + price. `priceMatchesStore:false` means the paywall shows a price the store will not charge.

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/store-products

Map a plan price to a store product. `markSynced` asserts the product is live in the store console — it is what makes the price purchasable on mobile.

Responses: 201 Public or optional auth
DELETE /v2/admin/subscriptions/store-products/{id}

Remove a mapping. The price stops being purchasable on that store immediately; existing subscribers are unaffected.

Responses: 200 Public or optional auth
GET /v2/admin/subscriptions/subscribers

Search subscribers by user id, store transaction id or product. Filterable by status/plan/source.

Responses: 200 Public or optional auth
GET /v2/admin/subscriptions/subscribers/{id}

Full record for one subscription: state, resolved entitlements, and the last 50 store events.

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/subscribers/{id}/extend

Extend a subscription by N days. Additive, audited, reason required.

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/subscribers/{id}/revoke

Revoke a subscription immediately. Does not refund. Audited, reason required.

Responses: 201 Public or optional auth

Admin: Subscription Plans

17 operations

GET /v2/admin/subscriptions/engine-status

Which source the resolver is reading and how many plans exist in the DB

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/features

Create a gateable feature

Responses: 201 Public or optional auth
GET /v2/admin/subscriptions/plan-prices

Flat list of mappable plan prices (plan × version × cycle × currency). Feeds the store-product mapping picker — `plans` returns bare rows with no nested versions or prices to walk.

Responses: 200 Public or optional auth
GET /v2/admin/subscriptions/plans

List all plans, optionally filtered by audience

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/plans

Create a plan (starts as DRAFT with an empty v1 draft version)

Responses: 201 Public or optional auth
PATCH /v2/admin/subscriptions/plans/{id}

Edit plan presentation. Safe at any time — no effect on live mandates.

Responses: 200 Public or optional auth
GET /v2/admin/subscriptions/plans/{id}/diff

Field-level diff between two versions

Responses: 200 Public or optional auth
GET /v2/admin/subscriptions/plans/{id}/impact

Live subscriber count per version — read before publish or retire

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/plans/{id}/versions

Mint a DRAFT version copied from the current PUBLISHED one. This is how a price change happens.

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/seed-from-catalog

Transcribe the static plan catalog into the DB. Idempotent; the cutover step from architecture doc §7.

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/simulate

Dry-run the resolver and (optionally) the quote for a user / plan / country / coupon

Responses: 201 Public or optional auth
PATCH /v2/admin/subscriptions/versions/{id}

Edit DRAFT version terms (trial, tax, renewal)

Responses: 200 Public or optional auth
POST /v2/admin/subscriptions/versions/{id}/features

Map a feature onto a version. On a PUBLISHED version only non-restrictive edits are accepted (409 REQUIRES_NEW_VERSION otherwise).

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/versions/{id}/prices

Add or update a price on a DRAFT version

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/versions/{id}/publish

Freeze commercial terms and make the version sellable. Fails with a field-level error list.

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/versions/{id}/retire

Stop new sales. Existing subscribers keep resolving through this version.

Responses: 201 Public or optional auth
POST /v2/admin/subscriptions/versions/{id}/validate

Publish checklist without publishing. Empty array = ready to publish.

Responses: 201 Public or optional auth

Admin: Tax

16 operations

GET /v2/admin/compliance/cleartax/status

ClearTax vendor wiring status. Never leaks secrets; reports presence only.

Responses: 200 Public or optional auth
GET /v2/admin/compliance/form-16a

List all Form 16A rows for FY + quarter.

Responses: 200 Public or optional auth
POST /v2/admin/compliance/form-16a/{id}/generate

Generate a Form 16A PDF via ClearTax. 503s cleanly when vendor is not wired.

Responses: 201 Public or optional auth
POST /v2/admin/compliance/form-16a/aggregate

Aggregate one quarter into a Form 16A DRAFT. Idempotent; re-runs refresh DRAFT sums.

Responses: 201 Public or optional auth
GET /v2/admin/compliance/prize-tax

List prize-tax rows.

Responses: 200 Public or optional auth
POST /v2/admin/compliance/prize-tax

Create a prize-tax settlement. Idempotent on resultId when supplied.

Responses: 201 Public or optional auth
POST /v2/admin/compliance/prize-tax/{id}/calculate

Run 194-B math on a prize-tax row + advance to CALCULATED.

Responses: 201 Public or optional auth
POST /v2/admin/compliance/prize-tax/{id}/disburse

Advance TDS_DEDUCTED → DISBURSED.

Responses: 201 Public or optional auth
POST /v2/admin/compliance/prize-tax/{id}/tds-deducted

Advance CALCULATED → TDS_DEDUCTED.

Responses: 201 Public or optional auth
GET /v2/admin/compliance/prize-tax/export.csv

CSV export of prize-tax rows for an FY. Optional status filter.

Responses: 200 Public or optional auth
GET /v2/admin/compliance/tax-invoices

List tax invoices; filter by FY + status.

Responses: 200 Public or optional auth
POST /v2/admin/compliance/tax-invoices/{id}/issue

Issue a DRAFT invoice via ClearTax (may 503).

Responses: 201 Public or optional auth
GET /v2/admin/compliance/tax-invoices/export.csv

CSV export of tax invoices for an FY. Returns a CSV payload as string; caller wraps in download.

Responses: 200 Public or optional auth
POST /v2/admin/compliance/tax/backfill/run

Manually run the backfill worker that drafts invoices + 194-O rows.

Responses: 201 Public or optional auth
GET /v2/admin/compliance/tds

List TDS rows; filter by section + FY + quarter.

Responses: 200 Public or optional auth
GET /v2/admin/compliance/tds/export.csv

CSV export of TDS rows for an FY + section.

Responses: 200 Public or optional auth

Admin: Training templates

6 operations

GET /v2/admin/training-templates

GET /v2/admin/training-templates

Responses: 200 Public or optional auth
POST /v2/admin/training-templates

POST /v2/admin/training-templates

Responses: 201 Public or optional auth
DELETE /v2/admin/training-templates/{id}

DELETE /v2/admin/training-templates/{id}

Responses: 200 Public or optional auth
GET /v2/admin/training-templates/{id}

GET /v2/admin/training-templates/{id}

Responses: 200 Public or optional auth
PATCH /v2/admin/training-templates/{id}

PATCH /v2/admin/training-templates/{id}

Responses: 200 Public or optional auth
POST /v2/admin/training-templates/{id}/publish

Flip published flag. `{ published: true|false }`.

Responses: 201 Public or optional auth

Admin: Trust Export

3 operations

POST /v2/admin/trust-export

POST /v2/admin/trust-export

Responses: 201 Public or optional auth
GET /v2/admin/trust-export/dry-run

GET /v2/admin/trust-export/dry-run

Responses: 200 Public or optional auth
POST /v2/admin/trust-export/jsonl

POST /v2/admin/trust-export/jsonl

Responses: 201 Public or optional auth

Admin: Users

6 operations

GET /v2/admin/users

GET /v2/admin/users

Responses: 200 Public or optional auth
GET /v2/admin/users/{id}/activities

GET /v2/admin/users/{id}/activities

Responses: 200 Public or optional auth
GET /v2/admin/users/{id}/challenges

GET /v2/admin/users/{id}/challenges

Responses: 200 Public or optional auth
GET /v2/admin/users/{id}/events

GET /v2/admin/users/{id}/events

Responses: 200 Public or optional auth
GET /v2/admin/users/{id}/overview

GET /v2/admin/users/{id}/overview

Responses: 200 Public or optional auth
GET /v2/admin/users/{id}/wallet/history

GET /v2/admin/users/{id}/wallet/history

Responses: 200 Public or optional auth

Admin: Verification

14 operations

GET /v2/admin/verification/clubs

GET /v2/admin/verification/clubs

Responses: 200 Public or optional auth
GET /v2/admin/verification/clubs/{clubId}

GET /v2/admin/verification/clubs/{clubId}

Responses: 200 Public or optional auth
POST /v2/admin/verification/clubs/{clubId}/approve

POST /v2/admin/verification/clubs/{clubId}/approve

Responses: 201 Public or optional auth
POST /v2/admin/verification/clubs/{clubId}/reject

POST /v2/admin/verification/clubs/{clubId}/reject

Responses: 201 Public or optional auth
GET /v2/admin/verification/organizers

GET /v2/admin/verification/organizers

Responses: 200 Public or optional auth
GET /v2/admin/verification/organizers/{id}

GET /v2/admin/verification/organizers/{id}

Responses: 200 Public or optional auth
POST /v2/admin/verification/organizers/{id}/approve

POST /v2/admin/verification/organizers/{id}/approve

Responses: 201 Public or optional auth
PATCH /v2/admin/verification/organizers/{id}/eazr-tag

PATCH /v2/admin/verification/organizers/{id}/eazr-tag

Responses: 200 Public or optional auth
POST /v2/admin/verification/organizers/{id}/reject

POST /v2/admin/verification/organizers/{id}/reject

Responses: 201 Public or optional auth
GET /v2/admin/verification/sponsors

GET /v2/admin/verification/sponsors

Responses: 200 Public or optional auth
GET /v2/admin/verification/sponsors/{brandId}

GET /v2/admin/verification/sponsors/{brandId}

Responses: 200 Public or optional auth
POST /v2/admin/verification/sponsors/{brandId}/approve

POST /v2/admin/verification/sponsors/{brandId}/approve

Responses: 201 Public or optional auth
POST /v2/admin/verification/sponsors/{brandId}/reject

POST /v2/admin/verification/sponsors/{brandId}/reject

Responses: 201 Public or optional auth
GET /v2/admin/verification/sponsors/{brandId}/vendor-results

GET /v2/admin/verification/sponsors/{brandId}/vendor-results

Responses: 200 Public or optional auth

Admin: Wearables

3 operations

GET /v2/admin/wearables

GET /v2/admin/wearables

Responses: 200 Public or optional auth
PUT /v2/admin/wearables/{provider}/credentials

PUT /v2/admin/wearables/{provider}/credentials

Responses: 200 Public or optional auth
POST /v2/admin/wearables/{provider}/test-connection

POST /v2/admin/wearables/{provider}/test-connection

Responses: 201 Public or optional auth

AdminBibClaimTerms

3 operations

GET /v2/bib-claim-terms

GET /v2/bib-claim-terms

Responses: 200 Public or optional auth
GET /v2/bib-claim-terms/{eventId}

GET /v2/bib-claim-terms/{eventId}

Responses: 200 Public or optional auth
PUT /v2/bib-claim-terms/{eventId}

PUT /v2/bib-claim-terms/{eventId}

Responses: 200 Public or optional auth

AdminEventBadge

1 operations

GET /v2/admin/events/{eventId}/badge

GET /v2/admin/events/{eventId}/badge

Responses: 200 Public or optional auth

Admins

14 operations

GET /v2/admins

Retrieve multiple Admins

Responses: 200 Public or optional auth
POST /v2/admins

Create a single Admin

Responses: 200 Public or optional auth
DELETE /v2/admins/{id}

Delete a single Admin

Responses: 200 Public or optional auth
GET /v2/admins/{id}

Retrieve a single Admin

Responses: 200 Public or optional auth
PATCH /v2/admins/{id}

Update a single Admin

Responses: 200 Public or optional auth
PUT /v2/admins/{id}

Replace a single Admin

Responses: 200 Public or optional auth
POST /v2/admins/bootstrap

POST /v2/admins/bootstrap

Responses: 201 Public or optional auth
POST /v2/admins/bulk

Create multiple Admins

Responses: 200 Public or optional auth
GET /v2/admins/handle/{handle}

GET /v2/admins/handle/{handle}

Responses: 200 Public or optional auth
GET /v2/admins/handle/check

GET /v2/admins/handle/check

Responses: 200 Public or optional auth
GET /v2/admins/me

GET /v2/admins/me

Responses: 200 Public or optional auth
GET /v2/admins/notification-preferences/me

GET /v2/admins/notification-preferences/me

Responses: 200 Public or optional auth
PATCH /v2/admins/notification-preferences/me

PATCH /v2/admins/notification-preferences/me

Responses: 200 Public or optional auth
POST /v2/admins/send-otp

POST /v2/admins/send-otp

Responses: 201 Public or optional auth

AI Coach

6 operations

POST /v2/coach/ask

Ask the AI coach. Returns Claude Sonnet reply + any structured tool calls. 503 when ANTHROPIC_API_KEY is unset.

Responses: 201 Public or optional auth
GET /v2/coach/context

§24.3 — preview the 8 context streams the coach assembles for this athlete.

Responses: 200 Public or optional auth
GET /v2/coach/history

§24 — list this athlete's coach conversation history (default thread).

Responses: 200 Public or optional auth
GET /v2/coach/status

Coach health probe — enabled flag + active model. Never 503s.

Responses: 200 Public or optional auth
POST /v2/coach/voice/ask

Sprint 8 — voice-assisted coach ask. Accepts base64 audio, runs Sarvam STT in the requested locale, and forwards the transcription to the text `ask` endpoint. 503 `SARVAM_NOT_CONFIGURED` when the backend has no Sarvam key.

Responses: 201 Public or optional auth
POST /v2/coach/voice/speak

Sprint 8 — text-to-speech for the coach reply. Returns a base64 audio blob in the requested locale. 503 `SARVAM_NOT_CONFIGURED` when the backend has no Sarvam key.

Responses: 201 Public or optional auth

Analytics

6 operations

GET /v2/analytics

Get legacy analytics (deprecated - use admin/dashboard instead)

Legacy endpoint for backward compatibility. Use GET /analytics/admin/dashboard for new implementations.

Responses: 200 Auth required
GET /v2/analytics/admin/dashboard

Get comprehensive admin dashboard analytics

Returns platform-wide analytics for admin dashboard including: - Platform overview (users, organizers, events, challenges, revenue) - User analytics (growth trends, demographics, active users) - Event analytics (by status, category, type, ticket sales) - Challenge analytics (by type, participation, completion rates) - Financial analytics (revenue, commissions, refunds, payment methods) - Coin economy analytics (circulation, transactions, top holders) - Fitness analytics (activities, steps, calories) - Organizer analytics (top performers, approval status) - Support analytics (tickets by status, category, resolution time)

Responses: 200 Auth required
GET /v2/analytics/admin/finance

Get detailed admin finance analytics

Returns comprehensive financial analytics for admin including: - Revenue overview (total revenue, platform commission, net revenue, growth metrics) - Payment analytics (by method, success/failure rates, average transaction value) - Refund analytics (total refunds, by status, refund rate) - Commission analytics (total commission, average rate, breakdown by organizer) - Organizer financials (top earners, revenue distribution) - Event financials (top revenue events, average ticket price) - Transaction trends (daily/weekly/monthly patterns) - Coin financials (total coins in circulation, purchase/redemption stats)

Responses: 200 Auth required
GET /v2/analytics/organizer/dashboard

Get comprehensive organizer dashboard analytics

Returns organizer-specific analytics including: - Overview (events, challenges, products, coupons, revenue, ratings) - Event performance (per-event details, capacity, revenue, bookings) - Challenge performance (participation, completion rates, coins rewarded) - Financial summary (gross/net revenue, commissions, refunds) - Customer insights (unique customers, booking trends) - Coupon analytics (usage, top coupons, discount given) - Product analytics (by category, active products)

Responses: 200 Auth required
GET /v2/analytics/organizer/events/{eventId}/finance

Get finance analytics scoped to a single event (Missing-API P2, BACKEND_API_SPEC.md §2.1).

Per-event equivalent of GET /analytics/organizer/finance — grossRevenue, netRevenue, platformFee, totalRefunded, refundedPercent, averageOrderValue, totalBookings, paymentsByMethod[], registrationsByDay[], couponUsage[], all scoped to a single eventId instead of the org-wide response.

Responses: 200 Auth required
GET /v2/analytics/organizer/finance

Get detailed organizer finance analytics

Returns comprehensive financial analytics for organizer including: - Revenue overview (gross revenue, platform commission, net revenue, growth metrics) - Payment analytics (by method, success/failure rates) - Refund analytics (total refunds, by status, refund rate) - Event revenue breakdown (revenue per event, top performing events) - Settlement info (pending settlement, next settlement date) - Transaction history (recent transactions with details) - Coupon impact (total discount given, usage stats, top coupons)

Responses: 200 Auth required

Anti-Cheat

10 operations

POST /v2/anti-cheat/live-signals

POST /v2/anti-cheat/live-signals

Responses: 201 Public or optional auth
GET /v2/anti-cheat/my-appeals

GET /v2/anti-cheat/my-appeals

Responses: 200 Public or optional auth
GET /v2/anti-cheat/my-appeals/{appealId}

GET /v2/anti-cheat/my-appeals/{appealId}

Responses: 200 Public or optional auth
GET /v2/anti-cheat/my-flags

GET /v2/anti-cheat/my-flags

Responses: 200 Public or optional auth
GET /v2/anti-cheat/my-flags/{flagId}

GET /v2/anti-cheat/my-flags/{flagId}

Responses: 200 Public or optional auth
POST /v2/anti-cheat/my-flags/{flagId}/appeal

POST /v2/anti-cheat/my-flags/{flagId}/appeal

Responses: 201 Public or optional auth
POST /v2/anti-cheat/my-flags/{flagId}/respond

POST /v2/anti-cheat/my-flags/{flagId}/respond

Responses: 201 Public or optional auth
GET /v2/anti-cheat/my-flags/{flagId}/responses

GET /v2/anti-cheat/my-flags/{flagId}/responses

Responses: 200 Public or optional auth
GET /v2/anti-cheat/my-flags/by-activity/{activityId}

GET /v2/anti-cheat/my-flags/by-activity/{activityId}

Responses: 200 Public or optional auth
GET /v2/anti-cheat/my-status

GET /v2/anti-cheat/my-status

Responses: 200 Public or optional auth

App

1 operations

GET /v2/app/version-check

Per-platform force/soft update policy for the caller version. Fails open.

Responses: 200 Public or optional auth

App Frequently Asked Questions

9 operations

GET /v2/app-frequently-asked-questions

GET /v2/app-frequently-asked-questions

Responses: 200 Auth required
POST /v2/app-frequently-asked-questions

POST /v2/app-frequently-asked-questions

Responses: 201 Auth required
DELETE /v2/app-frequently-asked-questions/{id}

DELETE /v2/app-frequently-asked-questions/{id}

Responses: 200 Auth required
GET /v2/app-frequently-asked-questions/{id}

GET /v2/app-frequently-asked-questions/{id}

Responses: 200 Auth required
PATCH /v2/app-frequently-asked-questions/{id}

PATCH /v2/app-frequently-asked-questions/{id}

Responses: 200 Auth required
GET /v2/app-frequently-asked-questions/{id}/public

GET /v2/app-frequently-asked-questions/{id}/public

Responses: 200 Auth required
PATCH /v2/app-frequently-asked-questions/{id}/toggle

PATCH /v2/app-frequently-asked-questions/{id}/toggle

Responses: 200 Auth required
GET /v2/app-frequently-asked-questions/public

GET /v2/app-frequently-asked-questions/public

Responses: 200 Auth required
GET /v2/app-frequently-asked-questions/public/search

Public KB search — relevance-ranked results across question + answer.

Responses: 200 Auth required

App Privacy Policies

8 operations

GET /v2/app-privacy-policies

GET /v2/app-privacy-policies

Responses: 200 Auth required
POST /v2/app-privacy-policies

POST /v2/app-privacy-policies

Responses: 201 Auth required
DELETE /v2/app-privacy-policies/{id}

DELETE /v2/app-privacy-policies/{id}

Responses: 200 Auth required
GET /v2/app-privacy-policies/{id}

GET /v2/app-privacy-policies/{id}

Responses: 200 Auth required
PATCH /v2/app-privacy-policies/{id}

PATCH /v2/app-privacy-policies/{id}

Responses: 200 Auth required
GET /v2/app-privacy-policies/{id}/public

GET /v2/app-privacy-policies/{id}/public

Responses: 200 Auth required
PATCH /v2/app-privacy-policies/{id}/toggle

PATCH /v2/app-privacy-policies/{id}/toggle

Responses: 200 Auth required
GET /v2/app-privacy-policies/active

GET /v2/app-privacy-policies/active

Responses: 200 Auth required

App Terms and Conditions

8 operations

GET /v2/app-terms-and-conditions

GET /v2/app-terms-and-conditions

Responses: 200 Auth required
POST /v2/app-terms-and-conditions

POST /v2/app-terms-and-conditions

Responses: 201 Auth required
DELETE /v2/app-terms-and-conditions/{id}

DELETE /v2/app-terms-and-conditions/{id}

Responses: 200 Auth required
GET /v2/app-terms-and-conditions/{id}

GET /v2/app-terms-and-conditions/{id}

Responses: 200 Auth required
PATCH /v2/app-terms-and-conditions/{id}

PATCH /v2/app-terms-and-conditions/{id}

Responses: 200 Auth required
GET /v2/app-terms-and-conditions/{id}/public

GET /v2/app-terms-and-conditions/{id}/public

Responses: 200 Auth required
PATCH /v2/app-terms-and-conditions/{id}/toggle

PATCH /v2/app-terms-and-conditions/{id}/toggle

Responses: 200 Auth required
GET /v2/app-terms-and-conditions/active

GET /v2/app-terms-and-conditions/active

Responses: 200 Auth required

Approvals

6 operations

GET /v2/approvals

Get all approvals with filters and pagination

Responses: 200 Public or optional auth
GET /v2/approvals/{type}/{id}

Get approval details by type and ID

Responses: 200 Public or optional auth
PATCH /v2/approvals/{type}/{id}/review

Review (approve/reject) any approval type

Responses: 200 Public or optional auth
GET /v2/approvals/kyc/{id}

Get KYC details by ID

Responses: 200 Public or optional auth
PATCH /v2/approvals/kyc/{id}/review

Review (approve/reject) KYC

Responses: 200 Public or optional auth
GET /v2/approvals/summary

Get approval summary (counts by status)

Responses: 200 Public or optional auth

Athlete - Preferred Sports

1 operations

GET /v2/users/me/preferred-sports

GET /v2/users/me/preferred-sports

Responses: 200 Public or optional auth

Athlete App: Feed

1 operations

GET /v2/user-feed

GET /v2/user-feed

Responses: 200 Public or optional auth

Athlete Programs

12 operations

POST /v2/me/programs/{id}/enroll

Enrol the authenticated athlete in a published training-program template.

Responses: 201 Public or optional auth
GET /v2/me/programs/{id}/preview

Week-by-week schedule preview for a published template.

Responses: 200 Public or optional auth
POST /v2/me/programs/{templateId}/reviews

Submit (or update) a program review. Requires a COMPLETED enrollment for this template.

Responses: 201 Public or optional auth
GET /v2/me/programs/admin-library

Browse the admin-authored Phase-1 launch library (platform-curated programs).

Responses: 200 Public or optional auth
GET /v2/me/programs/enrollments

List the athlete's training-program enrollments.

Responses: 200 Public or optional auth
DELETE /v2/me/programs/enrollments/{enrollmentId}

Cancel an enrollment.

Responses: 200 Public or optional auth
GET /v2/me/programs/enrollments/{enrollmentId}/adherence

Adherence + schedule progress for one of the athlete's enrollments.

Responses: 200 Public or optional auth
GET /v2/me/programs/library

Browse the published training-program library with filters.

Responses: 200 Public or optional auth
POST /v2/me/programs/reviews/{reviewId}/flag

Flag a review for moderation.

Responses: 201 Public or optional auth
POST /v2/me/programs/reviews/{reviewId}/helpful

Mark a review helpful (athlete-only).

Responses: 201 Public or optional auth
GET /v2/me/programs/today-workout

Today's workout for the athlete's active enrollment (rest day → workout=null with reason).

Responses: 200 Public or optional auth
GET /v2/me/programs/workouts/{workoutId}/feedback

Mid-workout feedback verdict given the athlete's current pace.

Responses: 200 Public or optional auth

Athlete: Campaigns

3 operations

GET /v2/users/me/campaigns

Campaigns currently targeting me. Returns creative + brand identity only — never cohort, budget or targeting data.

Responses: 200 Auth required
POST /v2/users/me/campaigns/{campaignId}/click

Record a tap on the campaign CTA, and get back the URL to open.

Responses: 201 Auth required
POST /v2/users/me/campaigns/{campaignId}/view

Record a view of a campaign I was served.

Responses: 201 Auth required

Athlete: Coupons

2 operations

GET /v2/users/me/coupons

Coupon codes assigned to me, newest first. Includes the code itself, what it is for, and whether it is redeemed or expired.

Responses: 200 Auth required
POST /v2/users/me/coupons/{codeId}/redeem

Mark one of my coupons used. Idempotent — a second call returns the original redemption time rather than moving it.

Responses: 201 Auth required

Athlete: Master Events

7 operations

GET /v2/events/{eventId}/master

Viewer-aware master journey and eligibility.

Responses: 200 Public or optional auth
DELETE /v2/events/{eventId}/master/join

Leave the master journey.

Responses: 200 Auth required
POST /v2/events/{eventId}/master/join

Join the master journey independently.

Responses: 201 Auth required
GET /v2/events/{eventId}/master/leaderboard

Conditional master points leaderboard.

Responses: 200 Public or optional auth
POST /v2/events/{eventId}/master/orders/{orderId}/verify

Verify bundle payment and atomically enroll children.

Responses: 201 Auth required
GET /v2/events/{eventId}/master/quote

Master enrollment quote and compatibility.

Responses: 200 Public or optional auth
GET /v2/events/{eventId}/master/rewards/me

My finalized master reward grants.

Responses: 200 Auth required

Athlete: Promotional Content

3 operations

GET /v2/users/me/promotions

GET /v2/users/me/promotions

Responses: 200 Auth required
POST /v2/users/me/promotions/{promotionId}/click

POST /v2/users/me/promotions/{promotionId}/click

Responses: 201 Auth required
POST /v2/users/me/promotions/{promotionId}/impression

POST /v2/users/me/promotions/{promotionId}/impression

Responses: 201 Auth required

AthletePremiumEvent

9 operations

GET /v2/events/{eventId}/club-claim-page

GET /v2/events/{eventId}/club-claim-page

Responses: 200 Public or optional auth
GET /v2/events/{eventId}/participants/by-bib

GET /v2/events/{eventId}/participants/by-bib

Responses: 200 Public or optional auth
GET /v2/events/{eventId}/premium

GET /v2/events/{eventId}/premium

Responses: 200 Public or optional auth
POST /v2/events/{eventId}/registration-claim/confirm

POST /v2/events/{eventId}/registration-claim/confirm

Responses: 201 Public or optional auth
POST /v2/events/{eventId}/registration-claim/lookup

POST /v2/events/{eventId}/registration-claim/lookup

Responses: 201 Public or optional auth
GET /v2/events/{eventId}/registration-claim/mine

GET /v2/events/{eventId}/registration-claim/mine

Responses: 200 Public or optional auth
POST /v2/events/{eventId}/registration-claim/send-otp

POST /v2/events/{eventId}/registration-claim/send-otp

Responses: 201 Public or optional auth
GET /v2/events/{eventId}/registration-claim/terms

GET /v2/events/{eventId}/registration-claim/terms

Responses: 200 Public or optional auth
POST /v2/events/{eventId}/registration-claim/verify

POST /v2/events/{eventId}/registration-claim/verify

Responses: 201 Public or optional auth

AthleteRacePack

7 operations

GET /v2/event-participations/{bookingId}/deliverables

GET /v2/event-participations/{bookingId}/deliverables

Responses: 200 Public or optional auth
PATCH /v2/event-participations/{bookingId}/deliverables/{deliverableId}/address

PATCH /v2/event-participations/{bookingId}/deliverables/{deliverableId}/address

Responses: 200 Public or optional auth
POST /v2/event-participations/{bookingId}/deliverables/{deliverableId}/claim

POST /v2/event-participations/{bookingId}/deliverables/{deliverableId}/claim

Responses: 201 Public or optional auth
GET /v2/event-participations/{bookingId}/finisher-card-context

GET /v2/event-participations/{bookingId}/finisher-card-context

Responses: 200 Public or optional auth
GET /v2/event-participations/{bookingId}/race-pack

GET /v2/event-participations/{bookingId}/race-pack

Responses: 200 Public or optional auth
POST /v2/event-participations/{bookingId}/race-pack/reconcile

POST /v2/event-participations/{bookingId}/race-pack/reconcile

Responses: 201 Public or optional auth
GET /v2/event-participations/{bookingId}/share-card-context

GET /v2/event-participations/{bookingId}/share-card-context

Responses: 200 Public or optional auth

Auth

18 operations

POST /v2/auth/bind-phone

Attach a first phone number to the current (email/OAuth) account. Send the OTP first via POST /auth/send-otp, then submit it here.

Responses: 200 Public or optional auth
GET /v2/auth/check-email

GET /v2/auth/check-email

Responses: 200 Public or optional auth
GET /v2/auth/check-phone-number

GET /v2/auth/check-phone-number

Responses: 200 Public or optional auth
POST /v2/auth/logout

Logout from the session

Responses: 200, 401 Public or optional auth
GET /v2/auth/methods

Which login methods are available here.

Responses: 200 Public or optional auth
POST /v2/auth/oauth/apple

Exchange and verify an Apple authorization, then sign in.

Responses: 200 Public or optional auth
POST /v2/auth/oauth/apple/callback

Apple browser form_post callback for Android.

Responses: 302 Public or optional auth
POST /v2/auth/oauth/apple/session

Create a one-time Apple OAuth state and nonce.

Responses: 201 Public or optional auth
POST /v2/auth/oauth/apple/web/exchange

Exchange a browser-bound Apple callback.

Responses: 200 Public or optional auth
POST /v2/auth/oauth/google

Sign in with a Google ID token.

Responses: 200 Public or optional auth
GET /v2/auth/oauth/status

OAuth provider configuration status.

Responses: 200 Public or optional auth
POST /v2/auth/refresh-tokens

Refresh Tokens

Responses: 200, 401, 403 Public or optional auth
POST /v2/auth/send-otp

Send the OTP

Responses: 201, 400 Public or optional auth
POST /v2/auth/step-up/verify

Step-up auth: re-verify the caller via OTP for a sensitive op (account delete, wallet withdraw, payment-method edit).

Responses: 200 Public or optional auth
POST /v2/auth/verify-otp

Verify the OTP

Responses: 201, 400 Public or optional auth
GET /v2/auth/verify-token

Verify if token is valid and get user data

Responses: 200, 401 Public or optional auth
POST /v2/auth/web/logout

POST /v2/auth/web/logout

Responses: 204 Public or optional auth
POST /v2/auth/web/session

POST /v2/auth/web/session

Responses: 200 Public or optional auth

Auth: 2FA TOTP

5 operations

POST /v2/auth/totp/confirm

Confirm TOTP enrollment with the first code from the authenticator. Flips totpEnabledAt and from then on login demands a code.

Responses: 200 Public or optional auth
POST /v2/auth/totp/disable

Disable TOTP. Requires the current code or a recovery code — prevents silent second-factor removal via stolen AT.

Responses: 200 Public or optional auth
POST /v2/auth/totp/enroll

Begin TOTP enrollment. Returns otpauth URL + a scannable QR code (PNG data URI) + 10 recovery codes; show the codes ONCE and ask the user to save them off-platform.

Responses: 200 Public or optional auth
GET /v2/auth/totp/status

Read the caller's current TOTP status. Unlike the access-token claim (stamped at login), this reflects live DB state — safe to re-check on every Security-screen mount.

Responses: 200 Public or optional auth
POST /v2/auth/totp/verify

Verify a TOTP code against the caller's enrollment. Used by `@RequiresStepUp`-style flows that prefer TOTP to OTP.

Responses: 200 Public or optional auth

Auth: Crew login

6 operations

POST /v2/auth/crew/email/send-otp

Email a 4-digit crew login code. Creates no account on its own.

Responses: 200 Public or optional auth
POST /v2/auth/crew/email/verify-otp

Verify a crew login code and return a session. Auto-links every Volunteer/VolunteerHead row across all orgs that shares this email.

Responses: 200 Public or optional auth
POST /v2/auth/crew/logout

Log out of the crew session.

Responses: 200 Public or optional auth
POST /v2/auth/crew/refresh-tokens

Refresh crew tokens.

Responses: 200 Public or optional auth
POST /v2/auth/crew/send-otp

SMS a 4-digit crew login code. Creates no account on its own.

Responses: 201 Public or optional auth
POST /v2/auth/crew/verify-otp

Verify a crew SMS code and return a session. Auto-links every Volunteer/VolunteerHead row across all orgs that shares this phone.

Responses: 200 Public or optional auth

Auth: Email login

2 operations

POST /v2/auth/email/send-otp

Email a 4-digit login code. Creates no account on its own. Pass role=organizer to send it under the organizer-branded template instead.

Responses: 200 Public or optional auth
POST /v2/auth/email/verify-otp

Verify an email login code and return a session. Links to an existing account when the address is already known. role=organizer resolves into an Organizer account instead of an athlete — never creates one.

Responses: 200 Public or optional auth

Auth: Email verification

2 operations

POST /v2/auth/email/send-verification

Queue an email verification link for the authenticated user. Required before emails leave the inbox (deliverability).

Responses: 200 Public or optional auth
GET /v2/auth/email/verify

Verify an email by the token minted at send-verification. Public because it's hit from the user's inbox.

Responses: 200 Public or optional auth

Auth: Linked sign-in methods

2 operations

GET /v2/auth/identities

List the sign-in methods linked to my account.

Responses: 200 Public or optional auth
DELETE /v2/auth/identities/{id}

Detach a sign-in method. Refused when it is the only one left on the account.

Responses: 200 Public or optional auth

Auth: Passkeys

6 operations

GET /v2/auth/passkey

List registered passkeys for the caller.

Responses: 200 Public or optional auth
DELETE /v2/auth/passkey/{id}

Revoke one passkey.

Responses: 200 Public or optional auth
POST /v2/auth/passkey/authenticate/options

Begin passkey authentication (step-up path).

Responses: 200 Public or optional auth
POST /v2/auth/passkey/authenticate/verify

Finish passkey authentication.

Responses: 200 Public or optional auth
POST /v2/auth/passkey/register/options

Begin passkey registration. Returns options to pass into navigator.credentials.create().

Responses: 200 Public or optional auth
POST /v2/auth/passkey/register/verify

Finish passkey registration by submitting the authenticator response.

Responses: 200 Public or optional auth

Auth: Sessions

3 operations

GET /v2/auth/sessions

List the caller's auth sessions. Includes active + revoked; UI should hide revoked older than 30 days.

Responses: 200 Public or optional auth
DELETE /v2/auth/sessions/{id}

Revoke one session by id.

Responses: 200 Public or optional auth
POST /v2/auth/sessions/revoke-others

Revoke every session belonging to the caller EXCEPT the current one. "Log out everywhere else."

Responses: 200 Public or optional auth

Badges

12 operations

GET /v2/badges

GET /v2/badges

Responses: 200 Public or optional auth
POST /v2/badges

POST /v2/badges

Responses: 201 Public or optional auth
GET /v2/badges/{code}/public

GET /v2/badges/{code}/public

Responses: 200 Public or optional auth
DELETE /v2/badges/{id}

DELETE /v2/badges/{id}

Responses: 200 Public or optional auth
GET /v2/badges/{id}

GET /v2/badges/{id}

Responses: 200 Public or optional auth
PATCH /v2/badges/{id}

PATCH /v2/badges/{id}

Responses: 200 Public or optional auth
POST /v2/badges/{id}/duplicate

POST /v2/badges/{id}/duplicate

Responses: 201 Public or optional auth
DELETE /v2/badges/{id}/map-challenge

DELETE /v2/badges/{id}/map-challenge

Responses: 200 Public or optional auth
POST /v2/badges/{id}/map-challenge

POST /v2/badges/{id}/map-challenge

Responses: 201 Public or optional auth
POST /v2/badges/{id}/preview

POST /v2/badges/{id}/preview

Responses: 201 Public or optional auth
POST /v2/badges/{id}/retroactive-award

POST /v2/badges/{id}/retroactive-award

Responses: 201 Public or optional auth
GET /v2/badges/{id}/stats

GET /v2/badges/{id}/stats

Responses: 200 Public or optional auth

Bank Verification

2 operations

GET /v2/bank-verification/ifsc/{ifsc}

Resolve the bank and branch for an Indian IFSC.

Responses: 200 Auth required
POST /v2/bank-verification/verify

Penny-drop verify a bank account. Returns { verified, accountExists, accountHolderName, utr, amountDeposited, transactionId } on success, or { verified: false, reason, message } when the account could not be verified.

Responses: 200 Auth required

Bib Templates

6 operations

GET /v2/bib-templates

Gallery: global templates + the caller organization's own templates.

Responses: 200 Public or optional auth
POST /v2/bib-templates

Create a bib template. Admins create GLOBAL templates; organizers create ORGANIZER-scope templates owned by themselves.

Responses: 201 Public or optional auth
DELETE /v2/bib-templates/{id}

DELETE /v2/bib-templates/{id}

Responses: 200 Public or optional auth
GET /v2/bib-templates/{id}

GET /v2/bib-templates/{id}

Responses: 200 Public or optional auth
PATCH /v2/bib-templates/{id}

PATCH /v2/bib-templates/{id}

Responses: 200 Public or optional auth
POST /v2/bib-templates/{id}/preview

Re-render the sample preview PNG (gallery thumbnail).

Responses: 201 Public or optional auth

Bootstrap

2 operations

GET /v2/bootstrap/home

Home screen bootstrap — feed + activity summary + wallet + action-center + explore carousels in one request.

Responses: 200 Auth required
GET /v2/bootstrap/me

Profile screen bootstrap — user profile + follow counts + wallet summary in one request.

Responses: 200 Auth required

Brand: Ambassador deliverables

2 operations

GET /v2/sponsor/brands/{brandId}/ambassador-offers/{offerId}/deliverables

Everything the athlete has submitted on this deal.

Responses: 200 Auth required
POST /v2/sponsor/brands/{brandId}/ambassador-offers/{offerId}/deliverables/{submissionId}/review

Approve or reject a submission. Rejection requires a reason; approving the last one starts the payout hold.

Responses: 201 Auth required

Brand: Ambassador messages

5 operations

POST /v2/sponsor/brands/{brandId}/ambassador-offers/{offerId}/message-attachment

POST /v2/sponsor/brands/{brandId}/ambassador-offers/{offerId}/message-attachment

Responses: 201 Auth required
GET /v2/sponsor/brands/{brandId}/ambassador-offers/{offerId}/messages

The conversation on this deal, oldest first.

Responses: 200 Auth required
POST /v2/sponsor/brands/{brandId}/ambassador-offers/{offerId}/messages

Send a message to the athlete.

Responses: 201 Auth required
DELETE /v2/sponsor/brands/{brandId}/ambassador-offers/{offerId}/messages/{messageId}

DELETE /v2/sponsor/brands/{brandId}/ambassador-offers/{offerId}/messages/{messageId}

Responses: 200 Auth required
POST /v2/sponsor/brands/{brandId}/ambassador-offers/{offerId}/messages/read

Mark everything from the athlete as read.

Responses: 201 Auth required

Brand: Inventory

5 operations

GET /v2/sponsor/brands/{brandId}/inventory

List inventory items for a brand.

Responses: 200 Auth required
POST /v2/sponsor/brands/{brandId}/inventory

Create an inventory item.

Responses: 201 Auth required
PATCH /v2/sponsor/brands/{brandId}/inventory/{itemId}

Update an item name / low-stock threshold.

Responses: 200 Auth required
GET /v2/sponsor/brands/{brandId}/inventory/{itemId}/movements

Stock movement history for one item (delta / before / after), newest first. Derived from the audit trail, so it is a recent history rather than a permanent ledger.

Responses: 200 Auth required
PATCH /v2/sponsor/brands/{brandId}/inventory/{itemId}/stock

Adjust stock by a delta (positive = restock, negative = consume). Crossing the threshold emits a low-stock audit alert.

Responses: 200 Auth required

Brand: Reward Grants

2 operations

GET /v2/sponsor/brands/{brandId}/reward-grants

List recent per-athlete reward grants.

Responses: 200 Auth required
POST /v2/sponsor/brands/{brandId}/reward-grants

Grant a reward to a specific athlete. Reason required; amount validated; idempotent on sequenceKey; audit-emitting.

Responses: 201 Auth required

Calendar

12 operations

GET /v2/user/calendar/daily

Get daily calendar

Returns all calendar events for a specific date

Responses: 200 Public or optional auth
GET /v2/user/calendar/month

Get monthly calendar

Returns all calendar events (training workouts, custom workouts, events, challenges) for a specific month

Responses: 200 Public or optional auth
GET /v2/user/calendar/range

Get calendar for date range

Returns all calendar events for a custom date range

Responses: 200 Public or optional auth
GET /v2/user/calendar/today

Get today's calendar

Returns all calendar events for today

Responses: 200 Public or optional auth
GET /v2/user/calendar/workouts

Get all manual workouts

Get all custom workouts created by the user

Responses: 200 Public or optional auth
POST /v2/user/calendar/workouts

Create a manual workout

Create a custom workout entry in your calendar

Responses: 201 Public or optional auth
DELETE /v2/user/calendar/workouts/{workoutId}

Delete a workout

Delete a custom workout

Responses: 200 Public or optional auth
GET /v2/user/calendar/workouts/{workoutId}

Get a specific workout

Get details of a specific workout

Responses: 200 Public or optional auth
PUT /v2/user/calendar/workouts/{workoutId}

Update a workout

Update a custom workout

Responses: 200 Public or optional auth
PUT /v2/user/calendar/workouts/{workoutId}/complete

Mark workout as completed

Toggle workout completion status

Responses: 200 Public or optional auth
GET /v2/user/calendar/workouts/month

Get workouts for a month

Get all custom workouts for a specific month

Responses: 200 Public or optional auth
GET /v2/user/calendar/workouts/statistics

Get workout statistics

Get statistics for user workouts

Responses: 200 Public or optional auth

Challenge Badge Requests

2 operations

GET /v2/challenges/{creatorType}/{creatorId}/badge-requests

GET /v2/challenges/{creatorType}/{creatorId}/badge-requests

Responses: 200 Public or optional auth
POST /v2/challenges/{creatorType}/{creatorId}/badge-requests

POST /v2/challenges/{creatorType}/{creatorId}/badge-requests

Responses: 201 Public or optional auth

Challenge Participations

9 operations

GET /v2/challenge-participations

GET /v2/challenge-participations

Responses: 200 Public or optional auth
DELETE /v2/challenge-participations/{challengeId}

DELETE /v2/challenge-participations/{challengeId}

Responses: 200 Public or optional auth
GET /v2/challenge-participations/{challengeId}

GET /v2/challenge-participations/{challengeId}

Responses: 200 Public or optional auth
PATCH /v2/challenge-participations/{challengeId}

PATCH /v2/challenge-participations/{challengeId}

Responses: 200 Public or optional auth
POST /v2/challenge-participations/{challengeId}

POST /v2/challenge-participations/{challengeId}

Responses: 201 Public or optional auth
GET /v2/challenge-participations/{challengeId}/multi-sport-progress

GET /v2/challenge-participations/{challengeId}/multi-sport-progress

Responses: 200 Public or optional auth
GET /v2/challenge-participations/{challengeId}/payment-summary

GET /v2/challenge-participations/{challengeId}/payment-summary

Responses: 200 Public or optional auth
POST /v2/challenge-participations/{challengeId}/verify-payment

POST /v2/challenge-participations/{challengeId}/verify-payment

Responses: 201 Public or optional auth
GET /v2/challenge-participations/badges/all

GET /v2/challenge-participations/badges/all

Responses: 200 Public or optional auth

Challenge Prizes

3 operations

GET /v2/challenges/{challengeId}/prizes/contributions

Owner goodie inbox — { items, hasRankSlabs } for the challenge

Returns an OBJECT, not an array. `items` are the contributions, each enriched with the proposing brand's `sponsorBrandName` / `sponsorBrandLogoUrl` (public identity only). `hasRankSlabs` is true when the challenge already has at least one non-PARTICIPATION prize slab — false means accepting a goodie will create the prize rank for it. The flag ships here because the prize-ladder route is organizer-guarded and unreachable for club admins.

Responses: 200 Auth required
PATCH /v2/challenges/{challengeId}/prizes/contributions/{contributionId}/accept

Accept a sponsor goodie onto a challenge prize rank

Attaches a sponsor-attributed product to the slab covering the target rank. Refused when no slab covers that rank.

Responses: 200 Auth required
PATCH /v2/challenges/{challengeId}/prizes/contributions/{contributionId}/reject

Reject a sponsor goodie contribution

Responses: 200 Auth required

Challenge Templates

3 operations

GET /v2/challenge-templates

List the organizer's saved challenge templates.

Responses: 200 Auth required
POST /v2/challenge-templates

Save a reusable challenge template.

Responses: 201 Auth required
DELETE /v2/challenge-templates/{id}

Delete a saved challenge template.

Responses: 200 Auth required

Challenges

51 operations

GET /v2/challenges

GET /v2/challenges

Responses: 200 Public or optional auth
POST /v2/challenges

POST /v2/challenges

Responses: 201 Public or optional auth
DELETE /v2/challenges/{id}

DELETE /v2/challenges/{id}

Responses: 200 Public or optional auth
GET /v2/challenges/{id}

GET /v2/challenges/{id}

Responses: 200 Public or optional auth
PATCH /v2/challenges/{id}

PATCH /v2/challenges/{id}

Responses: 200 Public or optional auth
GET /v2/challenges/{id}/analytics

Per-challenge analytics aggregate.

Responses: 200 Public or optional auth
DELETE /v2/challenges/{id}/attach-to-event/{eventId}

Detach a challenge from an organizer event.

Responses: 200 Public or optional auth
POST /v2/challenges/{id}/attach-to-event/{eventId}

Attach a challenge to an organizer event.

Responses: 201 Public or optional auth
GET /v2/challenges/{id}/audiences

List audience bindings on a challenge.

Responses: 200 Public or optional auth
POST /v2/challenges/{id}/audiences

Bind an audience to a challenge.

Responses: 201 Public or optional auth
DELETE /v2/challenges/{id}/audiences/{audienceId}

Remove a challenge audience binding.

Responses: 200 Public or optional auth
GET /v2/challenges/{id}/badges

GET /v2/challenges/{id}/badges

Responses: 200 Public or optional auth
GET /v2/challenges/{id}/calendar.ics

Download an .ics calendar invite for a challenge the athlete has joined.

Responses: 200 Public or optional auth
POST /v2/challenges/{id}/cancel

POST /v2/challenges/{id}/cancel

Responses: 201 Public or optional auth
GET /v2/challenges/{id}/events

List events that this challenge is attached to.

Responses: 200 Public or optional auth
GET /v2/challenges/{id}/leaderboard

Ranked leaderboard for a challenge.

Responses: 200 Public or optional auth
GET /v2/challenges/{id}/leaderboard/paged

Paginated challenge leaderboard + the viewer rank.

Responses: 200 Public or optional auth
GET /v2/challenges/{id}/participants

List participants of a challenge (paginated).

Responses: 200 Public or optional auth
GET /v2/challenges/{id}/prizes

Get the rank-wise prize breakdown (Cash/RC Coin/Product) for a challenge.

Responses: 200 Public or optional auth
GET /v2/challenges/{id}/promo-stories

List active promo stories for a challenge.

Responses: 200 Public or optional auth
DELETE /v2/challenges/{id}/promo-stories/{storyId}

Delete a challenge promo story.

Responses: 200 Public or optional auth
GET /v2/challenges/{id}/promo-stories/{storyId}/insights

Aggregate view / like / comment stats for a promo story.

Responses: 200 Public or optional auth
GET /v2/challenges/{id}/promo-stories/{storyId}/reactions

Paginated list of athletes who liked a promo story.

Responses: 200 Public or optional auth
GET /v2/challenges/{id}/promo-stories/{storyId}/replies

Paginated list of athlete comments on a promo story.

Responses: 200 Public or optional auth
POST /v2/challenges/{id}/promo-story

Create a challenge promo story that appears in the athlete-app story feed.

Responses: 201 Public or optional auth
GET /v2/challenges/{id}/readiness

GET /v2/challenges/{id}/readiness

Responses: 200 Public or optional auth
PATCH /v2/challenges/{id}/review

PATCH /v2/challenges/{id}/review

Responses: 200 Public or optional auth
GET /v2/challenges/{id}/rewards

List reward distributions for a challenge.

Responses: 200 Public or optional auth
PATCH /v2/challenges/{id}/rewards/{rewardId}/address

Submit shipping address for a MERCH/PRODUCT reward.

Responses: 200 Public or optional auth
PATCH /v2/challenges/{id}/rewards/{rewardId}/cancel

Cancel a MERCH/PRODUCT reward shipment.

Responses: 200 Public or optional auth
PATCH /v2/challenges/{id}/rewards/{rewardId}/deliver

Mark a MERCH/PRODUCT reward delivered.

Responses: 200 Public or optional auth
PATCH /v2/challenges/{id}/rewards/{rewardId}/ship

Manually mark a MERCH/PRODUCT reward shipped.

Responses: 200 Public or optional auth
PATCH /v2/challenges/{id}/rewards/{rewardId}/ship-via-shiprocket

Create a Shiprocket order for this reward and stamp tracking. 400 when Shiprocket is not configured.

Responses: 200 Public or optional auth
POST /v2/challenges/{id}/rewards/distribute

Distribute a winning-athlete reward (CASH / DISCOUNT / MERCH / EVENT_ENTRY).

Responses: 201 Public or optional auth
POST /v2/challenges/{id}/rewards/distribute-all

Distribute all rank-wise prizes (Cash/RC Coin/Product) for a completed challenge.

Responses: 201 Public or optional auth
GET /v2/challenges/{id}/tags

GET /v2/challenges/{id}/tags

Responses: 200 Public or optional auth
PATCH /v2/challenges/{id}/tags

PATCH /v2/challenges/{id}/tags

Responses: 200 Public or optional auth
PATCH /v2/challenges/{id}/toggle

PATCH /v2/challenges/{id}/toggle

Responses: 200 Public or optional auth
GET /v2/challenges/{idOrSlug}/public

GET /v2/challenges/{idOrSlug}/public

Responses: 200 Public or optional auth
GET /v2/challenges/club/{clubId}

List a club's own challenges (all statuses, all timeframes)

Responses: 200 Public or optional auth
POST /v2/challenges/club/{clubId}

POST /v2/challenges/club/{clubId}

Responses: 201 Public or optional auth
PATCH /v2/challenges/club/{clubId}/{id}

PATCH /v2/challenges/club/{clubId}/{id}

Responses: 200 Public or optional auth
POST /v2/challenges/club/{clubId}/{id}/cancel

Cancel a club's own challenge and run the refund cascade

Responses: 201 Public or optional auth
PATCH /v2/challenges/club/{clubId}/{id}/toggle

Pause or resume a club's own challenge

Responses: 200 Public or optional auth
GET /v2/challenges/discover

GET /v2/challenges/discover

Responses: 200 Public or optional auth
GET /v2/challenges/explore

GET /v2/challenges/explore

Responses: 200 Public or optional auth
GET /v2/challenges/featured

GET /v2/challenges/featured

Responses: 200 Public or optional auth
GET /v2/challenges/tags/{slug}/challenges

List challengeIds that wear the given canonical tag slug. Pair with /v2/challenges/discover for the full payload.

Responses: 200 Public or optional auth
GET /v2/challenges/tags/taxonomy

List the canonical 14-tag challenge taxonomy.

Responses: 200 Public or optional auth
POST /v2/challenges/video-uploads

POST /v2/challenges/video-uploads

Responses: 201 Public or optional auth
POST /v2/challenges/video-uploads/cleanup

POST /v2/challenges/video-uploads/cleanup

Responses: 201 Public or optional auth

Challenges — Completion Attestation

1 operations

GET /v2/me/challenges/{id}/attestation.svg

Render the athlete-only shareable completion attestation as SVG (1080x1920).

Responses: 200 Public or optional auth

Challenges — Promo Stories

6 operations

GET /v2/challenges/promo-stories

GET /v2/challenges/promo-stories

Responses: 200 Public or optional auth
POST /v2/challenges/promo-stories

POST /v2/challenges/promo-stories

Responses: 201 Public or optional auth
DELETE /v2/challenges/promo-stories/{id}

DELETE /v2/challenges/promo-stories/{id}

Responses: 200 Public or optional auth
GET /v2/challenges/promo-stories/{id}/insights

GET /v2/challenges/promo-stories/{id}/insights

Responses: 200 Public or optional auth
GET /v2/challenges/promo-stories/{id}/reactions

GET /v2/challenges/promo-stories/{id}/reactions

Responses: 200 Public or optional auth
GET /v2/challenges/promo-stories/{id}/replies

GET /v2/challenges/promo-stories/{id}/replies

Responses: 200 Public or optional auth

Charity — 80G Tax Receipt

1 operations

GET /v2/me/challenge-participations/{id}/tax-receipt

Download the 80G tax receipt for the athlete's charity-challenge participation. Currently returns text/plain; PDF wrapper carry-forward.

Responses: 200 Public or optional auth

Cloud Storage - Earnings

3 operations

GET /v2/cloud-storage/earnings

GET /v2/cloud-storage/earnings

Responses: 200 Public or optional auth
GET /v2/cloud-storage/earnings/by-event

GET /v2/cloud-storage/earnings/by-event

Responses: 200 Public or optional auth
GET /v2/cloud-storage/earnings/summary

GET /v2/cloud-storage/earnings/summary

Responses: 200 Public or optional auth

Cloud Storage - Event Details

3 operations

POST /v2/cloud-storage/event-details

POST /v2/cloud-storage/event-details

Responses: 201 Public or optional auth
GET /v2/cloud-storage/event-details/{eventId}

GET /v2/cloud-storage/event-details/{eventId}

Responses: 200 Public or optional auth
PATCH /v2/cloud-storage/event-details/{eventId}

PATCH /v2/cloud-storage/event-details/{eventId}

Responses: 200 Public or optional auth

Cloud Storage - Event Media

5 operations

POST /v2/cloud-storage/media

POST /v2/cloud-storage/media

Responses: 201 Public or optional auth
GET /v2/cloud-storage/media/{eventId}

GET /v2/cloud-storage/media/{eventId}

Responses: 200 Public or optional auth
DELETE /v2/cloud-storage/media/{mediaId}

DELETE /v2/cloud-storage/media/{mediaId}

Responses: 200 Public or optional auth
POST /v2/cloud-storage/media/bulk

POST /v2/cloud-storage/media/bulk

Responses: 201 Public or optional auth
POST /v2/cloud-storage/media/check-limits

POST /v2/cloud-storage/media/check-limits

Responses: 201 Public or optional auth

Cloud Storage - Event Settings

8 operations

GET /v2/cloud-storage/event-settings

GET /v2/cloud-storage/event-settings

Responses: 200 Public or optional auth
POST /v2/cloud-storage/event-settings

POST /v2/cloud-storage/event-settings

Responses: 201 Public or optional auth
DELETE /v2/cloud-storage/event-settings/{eventId}

DELETE /v2/cloud-storage/event-settings/{eventId}

Responses: 200 Public or optional auth
GET /v2/cloud-storage/event-settings/{eventId}

GET /v2/cloud-storage/event-settings/{eventId}

Responses: 200 Public or optional auth
PATCH /v2/cloud-storage/event-settings/{eventId}

PATCH /v2/cloud-storage/event-settings/{eventId}

Responses: 200 Public or optional auth
PATCH /v2/cloud-storage/event-settings/{eventId}/subscription

PATCH /v2/cloud-storage/event-settings/{eventId}/subscription

Responses: 200 Public or optional auth
PATCH /v2/cloud-storage/event-settings/{eventId}/toggle-live

PATCH /v2/cloud-storage/event-settings/{eventId}/toggle-live

Responses: 200 Public or optional auth
GET /v2/cloud-storage/event-settings/events/without-settings

GET /v2/cloud-storage/event-settings/events/without-settings

Responses: 200 Public or optional auth

Cloud Storage - Face API (Organizer)

6 operations

DELETE /v2/cloud-storage/face-api/events/{eventId}

Delete all event images

Delete all images and embeddings for an event. This action cannot be undone.

Responses: 200 Public or optional auth
DELETE /v2/cloud-storage/face-api/images

Delete images

Delete one or more images from cloud storage and the face index by asset URL. Accepts `assetUrls` (preferred) or the legacy `s3ImageUrls`.

Responses: 200 Public or optional auth
GET /v2/cloud-storage/face-api/images

List all images

List all images with pagination for the organizer.

Responses: 200 Public or optional auth
POST /v2/cloud-storage/face-api/ingest

Ingest images for face detection

Upload images to detect faces, store in S3, and index embeddings for an event.

Responses: 201 Public or optional auth
GET /v2/cloud-storage/face-api/storage

Get storage statistics

Get storage statistics by event for the organizer, including total storage, images, and faces.

Responses: 200 Public or optional auth
GET /v2/cloud-storage/face-api/storage/all

Get all organizers storage statistics

Admin-only: Get storage statistics across all organizers with per-event breakdown.

Responses: 200 Public or optional auth

Cloud Storage - Face Search (User)

1 operations

POST /v2/cloud-storage/face-search

Search for matching faces

Upload 3 selfies (front, left, right) to search for matching faces in event photos. Returns free image URLs immediately. Paid images require purchase.

Responses: 201 Public or optional auth

Cloud Storage - Storage Plans

6 operations

GET /v2/cloud-storage/plans

GET /v2/cloud-storage/plans

Responses: 200 Public or optional auth
POST /v2/cloud-storage/plans

POST /v2/cloud-storage/plans

Responses: 201 Public or optional auth
DELETE /v2/cloud-storage/plans/{id}

DELETE /v2/cloud-storage/plans/{id}

Responses: 200 Public or optional auth
GET /v2/cloud-storage/plans/{id}

GET /v2/cloud-storage/plans/{id}

Responses: 200 Public or optional auth
PATCH /v2/cloud-storage/plans/{id}

PATCH /v2/cloud-storage/plans/{id}

Responses: 200 Public or optional auth
PATCH /v2/cloud-storage/plans/{id}/toggle-status

PATCH /v2/cloud-storage/plans/{id}/toggle-status

Responses: 200 Public or optional auth

Cloud Storage - Subscriptions

7 operations

GET /v2/cloud-storage/subscriptions

GET /v2/cloud-storage/subscriptions

Responses: 200 Public or optional auth
POST /v2/cloud-storage/subscriptions

POST /v2/cloud-storage/subscriptions

Responses: 201 Public or optional auth
POST /v2/cloud-storage/subscriptions/{subscriptionId}/verify-payment

POST /v2/cloud-storage/subscriptions/{subscriptionId}/verify-payment

Responses: 201 Public or optional auth
GET /v2/cloud-storage/subscriptions/active

GET /v2/cloud-storage/subscriptions/active

Responses: 200 Public or optional auth
GET /v2/cloud-storage/subscriptions/overview

GET /v2/cloud-storage/subscriptions/overview

Responses: 200 Public or optional auth
POST /v2/cloud-storage/subscriptions/payment-link

POST /v2/cloud-storage/subscriptions/payment-link

Responses: 201 Public or optional auth
POST /v2/cloud-storage/subscriptions/repair-galleries

POST /v2/cloud-storage/subscriptions/repair-galleries

Responses: 201 Public or optional auth

Cloud Storage - User Images

5 operations

GET /v2/cloud-storage/user-images/{eventId}

GET /v2/cloud-storage/user-images/{eventId}

Responses: 200 Public or optional auth
GET /v2/cloud-storage/user-images/event/{eventId}/status

GET /v2/cloud-storage/user-images/event/{eventId}/status

Responses: 200 Public or optional auth
GET /v2/cloud-storage/user-images/galleries

GET /v2/cloud-storage/user-images/galleries

Responses: 200 Public or optional auth
POST /v2/cloud-storage/user-images/purchase

POST /v2/cloud-storage/user-images/purchase

Responses: 201 Public or optional auth
POST /v2/cloud-storage/user-images/verify-payment/{orderId}

POST /v2/cloud-storage/user-images/verify-payment/{orderId}

Responses: 201 Public or optional auth

Cloud Storage - Webhooks

1 operations

POST /v2/cloud-storage/webhooks/cashfree

Cashfree payment webhook for cloud-storage (photo purchases / storage subscriptions). HMAC-SHA256 signature required.

Responses: 200 Public or optional auth

Club Admin: Announcement Email Blast

2 operations

GET /v2/clubs/{clubId}/admin/announcements/{id}/email-blast

Get the email-blast status for an announcement.

Responses: 200 Auth required
POST /v2/clubs/{clubId}/admin/announcements/{id}/email-blast

Send an email blast for a published announcement.

Responses: 201 Auth required

Club Admin: Audience Segments

8 operations

GET /v2/clubs/{clubId}/admin/audience-segments

List audience segments.

Responses: 200 Auth required
POST /v2/clubs/{clubId}/admin/audience-segments

Create an audience segment.

Responses: 201 Auth required
PATCH /v2/clubs/{clubId}/admin/audience-segments/{id}

Update an audience segment.

Responses: 200 Auth required
POST /v2/clubs/{clubId}/admin/audience-segments/{id}/archive

Archive an audience segment.

Responses: 201 Auth required
GET /v2/clubs/{clubId}/admin/audience-segments/{id}/preview

Preview matching member count (count only).

Responses: 200 Auth required
DELETE /v2/clubs/{clubId}/admin/audience-segments/challenge-audiences/{id}

Detach a segment from a challenge.

Responses: 200 Auth required
POST /v2/clubs/{clubId}/admin/audience-segments/challenges/{challengeId}/attach/{segmentId}

Attach a segment to a challenge.

Responses: 201 Auth required
GET /v2/clubs/{clubId}/admin/audience-segments/challenges/{challengeId}/audiences

List segments attached to a challenge.

Responses: 200 Auth required

Club Admin: Auto-Recognition

7 operations

GET /v2/clubs/{clubId}/admin/recognition-rules

List recognition rules.

Responses: 200 Auth required
POST /v2/clubs/{clubId}/admin/recognition-rules

Create a recognition rule (DISABLED by default).

Responses: 201 Auth required
GET /v2/clubs/{clubId}/admin/recognition-rules/{id}

Get a recognition rule.

Responses: 200 Auth required
PATCH /v2/clubs/{clubId}/admin/recognition-rules/{id}

Update a recognition rule.

Responses: 200 Auth required
POST /v2/clubs/{clubId}/admin/recognition-rules/{id}/disable

Disable a recognition rule.

Responses: 201 Auth required
POST /v2/clubs/{clubId}/admin/recognition-rules/{id}/enable

Enable a recognition rule.

Responses: 201 Auth required
GET /v2/clubs/{clubId}/admin/recognition-rules/{id}/evaluate

Preview who the rule would recognise (no award).

Responses: 200 Auth required

Club Admin: Membership Tier Change

2 operations

POST /v2/clubs/{clubId}/admin/memberships/{id}/change-tier

Change a membership tier (refund-last-billing).

Responses: 201 Auth required
POST /v2/clubs/{clubId}/admin/memberships/{id}/change-tier/preview

Preview the refund for a proposed tier change.

Responses: 201 Auth required

Club Admin: Wave 2

9 operations

POST /v2/clubs/{clubId}/admin/brand-challenges/{challengeId}/join

Club joins (as a club) an APPROVED brand challenge. Emits club.brand_challenge.joined.

Responses: 201 Auth required
POST /v2/clubs/{clubId}/admin/brand-challenges/{challengeId}/withdraw

Club withdraws from a brand challenge it joined.

Responses: 201 Auth required
GET /v2/clubs/{clubId}/admin/brand-challenges/participations

List brand challenges this club has joined.

Responses: 200 Auth required
GET /v2/clubs/{clubId}/admin/discoverable-events

Discover organizer events (city-scoped) the club may attach to.

Responses: 200 Auth required
GET /v2/clubs/{clubId}/admin/event-attachments

List the club's attach requests (any status).

Responses: 200 Auth required
POST /v2/clubs/{clubId}/admin/event-attachments/{attachmentId}/detach

Club withdraws (detaches) its own active attachment.

Responses: 201 Auth required
POST /v2/clubs/{clubId}/admin/events/{eventId}/attach

Club requests to attach / co-host an organizer event. Emits club.event_attach.requested.

Responses: 201 Auth required
GET /v2/clubs/{clubId}/admin/member-segments

List club member segments.

Responses: 200 Auth required
POST /v2/clubs/{clubId}/admin/member-segments

Create a saved member segment.

Responses: 201 Auth required

Club invites — redemption

2 operations

POST /v2/clubs/invites/{token}/accept

Accept a club invite. Creates the membership via the normal join path so every guard (suspension, club-active, banned, tier) still applies. A targeted invite auto-approves into a gated club; a shareable link does NOT — it still faces club.requiresApproval, since a link can be forwarded to anyone.

Responses: 201 Auth required
GET /v2/clubs/invites/by-token/{token}

Preview a club invite from its share token. Public — the recipient may not have an account yet. Returns a verdict object (valid + reason) rather than 404ing, so each rejection can be shown differently.

Responses: 200 Public or optional auth

Club: Custom Awards

4 operations

GET /v2/clubs/{clubId}/admin/awards

GET /v2/clubs/{clubId}/admin/awards

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/awards

POST /v2/clubs/{clubId}/admin/awards

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/admin/awards/{awardId}

DELETE /v2/clubs/{clubId}/admin/awards/{awardId}

Responses: 200 Public or optional auth
PATCH /v2/clubs/{clubId}/admin/awards/{awardId}

PATCH /v2/clubs/{clubId}/admin/awards/{awardId}

Responses: 200 Public or optional auth

Club: KYC

6 operations

GET /v2/clubs/{clubId}/kyc

The club's KYC record, or null if it has never started one. Includes document URLs and bank details — the club owns this data.

Responses: 200 Auth required
PATCH /v2/clubs/{clubId}/kyc

Partial update of the club KYC — identical semantics to POST (nothing is cleared unless a replacement is supplied).

Responses: 200 Auth required
POST /v2/clubs/{clubId}/kyc

Create or update the club KYC. Only documents actually attached to this request are overwritten. Locked while UNDER_REVIEW / APPROVED.

Responses: 201 Auth required
POST /v2/clubs/{clubId}/kyc/submit

Submit the club KYC for admin review. Requires panCard, a bank account (number + IFSC) and a successful penny-drop verification of that account.

Responses: 201 Auth required
POST /v2/clubs/{clubId}/kyc/verify-bank

Penny-drop verify the club settlement account and store the result on the KYC record. Returns 200 for BOTH outcomes: { verified: true, accountHolderName, bankVerification, kyc } or { verified: false, reason, message }. Locked while UNDER_REVIEW / APPROVED (CLUB_KYC_LOCKED). If a settlement account is already saved, the submitted account must be that same account (CLUB_KYC_BANK_ACCOUNT_MISMATCH) — otherwise a club could verify one account and settle to another.

Responses: 200 Auth required
POST /v2/clubs/{clubId}/kyc/verify-pan

Verify the saved club legal name, PAN and date through Sandbox and persist the evidence.

Responses: 200 Auth required

Club: Onboarding workflow

3 operations

GET /v2/clubs/onboarding/me

Primary Club lifecycle state. Prefers an owned Club, then a retained Admin workspace after ownership transfer; returns null when neither exists.

Responses: 200 Auth required
POST /v2/clubs/onboarding/me/{clubId}/resubmit

Resubmit a SUSPENDED (rejected) club for admin re-review. Clears prior rejection reason.

Responses: 201 Auth required
POST /v2/clubs/onboarding/me/{clubId}/submit

Submit a DRAFT club for admin review. Required: club name + slug already saved.

Responses: 201 Auth required

Club: RC Grants

3 operations

GET /v2/clubs/{clubId}/rc-grants

This club's RC grant requests, newest first, plus the club's outstanding granted-RC debt in COINS (`outstandingRc`) and its rupee value at the CURRENT rate (`estimatedFiatAtCurrentRate` + `rateUsed`, both null when the platform rate is unreadable — never a guessed zero).

Responses: 200 Auth required
POST /v2/clubs/{clubId}/rc-grants

Request an RC Coin grant. At most one request may be open at a time (409 CLUB_RC_GRANT_REQUEST_ALREADY_OPEN). Granted RC is a DEBT measured in COINS: the club owes back the number of RC it took, and the cash is cut from a future payout at whatever the RC rate is AT THAT TIME.

Responses: 201 Auth required
POST /v2/clubs/{clubId}/rc-grants/{id}/cancel

Withdraw an RC grant request that is still awaiting review. An APPROVED grant cannot be cancelled — the coins are already in the wallet and the debt already exists.

Responses: 200 Auth required

Club: Revenue streams

1 operations

GET /v2/clubs/{clubId}/revenue-streams

Club-scoped revenue streams (CLUB_MEMBERSHIP only). Cross-club callers get 403.

Responses: 200 Auth required

Club: Settlements & Payouts

5 operations

GET /v2/clubs/{clubId}/settlements

The club's own settlement history — only rows whose PAYEE is this club, never organizer-paid rows that merely carry the club as an attribution tag.

Responses: 200 Auth required
GET /v2/clubs/{clubId}/settlements/{settlementId}

One of the club’s own settlements, including `payableAmount` and the itemised `grantRecovery` line (rupees withheld + RC extinguished + the LIVE rate used) that explains the gap between `netAmount` and what is paid. 404s (SETTLEMENT_NOT_FOUND) for another club’s or an organizer-paid settlement.

Responses: 200 Auth required
POST /v2/clubs/{clubId}/settlements/{settlementId}/payout-request

Request payout of an ELIGIBLE club settlement. Coded conflicts: PAYOUT_ALREADY_REQUESTED, PAYOUT_ALREADY_PAID, SETTLEMENT_NOT_ELIGIBLE, CLUB_PAYOUT_FROZEN, SETTLEMENT_NOT_CLUB_PAYEE.

Responses: 201 Auth required
GET /v2/clubs/{clubId}/settlements/payout-requests

The club's own payout requests.

Responses: 200 Auth required
POST /v2/clubs/{clubId}/settlements/payout-requests/{id}/cancel

Cancel an open club payout request (reason required).

Responses: 201 Auth required

Clubs

36 operations

GET /v2/clubs

GET /v2/clubs

Responses: 200 Public or optional auth
POST /v2/clubs

POST /v2/clubs

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/sports

GET /v2/clubs/{clubId}/sports

Responses: 200 Public or optional auth
GET /v2/clubs/{id}/announcements

GET /v2/clubs/{id}/announcements

Responses: 200 Public or optional auth
DELETE /v2/clubs/{id}/block

DELETE /v2/clubs/{id}/block

Responses: 200 Public or optional auth
POST /v2/clubs/{id}/block

POST /v2/clubs/{id}/block

Responses: 201 Public or optional auth
GET /v2/clubs/{id}/challenges

GET /v2/clubs/{id}/challenges

Responses: 200 Public or optional auth
GET /v2/clubs/{id}/featured-members

GET /v2/clubs/{id}/featured-members

Responses: 200 Public or optional auth
DELETE /v2/clubs/{id}/follow

DELETE /v2/clubs/{id}/follow

Responses: 200 Public or optional auth
POST /v2/clubs/{id}/follow

POST /v2/clubs/{id}/follow

Responses: 201 Public or optional auth
GET /v2/clubs/{id}/follow/count

GET /v2/clubs/{id}/follow/count

Responses: 200 Public or optional auth
GET /v2/clubs/{id}/follow/status

GET /v2/clubs/{id}/follow/status

Responses: 200 Public or optional auth
POST /v2/clubs/{id}/join

POST /v2/clubs/{id}/join

Responses: 201 Public or optional auth
POST /v2/clubs/{id}/leave

POST /v2/clubs/{id}/leave

Responses: 201 Public or optional auth
GET /v2/clubs/{id}/members

GET /v2/clubs/{id}/members

Responses: 200 Public or optional auth
GET /v2/clubs/{id}/membership/me

GET /v2/clubs/{id}/membership/me

Responses: 200 Public or optional auth
GET /v2/clubs/{id}/messages

GET /v2/clubs/{id}/messages

Responses: 200 Public or optional auth
GET /v2/clubs/{id}/monetization-eligibility

GET /v2/clubs/{id}/monetization-eligibility

Responses: 200 Public or optional auth
DELETE /v2/clubs/{id}/mute

DELETE /v2/clubs/{id}/mute

Responses: 200 Public or optional auth
POST /v2/clubs/{id}/mute

POST /v2/clubs/{id}/mute

Responses: 201 Public or optional auth
GET /v2/clubs/{id}/posts

GET /v2/clubs/{id}/posts

Responses: 200 Public or optional auth
GET /v2/clubs/{id}/readiness

GET /v2/clubs/{id}/readiness

Responses: 200 Public or optional auth
GET /v2/clubs/{id}/runs

GET /v2/clubs/{id}/runs

Responses: 200 Public or optional auth
GET /v2/clubs/{id}/runs/{runId}

GET /v2/clubs/{id}/runs/{runId}

Responses: 200 Public or optional auth
POST /v2/clubs/{id}/runs/{runId}/rsvp

POST /v2/clubs/{id}/runs/{runId}/rsvp

Responses: 201 Public or optional auth
GET /v2/clubs/{id}/runs/calendar

GET /v2/clubs/{id}/runs/calendar

Responses: 200 Public or optional auth
GET /v2/clubs/{id}/social-verdict

GET /v2/clubs/{id}/social-verdict

Responses: 200 Public or optional auth
GET /v2/clubs/{id}/summary

GET /v2/clubs/{id}/summary

Responses: 200 Public or optional auth
POST /v2/clubs/{id}/tier/cancel

POST /v2/clubs/{id}/tier/cancel

Responses: 201 Public or optional auth
POST /v2/clubs/{id}/tier/resume

POST /v2/clubs/{id}/tier/resume

Responses: 201 Public or optional auth
GET /v2/clubs/{id}/tiers

GET /v2/clubs/{id}/tiers

Responses: 200 Public or optional auth
POST /v2/clubs/{id}/tiers/{tierId}/checkout

POST /v2/clubs/{id}/tiers/{tierId}/checkout

Responses: 201 Public or optional auth
POST /v2/clubs/{id}/tiers/{tierId}/payments/{paymentId}/verify

POST /v2/clubs/{id}/tiers/{tierId}/payments/{paymentId}/verify

Responses: 201 Public or optional auth
GET /v2/clubs/{idOrSlug}

GET /v2/clubs/{idOrSlug}

Responses: 200 Public or optional auth
GET /v2/clubs/by-sport/{sportId}

GET /v2/clubs/by-sport/{sportId}

Responses: 200 Public or optional auth
GET /v2/clubs/creation-eligibility

GET /v2/clubs/creation-eligibility

Responses: 200 Public or optional auth

Clubs — sponsorship money

2 operations

GET /v2/clubs/{clubId}/sponsorship-earnings

Sponsorship money owed to or paid to this club — what a brand agreed, whether it has paid, whether Repeak still holds it, and when it settles.

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/sponsorship-earnings/{contractId}

One sponsorship, in full.

Responses: 200 Public or optional auth

Clubs — sponsorship proposals

4 operations

GET /v2/clubs/{clubId}/sponsorship-proposals

Brand sponsorship proposals addressed to this club's challenges.

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/sponsorship-proposals/{proposalId}

One proposal in full — the brand behind it, the challenge it targets, and the decision so far.

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/sponsorship-proposals/{proposalId}/accept

Accept a proposal. The brand is attached to the challenge and may then add goodie products to its leaderboard.

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/sponsorship-proposals/{proposalId}/decline

Decline a proposal, with a reason for the brand.

Responses: 201 Public or optional auth

Clubs: Channels

4 operations

GET /v2/clubs/{clubId}/channels

List the caller-visible channels for a club. Default #general is auto-provisioned if missing.

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/channels

Create a channel. Admin-only.

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/channels/{channelId}

Archive (soft-delete) a channel. Admin-only. The #general default channel cannot be archived.

Responses: 200 Public or optional auth
PATCH /v2/clubs/{clubId}/channels/{channelId}

Update a channel. Admin-only.

Responses: 200 Public or optional auth

Clubs: Events

1 operations

POST /v2/clubs/{clubId}/events

Create an event owned by the specified club. Caller must be the club's OWNER or ADMIN. NOTE: disabled at V3 launch — see controller-class comment / V3-TASK-P0-014.

Responses: 201 Public or optional auth

Clubs: Gamification

7 operations

GET /v2/clubs/{clubId}/leaderboard

All-time club leaderboard. Pass `sportId` query for per-sport scoping (§18.7 G-15 Phase 2). Omit for combined.

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/leaderboard/monthly

Monthly club leaderboard (§55.2). `monthKey` defaults to the current UTC month (format YYYY-MM). Banned/removed/left memberships are excluded.

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/leaderboard/weekly

Weekly club leaderboard. `weekKey` defaults to the current ISO week (format YYYY-WW). Pass `sportId` for per-sport scoping (§18.7 G-15 Phase 2).

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/member-of-the-month/detect

Member-of-the-Month detection (§55.3). Idempotent per (clubId, monthKey). Returns the winner + tie status; emits CLUB_MEMBER_OF_THE_MONTH the first time.

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/points/grants

Admin-only: list manual grant/debit history for the club. Paginated; most-recent first.

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/points/grants

Admin-only: grant/debit points to a member. Negative `points` = debit.

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/points/reverse/{entryId}

Admin-only: reverse a prior ledger entry. Writes a compensating negative row.

Responses: 201 Public or optional auth

Clubs: Tier promos

4 operations

GET /v2/clubs/{clubId}/tiers/{tierId}/promos

List promo codes for a tier. Admin-only.

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/tiers/{tierId}/promos

Create a promo code for a tier. Admin-only.

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/tiers/{tierId}/promos/{promoId}

Archive a promo code. Admin-only.

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/tiers/{tierId}/promos/quote

Quote a promo code against a tier. Returns {ok, reason, effectiveAmount?, effectivePct?}.

Responses: 200 Public or optional auth

Community Guidelines (Public)

2 operations

GET /v2/ops/community-guidelines

GET /v2/ops/community-guidelines

Responses: 200 Public or optional auth
GET /v2/ops/community-guidelines/{slug}

GET /v2/ops/community-guidelines/{slug}

Responses: 200 Public or optional auth

Content: Feed

2 operations

GET /v2/content-feed

GET /v2/content-feed

Responses: 200 Public or optional auth
GET /v2/content-feed/{id}

GET /v2/content-feed/{id}

Responses: 200 Public or optional auth

Coupons

8 operations

GET /v2/coupons

GET /v2/coupons

Responses: 200 Public or optional auth
POST /v2/coupons

POST /v2/coupons

Responses: 201 Public or optional auth
DELETE /v2/coupons/{id}

DELETE /v2/coupons/{id}

Responses: 200 Public or optional auth
GET /v2/coupons/{id}

GET /v2/coupons/{id}

Responses: 200 Public or optional auth
PATCH /v2/coupons/{id}

PATCH /v2/coupons/{id}

Responses: 200 Public or optional auth
PATCH /v2/coupons/{id}/review

PATCH /v2/coupons/{id}/review

Responses: 200 Public or optional auth
PATCH /v2/coupons/{id}/toggle

PATCH /v2/coupons/{id}/toggle

Responses: 200 Public or optional auth
GET /v2/coupons/{id}/usage

GET /v2/coupons/{id}/usage

Responses: 200 Public or optional auth

Creator Wallets

2 operations

GET /v2/wallets/creator/{ownerType}/{ownerId}

GET /v2/wallets/creator/{ownerType}/{ownerId}

Responses: 200 Public or optional auth
GET /v2/wallets/creator/{ownerType}/{ownerId}/transactions

GET /v2/wallets/creator/{ownerType}/{ownerId}/transactions

Responses: 200 Public or optional auth

CrewJoinCodes

2 operations

POST /v2/crew/join-codes/preview

POST /v2/crew/join-codes/preview

Responses: 201 Public or optional auth
POST /v2/crew/join-codes/redeem

POST /v2/crew/join-codes/redeem

Responses: 201 Public or optional auth

Discover

1 operations

GET /v2/discover/graph

Public Organizations + open Editions for Discover.

Responses: 200 Public or optional auth

Eazr Organizer Integration

3 operations

GET /v2/integrations/eazr/organizers/{organizerId}/events

List events owned by an organizer

Responses: 200 Public or optional auth
GET /v2/integrations/eazr/organizers/{organizerId}/events/{eventId}

Get one event owned by an organizer

Responses: 200 Public or optional auth
GET /v2/integrations/eazr/organizers/by-mobile

Find an organizer by mobile number

Responses: 200 Public or optional auth

Editions

10 operations

GET /v2/editions/{idOrSlug}

Edition detail (first-class; viewer-aware when authed).

Responses: 200 Public or optional auth
GET /v2/editions/{idOrSlug}/leaderboard

Edition leaderboard (separate per edition).

Responses: 200 Public or optional auth
GET /v2/editions/{idOrSlug}/leaderboard/me

The authenticated athlete's own rank in an edition leaderboard.

Responses: 200 Auth required
POST /v2/editions/{idOrSlug}/register

Register the authenticated athlete for an Edition.

Responses: 201 Auth required
POST /v2/editions/registrations/{registrationId}/verify

Verify (server-side) and confirm a paid edition registration.

Responses: 201 Auth required
POST /v2/editions/webhooks/cashfree

POST /v2/editions/webhooks/cashfree

Responses: 200 Public or optional auth
GET /v2/events/{idOrSlug}/editions

List the Editions of an Event.

Responses: 200 Public or optional auth
GET /v2/me/registrations

The authenticated athlete's Edition registrations (feeds Join).

Responses: 200 Auth required
PATCH /v2/organizers/events/{eventId}/edition

Update (create-on-demand) the event's default Edition — distance + certificate template upload.

Responses: 200 Auth required
PATCH /v2/organizers/events/{eventId}/editions/{editionId}

Update an edition (organizer). Distance + certificate today.

Responses: 200 Auth required

Event Add-Ons

6 operations

GET /v2/organizers/events/{eventId}/add-ons

Get all add-ons for an event

Responses: 200, 404 Auth required
POST /v2/organizers/events/{eventId}/add-ons

Add a product as add-on for an event

Link an existing product to an event as an add-on.

Responses: 201, 400, 404 Auth required
DELETE /v2/organizers/events/{eventId}/add-ons/{addOnId}

Delete an add-on (soft delete)

Responses: 200, 400, 404 Auth required
GET /v2/organizers/events/{eventId}/add-ons/{addOnId}

Get a single add-on by ID

Responses: 200, 404 Auth required
PUT /v2/organizers/events/{eventId}/add-ons/{addOnId}

Update an add-on

Responses: 200, 404 Auth required
PATCH /v2/organizers/events/{eventId}/add-ons/{addOnId}/toggle-status

Toggle add-on active status

Responses: 200, 404 Auth required

Event Bookings (Organizer)

9 operations

GET /v2/organizers/events/{eventId}/bookings

Get bookings for an event (filtered + paginated).

Responses: 200, 404 Auth required
GET /v2/organizers/events/{eventId}/bookings/{participationId}

Get one booking by participationId

Responses: 200, 404 Auth required
POST /v2/organizers/events/{eventId}/bookings/{participationId}/cancel

Cancel an entire booking (all participants)

Responses: 200, 400, 404 Auth required
PATCH /v2/organizers/events/{eventId}/bookings/{participationId}/checkin

Toggle check-in for every active participant in a booking (participant-modal action).

Responses: 200, 404 Auth required
PATCH /v2/organizers/events/{eventId}/bookings/{participationId}/participants/{participantId}

Update participant details

Responses: 200, 404 Auth required
POST /v2/organizers/events/{eventId}/bookings/{participationId}/participants/{participantId}/cancel

Cancel a single participant from a booking

Responses: 200, 400, 404 Auth required
POST /v2/organizers/events/{eventId}/bookings/{participationId}/participants/resend-ticket

Resend tickets for all participants in a booking

Regenerates QR codes for all active participants in the booking and sends a push notification to the user.

Responses: 201, 404 Auth required
GET /v2/organizers/events/{eventId}/bookings/{participationId}/timeline

Per-booking activity timeline (creation, cancels, refunds, transfers, deferrals).

Responses: 200, 404 Auth required
POST /v2/organizers/events/{eventId}/bookings/bulk-cancel

Bulk-cancel a set of bookings with shared reason + optional per-row overrides.

Responses: 200 Auth required

Event Bookmarks

3 operations

GET /v2/event-bookmarks/{eventId}/status

Whether the viewer has bookmarked an event

Responses: 200 Public or optional auth
POST /v2/event-bookmarks/{eventId}/toggle

Bookmark / un-bookmark an event for the viewer

Responses: 201 Public or optional auth
GET /v2/event-bookmarks/mine

Viewer's saved events, newest first

Responses: 200 Public or optional auth

Event Categories

5 operations

GET /v2/event-categories

GET /v2/event-categories

Responses: 200 Public or optional auth
POST /v2/event-categories

POST /v2/event-categories

Responses: 201 Public or optional auth
DELETE /v2/event-categories/{id}

DELETE /v2/event-categories/{id}

Responses: 200 Public or optional auth
GET /v2/event-categories/{id}

GET /v2/event-categories/{id}

Responses: 200 Public or optional auth
PATCH /v2/event-categories/{id}

PATCH /v2/event-categories/{id}

Responses: 200 Public or optional auth

Event Certificates

17 operations

GET /v2/event-participations/participants/{participantId}/certificate/download

Download my issued certificate PDF for a registration

Responses: 200 Public or optional auth
DELETE /v2/organizers/events/{eventId}/certificates

Deactivate the certificate template

Responses: 200 Auth required
GET /v2/organizers/events/{eventId}/certificates

Get the event's active certificate template

Responses: 200 Auth required
POST /v2/organizers/events/{eventId}/certificates

Create the certificate template (validates variables)

Responses: 201, 400 Auth required
PUT /v2/organizers/events/{eventId}/certificates

Update the certificate template (creates a new version)

Responses: 200 Auth required
POST /v2/organizers/events/{eventId}/certificates/assets

Upload certificate art (header logo / full-bleed background)

Returns a public URL — plug it into `headerLogo` or `backgroundImageUrl` on the create/update template call. Does not itself modify the template.

Responses: 201, 400 Auth required
GET /v2/organizers/events/{eventId}/certificates/issuances

Roster of participants with an issued certificate

Responses: 200 Auth required
GET /v2/organizers/events/{eventId}/certificates/issuances/{participantId}/download

Download a participant's issued certificate PDF

Responses: 200 Auth required
POST /v2/organizers/events/{eventId}/certificates/issuances/{participantId}/revoke

Revoke a participant's issued certificate (misprint, fraud, etc)

The issuance row is kept for audit; the participant loses download access and it drops off booking-detail reads. Reversible via unrevoke.

Responses: 201 Auth required
POST /v2/organizers/events/{eventId}/certificates/issuances/{participantId}/unrevoke

Restore a previously revoked certificate

Responses: 201 Auth required
GET /v2/organizers/events/{eventId}/certificates/not-issued

Eligible participants who do not yet have a certificate issued

Exactly who the next publish() call would issue to — eligible (joined + attended) minus already-issued for the active template.

Responses: 200 Auth required
POST /v2/organizers/events/{eventId}/certificates/publish

Publish — bulk-issue the certificate to every eligible participant

Requires the event to be COMPLETED and an active certificate template. Eligible = joined + attended (EventParticipation.participationStatus=ATTENDED). Idempotent — participants already issued a certificate for the active template version are skipped.

Responses: 400 Auth required
GET /v2/organizers/events/{eventId}/certificates/status

Publish status + eligible/issued counts

Responses: 200 Auth required
POST /v2/organizers/events/{eventId}/certificates/unpublish

Unpublish — hide certificates from participants (issuances are kept)

Responses: 201 Auth required
GET /v2/organizers/events/{eventId}/certificates/variables

Available {{ }} variables for the certificate builder

The fixed system fields (name, age, bib, event date, ...) always available from real user/event/participant data, plus the event's active registration form fields.

Responses: 200 Auth required
GET /v2/organizers/events/certificates-overview

Certificate status across every ended event the organizer owns

One row per event that has ended (COMPLETED, or a runnable status whose end time has passed) — design-ready flag, publish status, and eligible/issued counts.

Responses: 200 Auth required
GET /v2/users/me/certificates

All event certificates earned by the caller, across all events

Responses: 200 Auth required

Event Communications

6 operations

GET /v2/organizers/events/{eventId}/communications

List per-event communication templates (PRD §33.1 step 14).

Responses: 200 Auth required
POST /v2/organizers/events/{eventId}/communications

Create or upsert a per-event communication template for a given (trigger, channel).

Responses: 201 Auth required
DELETE /v2/organizers/events/{eventId}/communications/{templateId}

Soft-delete a template.

Responses: 200 Auth required
GET /v2/organizers/events/{eventId}/communications/{templateId}

Get a single communication template.

Responses: 200 Auth required
PATCH /v2/organizers/events/{eventId}/communications/{templateId}

Update an existing template.

Responses: 200 Auth required
POST /v2/organizers/events/{eventId}/communications/{templateId}/preview

Render the template against a context bag and return the substituted output + computed fire-at moment.

Responses: 201 Auth required

Event Coupons

5 operations

GET /v2/organizers/events/{eventId}/coupons

Get all coupons attached to an event

Responses: 200, 404 Auth required
POST /v2/organizers/events/{eventId}/coupons

Attach a coupon to an event

Attach an existing coupon to an event. Optionally specify which tickets it applies to.

Responses: 201, 400, 404 Auth required
DELETE /v2/organizers/events/{eventId}/coupons/{couponId}

Detach a coupon from an event

Responses: 200, 404 Auth required
GET /v2/organizers/events/{eventId}/coupons/{couponId}

Get a coupon details for an event

Responses: 200, 404 Auth required
PUT /v2/organizers/events/{eventId}/coupons/{couponId}/tickets

Update which tickets a coupon applies to

Responses: 200, 404 Auth required

Event Courses

6 operations

GET /v2/organizers/events/{eventId}/course

Get full course bundle (geometry + elevation + waypoints).

Responses: 200 Auth required
POST /v2/organizers/events/{eventId}/course

Upload GPX for an event course (PRD §33.1 step 5).

Responses: 201, 400 Auth required
GET /v2/organizers/events/{eventId}/course/waypoints

List waypoints for an event course.

Responses: 200 Auth required
POST /v2/organizers/events/{eventId}/course/waypoints

Add a waypoint to the course.

Responses: 201 Auth required
DELETE /v2/organizers/events/{eventId}/course/waypoints/{waypointId}

Remove a waypoint (soft delete).

Responses: 200 Auth required
PATCH /v2/organizers/events/{eventId}/course/waypoints/{waypointId}

Update a waypoint.

Responses: 200 Auth required

Event FAQs

6 operations

GET /v2/organizers/events/{eventId}/faqs

Get all FAQs attached to an event

Responses: 200, 404 Auth required
POST /v2/organizers/events/{eventId}/faqs

Attach a FAQ to an event

Attach an existing FAQ to an event.

Responses: 201, 400, 404 Auth required
PUT /v2/organizers/events/{eventId}/faqs

Replace all FAQs for an event

Replace all existing FAQs with a new list.

Responses: 200, 404 Auth required
DELETE /v2/organizers/events/{eventId}/faqs/{faqId}

Detach a FAQ from an event

Responses: 200, 404 Auth required
GET /v2/organizers/events/{eventId}/faqs/{faqId}

Get a single FAQ for an event

Responses: 200, 404 Auth required
POST /v2/organizers/events/{eventId}/faqs/bulk

Attach multiple FAQs to an event

Attach multiple existing FAQs to an event at once.

Responses: 201, 404 Auth required

Event Forms

7 operations

GET /v2/organizers/events/{eventId}/forms

Get all forms for an event

Responses: 200, 404 Auth required
POST /v2/organizers/events/{eventId}/forms

Create a new form for an event

Create a registration, feedback, or survey form for an event.

Responses: 201, 400, 404 Auth required
DELETE /v2/organizers/events/{eventId}/forms/{formId}

Delete a form (soft delete)

Responses: 200, 404 Auth required
GET /v2/organizers/events/{eventId}/forms/{formId}

Get a single form by ID

Responses: 200, 404 Auth required
PATCH /v2/organizers/events/{eventId}/forms/{formId}

Update a form (PATCH)

Responses: 200, 404 Auth required
PUT /v2/organizers/events/{eventId}/forms/{formId}

Update a form (PUT)

Responses: 200, 404 Auth required
PATCH /v2/organizers/events/{eventId}/forms/{formId}/toggle-status

Toggle form active status

Responses: 200, 404 Auth required

Event Participations

37 operations

GET /v2/event-participations

GET /v2/event-participations

Responses: 200 Public or optional auth
POST /v2/event-participations

POST /v2/event-participations

Responses: 201 Public or optional auth
DELETE /v2/event-participations/{id}

DELETE /v2/event-participations/{id}

Responses: 200 Public or optional auth
GET /v2/event-participations/{id}

GET /v2/event-participations/{id}

Responses: 200 Public or optional auth
PATCH /v2/event-participations/{id}

PATCH /v2/event-participations/{id}

Responses: 200 Public or optional auth
POST /v2/event-participations/{id}/resume-payment

Resume payment for an existing pending participation

Issues a fresh Cashfree payment session on an existing PENDING participation so the buyer can retry after cancelling / a decline, without creating a duplicate participation. Refuses if the booking is no longer pending or is already paid.

Responses: 201 Public or optional auth
PATCH /v2/event-participations/{participationId}/participants/{participantId}/self-edit

§35.4 — athlete edits own participant details (t-shirt, emergency contact, medical info, form answers). Gated by the organizer's self-service policy.

Responses: 200 Public or optional auth
PUT /v2/event-participations/addons/{addOnId}/collect

Mark addon product as collected

Responses: 200 Public or optional auth
POST /v2/event-participations/assign-booking-id/{participantId}

Assign booking ID to a participant (one-time migration API)

Dev/migration helper. Disabled in production.

Responses: 201 Public or optional auth
POST /v2/event-participations/assign-booking-ids-all

Assign booking IDs to all participants without one (one-time migration API)

Dev/migration helper. Disabled in production.

Responses: 201 Public or optional auth
GET /v2/event-participations/by-event/{eventId}

GET /v2/event-participations/by-event/{eventId}

Responses: 200 Public or optional auth
PUT /v2/event-participations/check-in/{participantId}

Check-in participant by participant ID

Responses: 200 Public or optional auth
PUT /v2/event-participations/check-in/by-booking/{eventId}

Check-in participant by last 7 digits of booking ID

Enter only the last 7 digits of the booking ID to check-in a participant

Responses: 200 Public or optional auth
POST /v2/event-participations/deferrals

§20.9 — request a registration deferral.

Responses: 201 Public or optional auth
DELETE /v2/event-participations/deferrals/{deferralId}

§20.9 — cancel a pending deferral request (requester only).

Responses: 200 Public or optional auth
POST /v2/event-participations/deferrals/{deferralId}/fulfil

§20.9 — fulfil a REQUESTED deferral (organizer/admin scope).

Responses: 201 Public or optional auth
POST /v2/event-participations/deferrals/{deferralId}/issue-comp

§20.9 — auto-issue a complimentary participation on the target event and fulfil the deferral.

Responses: 201 Public or optional auth
POST /v2/event-participations/deferrals/{deferralId}/reject

§20.9 — reject a REQUESTED deferral (organizer/admin scope).

Responses: 201 Public or optional auth
GET /v2/event-participations/deferrals/mine

§20.9 — list the athlete's deferral requests.

Responses: 200 Public or optional auth
GET /v2/event-participations/deferrals/pending

§20.9 — list REQUESTED deferrals (organizer/admin scope).

Responses: 200 Public or optional auth
POST /v2/event-participations/events/{eventId}/form-uploads

Upload a file answer (e.g. ID proof) for a registration form

Stores the uploaded document and returns its public URL. Submit that URL as the file field's `values` when creating the participation. The file is validated against the target form field's accept (MIME) and maxSizeMB rules.

Responses: 201 Public or optional auth
POST /v2/event-participations/preview

Preview billing breakdown for event participation

Calculates and returns billing breakdown without creating any records. Use this before the create endpoint.

Responses: 201 Public or optional auth
POST /v2/event-participations/public/preview

Public preview billing breakdown for event participation

Calculates and returns billing breakdown without auth. Coins/wallet features are not available in public preview.

Responses: 201 Public or optional auth
POST /v2/event-participations/reassign-all-booking-ids

Reassign ALL booking IDs from scratch (fixes duplicates, use with caution)

Dev/migration helper. Disabled in production.

Responses: 201 Public or optional auth
POST /v2/event-participations/reassign-event-booking-ids/{eventId}

Reassign booking IDs for a specific event starting from a custom number

Dev/migration helper. Disabled in production.

Responses: 201 Public or optional auth
POST /v2/event-participations/test-check-in

Test API: Bulk check-in/check-out participants by IDs

Dev/test helper for bulk participant check-in. Disabled in production.

Responses: 201 Public or optional auth
POST /v2/event-participations/transfers

§20.8 — initiate a registration transfer.

Responses: 201 Public or optional auth
DELETE /v2/event-participations/transfers/{transferId}

§20.8 — cancel an outgoing transfer offer (originator only).

Responses: 200 Public or optional auth
POST /v2/event-participations/transfers/{transferId}/accept

§20.8 — accept a transfer offered to your email.

Responses: 201 Public or optional auth
POST /v2/event-participations/transfers/{transferId}/reject

§20.8 — reject a transfer offer (recipient or originator).

Responses: 201 Public or optional auth
GET /v2/event-participations/transfers/by-token/{token}

§20.8 — public-safe lookup of a pending transfer by invite token.

Responses: 200 Public or optional auth
POST /v2/event-participations/transfers/by-token/{token}/accept

§20.8 — accept a transfer invite by token (post sign-up flow).

Responses: 201 Public or optional auth
GET /v2/event-participations/transfers/mine

§20.8 — list the athlete's outgoing + incoming transfer offers.

Responses: 200 Public or optional auth
POST /v2/event-participations/waitlist

§20.7 — join the waitlist for a ticket on an event.

Responses: 201 Public or optional auth
DELETE /v2/event-participations/waitlist/{entryId}

§20.7 — cancel an active waitlist entry (owner only).

Responses: 200 Public or optional auth
GET /v2/event-participations/waitlist/mine

§20.7 — list the athlete's active waitlist entries.

Responses: 200 Public or optional auth
GET /v2/event-participations/waitlist/position

§20.7 — read the athlete's queue position for a ticket.

Responses: 200 Public or optional auth

Event Prizes

12 operations

GET /v2/events/{eventId}/prizes

An event's prize leaderboards (public/athlete view)

Responses: 200 Public or optional auth
GET /v2/events/{eventId}/prizes/winners

An event's published prize winners (public/athlete view)

Returns only PUBLISHED winners per leaderboard, with a public winner projection (name / username / photo). Empty until the organizer publishes.

Responses: 200 Public or optional auth
GET /v2/organizers/events/{eventId}/prizes

Read an event's prize leaderboards (organizer editor)

Responses: 200 Auth required
PUT /v2/organizers/events/{eventId}/prizes

Replace all prize leaderboards for an event

Send `segments` as a JSON string (array of up to 6 leaderboards) plus one file per product prize in field `prizeProductImage_<segmentIndex>_<slabIndex>`. Accepted sponsor goodies are NOT in `segments` and are carried across automatically; if one can no longer be placed the save is refused (400) naming the brand and rank. Re-send with `dropSponsorContributionIds` to drop such a goodie on purpose — that rejects the brand’s accepted contribution.

Responses: 200, 400 Auth required
GET /v2/organizers/events/{eventId}/prizes/contributions

List sponsor goodie contributions for the event

Each row carries the proposing brand's `sponsorBrandName` / `sponsorBrandLogoUrl` (public identity only) so the owner can tell whose goodie they are judging.

Responses: 200 Auth required
PATCH /v2/organizers/events/{eventId}/prizes/contributions/{contributionId}/accept

Accept a sponsor goodie onto a prize rank

Attaches a sponsor-attributed product to the slab covering the target rank (optionally re-targeted). Creates the leaderboard + slab when the event has none.

Responses: 200 Auth required
PATCH /v2/organizers/events/{eventId}/prizes/contributions/{contributionId}/reject

Reject a sponsor goodie contribution

Responses: 200 Auth required
POST /v2/organizers/events/{eventId}/prizes/distribute

Distribute prizes to the announced winners

Pays cash/coins to winners’ wallets, ledgers organizer goodies as pending shipping, and fulfils sponsor goodies via the brand. Idempotent.

Responses: 201 Auth required
GET /v2/organizers/events/{eventId}/prizes/results

Read the announced rank winners

Responses: 200 Auth required
PUT /v2/organizers/events/{eventId}/prizes/results

Announce rank winners for each prize leaderboard

In-person events cannot auto-measure; the organizer declares one or more winners for each rank per segment. Fully replaces the prior set.

Responses: 200 Auth required
POST /v2/organizers/events/{eventId}/prizes/results/publish

Publish the announced winners

Makes the announced winners public (visible on GET /v2/events/:id/prizes/winners) and eligible for distribution.

Responses: 201 Auth required
POST /v2/organizers/events/{eventId}/prizes/results/unpublish

Unpublish the winners (revert to draft)

Hides winners publicly again; they remain saved as a draft.

Responses: 201 Auth required

Event Slots

6 operations

GET /v2/organizers/events/{eventId}/slots

Get all slots for an event

Responses: 200, 404 Auth required
POST /v2/organizers/events/{eventId}/slots

Create a new slot for an event

Create a slot with or without tickets. Tickets can be added later.

Responses: 201, 400, 404 Auth required
DELETE /v2/organizers/events/{eventId}/slots/{slotId}

Delete a slot (soft delete)

Responses: 200, 400, 404 Auth required
GET /v2/organizers/events/{eventId}/slots/{slotId}

Get a single slot by ID

Responses: 200, 404 Auth required
PUT /v2/organizers/events/{eventId}/slots/{slotId}

Update a slot

Responses: 200, 404 Auth required
PATCH /v2/organizers/events/{eventId}/slots/{slotId}/toggle-status

Toggle slot active status

Responses: 200, 404 Auth required

Event Sponsors

1 operations

GET /v2/organizers/events/{eventId}/sponsors

An event's sponsoring brands (committed deals).

Responses: 200 Public or optional auth

Event Ticket Sales (Organizer)

2 operations

GET /v2/organizers/events/{eventId}/ticket-sales/slot-wise

Slot-wise ticket-sales breakdown: each slot → its tickets (with per-ticket sold counts) → the participant list, drillable to full order + payment detail.

Responses: 200, 404 Auth required
GET /v2/organizers/events/{eventId}/ticket-sales/ticket-wise

Ticket-wise ticket-sales breakdown: each ticket (with its slot) → sold count → the participant list, drillable to full order + payment detail.

Responses: 200, 404 Auth required

Event Tickets

6 operations

GET /v2/organizers/events/{eventId}/slots/{slotId}/tickets

Get all tickets for a slot

Responses: 200, 404 Auth required
POST /v2/organizers/events/{eventId}/slots/{slotId}/tickets

Create a new ticket for a slot

Responses: 201, 400, 404 Auth required
DELETE /v2/organizers/events/{eventId}/slots/{slotId}/tickets/{ticketId}

Delete a ticket (soft delete)

Responses: 200, 400, 404 Auth required
GET /v2/organizers/events/{eventId}/slots/{slotId}/tickets/{ticketId}

Get a single ticket by ID

Responses: 200, 404 Auth required
PUT /v2/organizers/events/{eventId}/slots/{slotId}/tickets/{ticketId}

Update a ticket

Responses: 200, 404 Auth required
PATCH /v2/organizers/events/{eventId}/slots/{slotId}/tickets/{ticketId}/toggle-status

Toggle ticket active status

Responses: 200, 404 Auth required

Event Waiver

8 operations

GET /v2/event-participations/participants/{participantId}/waiver/download

Download my filled waiver PDF for a registration

Responses: 200 Public or optional auth
DELETE /v2/organizers/events/{eventId}/waiver

Deactivate the waiver (untick "Add waiver")

Responses: 200 Auth required
GET /v2/organizers/events/{eventId}/waiver

Get the event's active waiver template

Responses: 200 Auth required
POST /v2/organizers/events/{eventId}/waiver

Create the waiver (validates variables)

Responses: 201, 400 Auth required
PUT /v2/organizers/events/{eventId}/waiver

Update the waiver (creates a new version)

Responses: 200 Auth required
GET /v2/organizers/events/{eventId}/waiver/acceptances

List participants who accepted the waiver

Responses: 200 Auth required
GET /v2/organizers/events/{eventId}/waiver/acceptances/{participantId}/download

Download a participant's filled waiver PDF

Responses: 200 Auth required
GET /v2/organizers/events/{eventId}/waiver/available-variables

Registration form field names insertable into the waiver

The ONLY variables the waiver builder may insert. Derived from the event's active registration form.

Responses: 200 Auth required

Events

41 operations

GET /v2/events

Get all events

Retrieve events based on user role with optional filtering by status and timeframe

Responses: 200, 400, 401 Auth required
POST /v2/events

Create a new event

Create a new event with cover images and all related data including slots, tickets, location, etc.

Responses: 201, 400, 401, 403, 500 Auth required
GET /v2/events/{eventId}/course/waypoints

GET /v2/events/{eventId}/course/waypoints

Responses: 200 Auth required
GET /v2/events/{eventId}/marketing-summary

GET /v2/events/{eventId}/marketing-summary

Responses: 200 Auth required
GET /v2/events/{eventId}/photo-summary

GET /v2/events/{eventId}/photo-summary

Responses: 200 Auth required
GET /v2/events/{eventId}/refund-policy

GET /v2/events/{eventId}/refund-policy

Responses: 200 Auth required
GET /v2/events/{eventId}/roster.csv

GET /v2/events/{eventId}/roster.csv

Responses: 200 Auth required
GET /v2/events/{eventId}/series

GET /v2/events/{eventId}/series

Responses: 200 Auth required
DELETE /v2/events/{id}

Soft-delete an event (only when it has no participants)

Deletes the event (soft-remove) for an admin, or the owning organizer. Allowed ONLY when the event has zero active participants (cancelled registrations are ignored). If any active registration exists, returns 400 — cancel the event instead.

Responses: 200 Auth required
GET /v2/events/{id}

Get event by ID

Retrieve a single event with all its details based on user role

Responses: 200, 401, 404 Auth required
PATCH /v2/events/{id}

Update an event

Update an existing event with optional new cover images. Organizers can only update their own events.

Responses: 200, 400, 403, 404, 500 Auth required
POST /v2/events/{id}/announcements

Send event announcement

Send an announcement to all participants of a specific event. The announcement will be saved to the event and push notifications will be sent to all participants.

Responses: 201, 400, 401, 403, 404, 500 Auth required
POST /v2/events/{id}/cancel

Cancel event

Cancel a published event. Initiates refunds for all paid bookings, cancels free bookings, and marks the event as cancelled.

Responses: 201, 400, 404 Auth required
PATCH /v2/events/{id}/desktop-cover

Update event desktop cover image

Updates the desktop cover image for an event. The old image is deleted from S3.

Responses: 200, 400, 403, 404 Auth required
PATCH /v2/events/{id}/mobile-cover

Update event mobile cover image

Updates the mobile cover image for an event. The old image is deleted from S3.

Responses: 200, 400, 403, 404 Auth required
GET /v2/events/{id}/readiness

GET /v2/events/{id}/readiness

Responses: 200 Auth required
POST /v2/events/{id}/results/publish

POST /v2/events/{id}/results/publish

Responses: 201 Auth required
GET /v2/events/{id}/results/state

GET /v2/events/{id}/results/state

Responses: 200 Auth required
POST /v2/events/{id}/results/unpublish

POST /v2/events/{id}/results/unpublish

Responses: 201 Auth required
PATCH /v2/events/{id}/review

Review an event (Admin only)

Approve or reject an event and provide review feedback

Responses: 200, 403, 404 Auth required
PATCH /v2/events/{id}/submit-for-approval

PATCH /v2/events/{id}/submit-for-approval

Responses: 200 Auth required
PATCH /v2/events/{id}/toggle

PATCH /v2/events/{id}/toggle

Responses: 200 Auth required
PATCH /v2/events/{id}/toggle-bookings

Toggle event bookings

Toggle ticket bookings for an event. When stopped, the event is no longer visible to users in the app. When started, the event becomes visible again.

Responses: 200, 400, 404 Auth required
PATCH /v2/events/{id}/unpublish

PATCH /v2/events/{id}/unpublish

Responses: 200 Auth required
GET /v2/events/{idOrSlug}/public

GET /v2/events/{idOrSlug}/public

Responses: 200 Auth required
GET /v2/events/by-city/{city}

GET /v2/events/by-city/{city}

Responses: 200 Auth required
GET /v2/events/by-country/{country}

GET /v2/events/by-country/{country}

Responses: 200 Auth required
GET /v2/events/by-slug/{slug}

GET /v2/events/by-slug/{slug}

Responses: 200 Auth required
GET /v2/events/discover

GET /v2/events/discover

Responses: 200 Auth required
GET /v2/events/featured

Get all events

Retrieve events based on user role with optional filtering by status and timeframe

Responses: 200, 400, 401 Auth required
POST /v2/events/featured

Update featured status for multiple events

Allows admins and organizers to feature or unfeature multiple events at once

Responses: 200 Auth required
GET /v2/events/featured/public

GET /v2/events/featured/public

Responses: 200 Auth required
GET /v2/events/finance-truth/participation/{participationId}

GET /v2/events/finance-truth/participation/{participationId}

Responses: 200 Auth required
GET /v2/events/finance-truth/refund/{refundId}

GET /v2/events/finance-truth/refund/{refundId}

Responses: 200 Auth required
GET /v2/events/finance-truth/reward-pool/{poolId}

GET /v2/events/finance-truth/reward-pool/{poolId}

Responses: 200 Auth required
GET /v2/events/portal-readiness/{kind}/{id}

GET /v2/events/portal-readiness/{kind}/{id}

Responses: 200 Auth required
GET /v2/events/public

GET /v2/events/public

Responses: 200 Auth required
GET /v2/events/public-visibility/{kind}/{id}

GET /v2/events/public-visibility/{kind}/{id}

Responses: 200 Auth required
GET /v2/events/public/feed

Public event discovery feed

Discovery-grade list of public events (published/open/live/completed) using the same allowlist as public event detail. Never leaks draft/cancelled/private/test events.

Responses: 200 Auth required
POST /v2/events/video-uploads

POST /v2/events/video-uploads

Responses: 201 Auth required
POST /v2/events/video-uploads/cleanup

POST /v2/events/video-uploads/cleanup

Responses: 201 Auth required

Events: Certificate

2 operations

GET /v2/events/{eventId}/certificate/me

GET /v2/events/{eventId}/certificate/me

Responses: 200 Public or optional auth
GET /v2/events/{eventId}/finisher-card/{userId}.svg

GET /v2/events/{eventId}/finisher-card/{userId}.svg

Responses: 200 Public or optional auth

Events: Digital Bibs

7 operations

GET /v2/b/{slug}

GET /v2/b/{slug}

Responses: 200 Public or optional auth
GET /v2/events/{eventId}/bibs/me

GET /v2/events/{eventId}/bibs/me

Responses: 200 Public or optional auth
PATCH /v2/events/{eventId}/bibs/me

PATCH /v2/events/{eventId}/bibs/me

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/bibs/issue

POST /v2/organizer/events/{eventId}/bibs/issue

Responses: 201 Public or optional auth
GET /v2/organizer/events/{eventId}/bibs/roster

GET /v2/organizer/events/{eventId}/bibs/roster

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/participants/{participantId}/bib/reissue

POST /v2/organizer/events/{eventId}/participants/{participantId}/bib/reissue

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/participants/{participantId}/bib/revoke

POST /v2/organizer/events/{eventId}/participants/{participantId}/bib/revoke

Responses: 201 Public or optional auth

Events: Medals

3 operations

GET /v2/events/{eventId}/medals/top

GET /v2/events/{eventId}/medals/top

Responses: 200 Public or optional auth
GET /v2/users/{userId}/medals

GET /v2/users/{userId}/medals

Responses: 200 Public or optional auth
GET /v2/users/me/medals

GET /v2/users/me/medals

Responses: 200 Public or optional auth

Explore

4 operations

GET /v2/explore

Authenticated explore surface — trending hashtags, suggested athletes, upcoming events, trending clubs, open virtual runs.

Responses: 200 Public or optional auth
GET /v2/explore/marquee

§28 — upcoming marquee events (featured flag).

Responses: 200 Public or optional auth
GET /v2/explore/public

Public explore surface. Same carousels minus the per-user suggestedAthletes lane.

Responses: 200 Public or optional auth
GET /v2/explore/trending

§28 — events + clubs trending in the supplied city (or city-agnostic when omitted).

Responses: 200 Public or optional auth

Form Fields

5 operations

GET /v2/form-fields

GET /v2/form-fields

Responses: 200 Public or optional auth
POST /v2/form-fields

POST /v2/form-fields

Responses: 201 Public or optional auth
DELETE /v2/form-fields/{id}

DELETE /v2/form-fields/{id}

Responses: 200 Public or optional auth
GET /v2/form-fields/{id}

GET /v2/form-fields/{id}

Responses: 200 Public or optional auth
PATCH /v2/form-fields/{id}

PATCH /v2/form-fields/{id}

Responses: 200 Public or optional auth

Forms

6 operations

GET /v2/form

GET /v2/form

Responses: 200 Public or optional auth
POST /v2/form

POST /v2/form

Responses: 201 Public or optional auth
DELETE /v2/form/{id}

DELETE /v2/form/{id}

Responses: 200 Public or optional auth
GET /v2/form/{id}

GET /v2/form/{id}

Responses: 200 Public or optional auth
PUT /v2/form/{id}

PUT /v2/form/{id}

Responses: 200 Public or optional auth
PATCH /v2/form/{id}/toggle

PATCH /v2/form/{id}/toggle

Responses: 200 Public or optional auth

Frequently Asked Questions

7 operations

GET /v2/frequently-asked-questions

GET /v2/frequently-asked-questions

Responses: 200 Auth required
POST /v2/frequently-asked-questions

POST /v2/frequently-asked-questions

Responses: 201 Auth required
DELETE /v2/frequently-asked-questions/{id}

DELETE /v2/frequently-asked-questions/{id}

Responses: 200 Auth required
GET /v2/frequently-asked-questions/{id}

GET /v2/frequently-asked-questions/{id}

Responses: 200 Auth required
PATCH /v2/frequently-asked-questions/{id}

PATCH /v2/frequently-asked-questions/{id}

Responses: 200 Auth required
PATCH /v2/frequently-asked-questions/{id}/review

PATCH /v2/frequently-asked-questions/{id}/review

Responses: 200 Auth required
PATCH /v2/frequently-asked-questions/{id}/toggle

PATCH /v2/frequently-asked-questions/{id}/toggle

Responses: 200 Auth required

Gear Types

5 operations

GET /v2/gear-types

GET /v2/gear-types

Responses: 200 Public or optional auth
POST /v2/gear-types

POST /v2/gear-types

Responses: 201 Public or optional auth
DELETE /v2/gear-types/{id}

DELETE /v2/gear-types/{id}

Responses: 200 Public or optional auth
GET /v2/gear-types/{id}

GET /v2/gear-types/{id}

Responses: 200 Public or optional auth
PATCH /v2/gear-types/{id}

PATCH /v2/gear-types/{id}

Responses: 200 Public or optional auth

Gears

5 operations

GET /v2/gears

GET /v2/gears

Responses: 200 Public or optional auth
POST /v2/gears

POST /v2/gears

Responses: 201 Public or optional auth
DELETE /v2/gears/{id}

DELETE /v2/gears/{id}

Responses: 200 Public or optional auth
GET /v2/gears/{id}

GET /v2/gears/{id}

Responses: 200 Public or optional auth
PATCH /v2/gears/{id}

PATCH /v2/gears/{id}

Responses: 200 Public or optional auth

Geo

2 operations

GET /v2/geo/reverse

Reverse geocode a lat/lng to an address.

Responses: 200 Public or optional auth
GET /v2/geo/search

Forward geocode an address query (autocomplete).

Responses: 200 Public or optional auth

Hub Portal

2 operations

POST /v2/hub/activation-token

Mint a short-lived (60s) activation token for a product+entity the caller has (or just created) a membership on.

Responses: 201 Public or optional auth
POST /v2/hub/activation-token/exchange

Exchange an activation token for a real session on the destination portal.

Responses: 200 Public or optional auth

Hybrid Race (Public)

6 operations

GET /v2/race/results/{resultId}/certificate

GET /v2/race/results/{resultId}/certificate

Responses: 200 Public or optional auth
GET /v2/race/results/{resultId}/certificate.pdf

GET /v2/race/results/{resultId}/certificate.pdf

Responses: 200 Public or optional auth
GET /v2/race/results/{resultId}/finisher-card.svg

GET /v2/race/results/{resultId}/finisher-card.svg

Responses: 200 Public or optional auth
GET /v2/race/results/{resultId}/public

GET /v2/race/results/{resultId}/public

Responses: 200 Public or optional auth
GET /v2/race/results/{resultId}/verify

GET /v2/race/results/{resultId}/verify

Responses: 200 Public or optional auth
GET /v2/race/results/this-week/list

GET /v2/race/results/this-week/list

Responses: 200 Public or optional auth

Hybrid Race (User)

13 operations

POST /v2/hybrid-race/{eventId}/checkpoint

POST /v2/hybrid-race/{eventId}/checkpoint

Responses: 201 Public or optional auth
POST /v2/hybrid-race/{eventId}/finish

POST /v2/hybrid-race/{eventId}/finish

Responses: 201 Public or optional auth
GET /v2/hybrid-race/{eventId}/leaderboard

GET /v2/hybrid-race/{eventId}/leaderboard

Responses: 200 Public or optional auth
GET /v2/hybrid-race/{eventId}/live-position

GET /v2/hybrid-race/{eventId}/live-position

Responses: 200 Public or optional auth
POST /v2/hybrid-race/{eventId}/live-position

POST /v2/hybrid-race/{eventId}/live-position

Responses: 201 Public or optional auth
POST /v2/hybrid-race/{eventId}/local-routes/suggest

POST /v2/hybrid-race/{eventId}/local-routes/suggest

Responses: 201 Public or optional auth
GET /v2/hybrid-race/{eventId}/near-pace

GET /v2/hybrid-race/{eventId}/near-pace

Responses: 200 Public or optional auth
POST /v2/hybrid-race/{eventId}/photo-check/{photoCheckId}/appeal

POST /v2/hybrid-race/{eventId}/photo-check/{photoCheckId}/appeal

Responses: 201 Public or optional auth
POST /v2/hybrid-race/{eventId}/photo-check/{photoCheckId}/skip

POST /v2/hybrid-race/{eventId}/photo-check/{photoCheckId}/skip

Responses: 201 Public or optional auth
POST /v2/hybrid-race/{eventId}/photo-check/{photoCheckId}/submit

POST /v2/hybrid-race/{eventId}/photo-check/{photoCheckId}/submit

Responses: 201 Public or optional auth
POST /v2/hybrid-race/{eventId}/photo-check/init

POST /v2/hybrid-race/{eventId}/photo-check/init

Responses: 201 Public or optional auth
GET /v2/hybrid-race/{eventId}/photo-check/state

GET /v2/hybrid-race/{eventId}/photo-check/state

Responses: 200 Public or optional auth
POST /v2/hybrid-race/{eventId}/start

POST /v2/hybrid-race/{eventId}/start

Responses: 201 Public or optional auth

Integrations: Shiprocket

1 operations

POST /v2/integrations/shiprocket/webhook

Shiprocket status update webhook. Verifies x-api-key against SHIPROCKET_WEBHOOK_TOKEN. Tries goodies, RC Store redemptions, challenge rewards, and ambassador deals in turn — one dashboard webhook URL covers every shipment source.

Responses: 200 Public or optional auth

Integrations: Stream

2 operations

GET /v2/integrations/stream/status

Adapter health — enabled flag + region. Does not hit Stream upstream.

Responses: 200 Public or optional auth
GET /v2/integrations/stream/tokens

Mint short-lived Stream Feeds + Stream Chat tokens for the caller. 503 when Stream is not configured.

Responses: 200 Public or optional auth

InternalMediaModeration

2 operations

POST /v2/internal/media/moderation/process

POST /v2/internal/media/moderation/process

Responses: 201 Public or optional auth
POST /v2/internal/media/moderation/storage-finalized

POST /v2/internal/media/moderation/storage-finalized

Responses: 201 Public or optional auth

Leaderboards

6 operations

GET /v2/leaderboards

GET /v2/leaderboards

Responses: 200 Public or optional auth
GET /v2/leaderboards/{id}/entries

GET /v2/leaderboards/{id}/entries

Responses: 200 Public or optional auth
GET /v2/leaderboards/{id}/entries/filtered

GET /v2/leaderboards/{id}/entries/filtered

Responses: 200 Public or optional auth
GET /v2/leaderboards/{id}/entries/for-me

GET /v2/leaderboards/{id}/entries/for-me

Responses: 200 Public or optional auth
GET /v2/leaderboards/{id}/user/{userId}

GET /v2/leaderboards/{id}/user/{userId}

Responses: 200 Public or optional auth
POST /v2/leaderboards/admin/ingest

POST /v2/leaderboards/admin/ingest

Responses: 201 Public or optional auth

Linked club and organizer accounts

2 operations

POST /v2/club-organizer-accounts

Create or complete one linked club + organizer account pair

Responses: 201 Public or optional auth
POST /v2/club-organizer-accounts/repair

Idempotently create and link the missing side of a legacy Club + Organizer account pair

Responses: 201 Public or optional auth

ManagerCrewJoinCodes

4 operations

GET /v2/orgs/{orgId}/crew-join-codes

GET /v2/orgs/{orgId}/crew-join-codes

Responses: 200 Public or optional auth
POST /v2/orgs/{orgId}/crew-join-codes

POST /v2/orgs/{orgId}/crew-join-codes

Responses: 201 Public or optional auth
PATCH /v2/orgs/{orgId}/crew-join-codes/{id}

PATCH /v2/orgs/{orgId}/crew-join-codes/{id}

Responses: 200 Public or optional auth
POST /v2/orgs/{orgId}/crew-join-codes/{id}/revoke

POST /v2/orgs/{orgId}/crew-join-codes/{id}/revoke

Responses: 201 Public or optional auth

Master Events: Webhooks

1 operations

POST /v2/master-events/webhooks/cashfree

POST /v2/master-events/webhooks/cashfree

Responses: 200 Public or optional auth

Me: Activity Tracking Preferences

4 operations

GET /v2/me/activity-tracking-preferences

Get my Activity Tracking preferences (PRD §30.1).

Responses: 200 Public or optional auth
PATCH /v2/me/activity-tracking-preferences

Update Activity Tracking preferences. Partial — only fields present in the body are written.

Responses: 200 Public or optional auth
GET /v2/users/{userId}/activities/tracking-preferences

Get Activity Tracking preferences by userId (mobile alias for /v2/me/activity-tracking-preferences).

Responses: 200 Public or optional auth
PATCH /v2/users/{userId}/activities/tracking-preferences

Update Activity Tracking preferences by userId (mobile alias for PATCH /v2/me/activity-tracking-preferences).

Responses: 200 Public or optional auth

Me: Brand-reward read surfaces

2 operations

GET /v2/me/coupons

List my assigned coupon codes

Responses: 200 Public or optional auth
GET /v2/me/fulfillment-tasks

List my fulfillment tasks (merch / concierge rewards)

Responses: 200 Public or optional auth

Me: DPDP data rights

9 operations

GET /v2/me/consent

Return current consent state for every tracked purpose + the policy version the client should show.

Responses: 200 Public or optional auth
POST /v2/me/consent

Grant or withdraw a single consent. Idempotent (no-op when current state already matches).

Responses: 201 Public or optional auth
POST /v2/me/consent/bulk

Bulk set consent (e.g. for initial signup defaults or a mass-toggle in settings).

Responses: 201 Public or optional auth
GET /v2/me/consent/history

Append-only history for one or all purposes. Filter with ?purpose=MARKETING_EMAIL.

Responses: 200 Public or optional auth
POST /v2/me/data-erasure

Create a DPDP §12 erasure request. PII is scrambled immediately; hard-delete runs after the cool-off window elapses + legal-hold review.

Responses: 201 Public or optional auth
GET /v2/me/data-erasure/active

Active erasure request for the caller (REQUESTED or CONFIRMED). Returns null when none in flight. Backend-backed alternative to the per-tab sessionStorage workaround the clients used to use.

Responses: 200 Public or optional auth
POST /v2/me/data-erasure/cancel/{requestId}

Cancel an erasure request that is still within its cool-off window.

Responses: 201 Public or optional auth
POST /v2/me/data-export

Export all PII + activity data for the authenticated principal. Audit-logged. Returns JSON by default; ?format=csv returns a CSV blob (RFC 4180); ?delivery=email sends a Postmark email with a 24-hour signed-URL download link (G-30-13b) — the response shrinks to a small JSON envelope `{ delivery: "email", expiresAt }` on success or `{ delivery: "fallback", reason }` when email is honest-disabled (response body still contains the inline JSON/CSV).

Responses: 201 Public or optional auth
POST /v2/me/medical-info/erase

Erase medical-info fields (emergency contact, etc.) for the calling athlete. Preserves consent records.

Responses: 201 Public or optional auth

Me: Live tracking sharing

4 operations

POST /v2/me/live-tracking-shares

Create a live-tracking share. Up to 5 recipients per share, max 3 active per athlete, max 20 invites/24h.

Responses: 201 Public or optional auth
POST /v2/me/live-tracking-shares/{shareId}/cancel

Cancel a live-tracking share. ACTIVE → CANCELLED. Recipients see "sharing stopped" within ~5 seconds.

Responses: 200 Public or optional auth
GET /v2/me/live-tracking-shares/{shareId}/recipients

List recipients of a share for the athlete's "who's watching" view. Excludes access-token hashes.

Responses: 200 Public or optional auth
GET /v2/me/live-tracking-shares/active

List the caller athlete's ACTIVE live-tracking shares.

Responses: 200 Public or optional auth

Me: Organizer memberships

2 operations

GET /v2/me/organizer-memberships

GET /v2/me/organizer-memberships

Responses: 200 Public or optional auth
POST /v2/me/organizer-memberships/{id}/accept

POST /v2/me/organizer-memberships/{id}/accept

Responses: 201 Public or optional auth

Me: Prize tax

4 operations

GET /v2/me/form-16a

Form 16A certificates for the caller (194-B section). Filter by FY.

Responses: 200 Public or optional auth
GET /v2/me/prize-tax

List prize-tax rows for the caller.

Responses: 200 Public or optional auth
GET /v2/me/prize-tax/{id}

Fetch a single prize-tax row by id.

Responses: 200 Public or optional auth
POST /v2/me/prize-tax/{id}/acknowledge

Winner acknowledgement — moves a CALCULATED row to TDS_DEDUCTED.

Responses: 201 Public or optional auth

Me: Series Passes

4 operations

GET /v2/me/series-passes

List the authenticated athlete's series-pass registrations.

Responses: 200 Auth required
POST /v2/me/series-passes/{passId}/register

Register the athlete for a published series pass (idempotent per (passId, athleteUserId)).

Responses: 201 Auth required
DELETE /v2/me/series-passes/{passId}/registration

Cancel the athlete's registration for this pass.

Responses: 200 Auth required
GET /v2/me/series-passes/entitlement

Check whether the authenticated athlete holds a series-pass entitlement covering this event.

Responses: 200 Auth required

MediaDelivery

1 operations

GET /v2/media/content/{token}

GET /v2/media/content/{token}

Responses: 200 Public or optional auth

Memory Monitoring

3 operations

POST /memory/gc

Force garbage collection

Responses: 201 Public or optional auth
GET /memory/test-leak

Test memory leak detection with heap diff

Responses: 200 Public or optional auth
GET /memory/usage

Get current memory usage

Responses: 200 Public or optional auth

Notification Studio - Promotions

4 operations

POST /v2/promotion-studio/{workspaceType}/{workspaceId}/estimate

POST /v2/promotion-studio/{workspaceType}/{workspaceId}/estimate

Responses: 201 Auth required
GET /v2/promotion-studio/{workspaceType}/{workspaceId}/history

GET /v2/promotion-studio/{workspaceType}/{workspaceId}/history

Responses: 200 Auth required
POST /v2/promotion-studio/{workspaceType}/{workspaceId}/send

POST /v2/promotion-studio/{workspaceType}/{workspaceId}/send

Responses: 201 Auth required
GET /v2/promotion-studio/{workspaceType}/{workspaceId}/templates

GET /v2/promotion-studio/{workspaceType}/{workspaceId}/templates

Responses: 200 Auth required

Notification System - Webhooks

3 operations

POST /v2/notification-webhooks/msg91

POST /v2/notification-webhooks/msg91

Responses: 200 Public or optional auth
POST /v2/notification-webhooks/wallet-topup

POST /v2/notification-webhooks/wallet-topup

Responses: 200 Public or optional auth
POST /v2/notification-webhooks/whatsapp

POST /v2/notification-webhooks/whatsapp

Responses: 200 Public or optional auth

Notifications

12 operations

GET /v2/notifications

Fetch notification of all users.

Only admins can fetch all notifications from db.

Responses: 200 Public or optional auth
POST /v2/notifications

Send notification to all users.

Only admins can send notifications to all users.

Responses: 201 Public or optional auth
PATCH /v2/notifications/{id}

Mark notification as seen.

Responses: 200 Public or optional auth
GET /v2/notifications/preferences

Athlete's unified notification preferences (per-type, per-channel, quiet hours, channel support).

Responses: 200 Public or optional auth
PATCH /v2/notifications/preferences

Patch the caller athlete preferences. Body fields are independent — pass only what changes.

Responses: 200 Public or optional auth
DELETE /v2/notifications/preferences-types

DELETE /v2/notifications/preferences-types

Responses: 200 Public or optional auth
GET /v2/notifications/preferences-types

GET /v2/notifications/preferences-types

Responses: 200 Public or optional auth
POST /v2/notifications/preferences-types

POST /v2/notifications/preferences-types

Responses: 201 Public or optional auth
GET /v2/notifications/users/{userId}/category-preferences

Get a user's notification category preferences

Returns the enabled/disabled status for each notification category (challenges, events, activity). Other notifications are always enabled.

Responses: 200 Public or optional auth
PATCH /v2/notifications/users/{userId}/category-preferences

Update a user's notification category preferences

Enable or disable notification categories (challenges, events, activity). Other notifications cannot be disabled.

Responses: 200 Public or optional auth
PATCH /v2/notifications/users/{userId}/disable

Disable sending notification to a device.

Marks the token as inactive. Use on sign-out to stop push delivery to this device.

Responses: 200 Public or optional auth
POST /v2/notifications/users/{userId}/enable

Enable sending notification to a device.

Call after obtaining an FCM token on the client. Deactivates all prior tokens for the user and registers the new one.

Responses: 201 Public or optional auth

Nutrition foods (user)

1 operations

GET /v2/nutrition/foods

GET /v2/nutrition/foods

Responses: 200 Public or optional auth

Nutrition: Fueling Templates

3 operations

GET /v2/nutrition/fueling-templates

GET /v2/nutrition/fueling-templates

Responses: 200 Public or optional auth
GET /v2/nutrition/fueling-templates/{id}

GET /v2/nutrition/fueling-templates/{id}

Responses: 200 Public or optional auth
GET /v2/nutrition/fueling-templates/categories

GET /v2/nutrition/fueling-templates/categories

Responses: 200 Public or optional auth

OCR

1 operations

POST /v2/ocr/checkpoint

Extract bib/checkpoint-code from a race-day photo. Returns { bibNumber, checkpointCode, confidence }.

Responses: 200 Public or optional auth

Official Partners

2 operations

GET /v2/official-partners/{subjectType}/{subjectId}

Get the active, public-safe partnership projection

Responses: 200 Public or optional auth
GET /v2/official-partners/exclusive-tab/config

Get the active admin-managed athlete navigation partner tab

Responses: 200 Public or optional auth

OG: Profile card

2 operations

GET /v2/u/{athleteId}/card.png

Return a 1200×630 OG profile card for the given athlete. Stub for §16.4; serves SVG until the full PNG generator lands.

Responses: 200 Public or optional auth
GET /v2/u/{userId}/share-card.svg

Story-format (1080×1920) share card with 5 theme presets. PRD §16.4 G-4. Caches by (userId, theme, profile-version).

Responses: 200 Public or optional auth

Organization: Prep Programs

1 operations

GET /v2/organizations/{orgId}/brand-prep-programs

GET /v2/organizations/{orgId}/brand-prep-programs

Responses: 200 Public or optional auth

Organizations

6 operations

GET /v2/organizations/{id}

Organization social profile (athlete-facing).

Responses: 200 Public or optional auth
GET /v2/organizations/{id}/announcements

Organization's announcements (broadcasts).

Responses: 200 Public or optional auth
GET /v2/organizations/{id}/challenges

Organization's active challenges (paginated).

Returns only approved + active challenges. Cancelled and deleted challenges are excluded. Use ?page=1&limit=10. can_view_detail=true when the challenge has not ended. Detail page: GET /v2/challenges/:idOrSlug/public

Responses: 200 Public or optional auth
GET /v2/organizations/{id}/events

Organization's live + upcoming events (paginated).

Returns only live/upcoming events (published, open, closing_soon, in_progress). Cancelled, completed, and deleted events are excluded. Use ?page=1&limit=10. Each item carries can_view_detail=true. Detail page: GET /v2/events/:idOrSlug/public

Responses: 200 Public or optional auth
DELETE /v2/organizations/{id}/follow

Unfollow an Organization (idempotent).

Responses: 200 Auth required
POST /v2/organizations/{id}/follow

Follow an Organization.

Responses: 201 Auth required

Organizer - GST Declaration

6 operations

GET /v2/organizer/declaration/{organizerId}

Get declaration status

Get current declaration status and available actions

Responses: 200 Public or optional auth
GET /v2/organizer/declaration/{organizerId}/download-pdf

Download generated PDF

Get a presigned URL to download the generated declaration PDF. Requires a valid organizer Bearer token — OrganizerRoleGuard verifies the caller is an OWNER/ADMIN team member of THIS :organizerId.

Responses: 200 Public or optional auth
POST /v2/organizer/declaration/{organizerId}/fill

Fill declaration variables

Submit template variables to generate the declaration PDF. Still requires a valid organizer Bearer token — OrganizerRoleGuard resolves `:organizerId` from the path and rejects (403) unless the caller is an OWNER/ADMIN team member of THAT specific organizer, so one organizer cannot fill another organizer's declaration just by changing the URL.

Responses: 201 Public or optional auth
POST /v2/organizer/declaration/{organizerId}/upload-signed

Upload signed declaration

Upload the physically signed declaration document (PDF, JPG, PNG, max 5MB). Requires a valid organizer Bearer token — OrganizerRoleGuard verifies the caller is an OWNER/ADMIN team member of THIS :organizerId.

Responses: 201 Public or optional auth
PUT /v2/organizer/declaration/restart

Restart rejected declaration

Restart the declaration process after rejection

Responses: 200 Auth required
DELETE /v2/organizer/declaration/test-delete

Delete declaration (TESTING ONLY — blocked in production)

Responses: 200 Auth required

Organizer - Notification Settlements

1 operations

GET /v2/organizer/notification-settlements

GET /v2/organizer/notification-settlements

Responses: 200 Public or optional auth

Organizer - Notification Wallet

2 operations

GET /v2/organizer/notification-wallet

GET /v2/organizer/notification-wallet

Responses: 200 Public or optional auth
POST /v2/organizer/notification-wallet/top-up

POST /v2/organizer/notification-wallet/top-up

Responses: 201 Public or optional auth

Organizer - Notifications

10 operations

POST /v2/organizer/notifications/audience/preview

Preview recipient count for an audienceSpec. Runs the same unsubscribe + marketing-preference filters the real send applies, so the composer shows the filtered count — never a pre-filter estimate.

Responses: 201 Public or optional auth
GET /v2/organizer/notifications/batches

GET /v2/organizer/notifications/batches

Responses: 200 Public or optional auth
GET /v2/organizer/notifications/batches/{id}

GET /v2/organizer/notifications/batches/{id}

Responses: 200 Public or optional auth
POST /v2/organizer/notifications/batches/{id}/cancel

Cancel a scheduled batch. Only valid for batches in SCHEDULED status.

Responses: 201 Public or optional auth
POST /v2/organizer/notifications/promotion-send

POST /v2/organizer/notifications/promotion-send

Responses: 201 Public or optional auth
GET /v2/organizer/notifications/promotion-templates

GET /v2/organizer/notifications/promotion-templates

Responses: 200 Public or optional auth
GET /v2/organizer/notifications/quota

Organizer marketing send quota — hourly + daily usage and reset timestamps. For the composer UI to surface remaining quota before submit.

Responses: 200 Public or optional auth
POST /v2/organizer/notifications/send

POST /v2/organizer/notifications/send

Responses: 201 Public or optional auth
GET /v2/organizer/notifications/templates

GET /v2/organizer/notifications/templates

Responses: 200 Public or optional auth
POST /v2/organizer/notifications/upload-recipients

POST /v2/organizer/notifications/upload-recipients

Responses: 201 Public or optional auth

Organizer Analytics

11 operations

GET /v2/organizers/{organizerId}/analytics/aggregate

Organization-wide aggregate metrics — total events, lifetime athletes, total spend, avg events/athlete (PRD §44.1 G-44-1).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/analytics/attribution

Marketing attribution mix — first-touch source breakdown (PRD §43.1 G-43-8).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/analytics/club-affiliations

Top-25 clubs ranked by distinct athletes in this organizer's audience (PRD §43.1 G-43-4).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/analytics/cohort

Cohort retention — YoY repeat-participation metrics derived from the master audience (PRD §43.2 G-43-7).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/analytics/demographics

Audience demographics — gender split + age buckets + top-25 city distribution (PRD §43.1 G-43-3).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/analytics/demographics-deep-dive

Audience demographics cross-tabulation — gender × age × city cohorts, top-N (PRD §43.1 G-43-2 deep-dive).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/analytics/events/{eventId}/first-timer-split

Per-event repeat-vs-first-timer split (PRD §43.1 G-43-3).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/analytics/hybrid

Hybrid race analytics — adoption mix (PHYSICAL/HYBRID/VIRTUAL) + validation rate (PRD §43.3 G-43-9 + G-43-11).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/analytics/hybrid-geo

Geographic distribution of hybrid participants — top-25 city aggregation (PRD §43.3 G-43-10).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/analytics/lifetime-value

Lifetime-value analytics — aggregate distribution + cohorts + anonymized top-N (PRD §43.4 G-43-10).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/analytics/repeat-participants

Repeat-participation analytics — lifetime + repeat counts, average events/athlete, top-N (PRD §43.2 G-43-9).

Responses: 200 Auth required

Organizer Audience

4 operations

GET /v2/organizers/{organizerId}/audience

List master cross-event audience for an organizer.

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/audience/{athleteUserId}/lifetime-value

Read lifetime-value snapshot for a single athlete under this organizer.

Responses: 200 Auth required
POST /v2/organizers/{organizerId}/audience/backfill

Trigger a full audience rebuild from event_participations history. Cheap for organizers <50k participations.

Responses: 201 Auth required
GET /v2/organizers/{organizerId}/audience/export.csv

Export the audience to CSV (capped at 50k rows for memory safety).

Responses: 200 Auth required

Organizer Audience — Identified LTV

1 operations

GET /v2/organizers/{organizerId}/analytics-identified/lifetime-value

Identified lifetime-value — top-N athletes WITH userId (PRD §43.4 G-43-10; OWNER+ADMIN only — PII-adjacent).

Responses: 200 Auth required

Organizer Events — Anti-Cheat

1 operations

GET /v2/organizer/events/{eventId}/anti-cheat

List anti-cheat flags scoped to this event

Resolves Event → HybridRace → HybridRaceResult.activityIds → AntiCheatFlag. Returns counts by severity/status + the most recent flags with athlete + rule.

Responses: 200 Public or optional auth

Organizer Events — Bulk

1 operations

POST /v2/organizer/events/bulk

Bulk action on events

Run unpublish / cancel / clone on up to 100 event IDs. Returns per-id success/failure so the UI can surface partial successes.

Responses: 200 Public or optional auth

Organizer Events — Self-service

2 operations

GET /v2/organizer/events/{eventId}/self-service-config

Read the per-event participant self-service policy (PRD §35.4).

Responses: 200 Public or optional auth
PATCH /v2/organizer/events/{eventId}/self-service-config

Update the per-event participant self-service policy (PRD §35.4).

Responses: 200 Public or optional auth

Organizer Events — Waitlist

4 operations

GET /v2/organizer/events/{eventId}/waitlist

List waitlist entries for an event

Responses: 200 Public or optional auth
DELETE /v2/organizer/events/{eventId}/waitlist/{entryId}

Remove a waitlist entry (soft delete)

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/waitlist/{entryId}/notify

Re-send the OFFERED notification

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/waitlist/{entryId}/promote

Promote a waitlist entry to OFFERED (out-of-order)

Responses: 201 Public or optional auth

Organizer Events — Waves

3 operations

PATCH /v2/organizer/events/{eventId}/participations/{participationId}/wave

Move a participation to a different wave (slot)

Responses: 200 Public or optional auth
GET /v2/organizer/events/{eventId}/wave-roster

List waves (slots) with per-wave participant counts + roster

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/waves/seed

Bulk auto-assign participants across waves (PRD §35.3). Capacity-aware; supports dryRun preview.

Responses: 201 Public or optional auth

Organizer Training Programs

13 operations

GET /v2/organizers/{organizerId}/training-programs

List training-program templates for an organizer.

Responses: 200 Auth required
POST /v2/organizers/{organizerId}/training-programs

Create a new training-program template.

Responses: 201 Auth required
GET /v2/organizers/{organizerId}/training-programs/{templateId}

Get a single template (with all workouts in week/day order).

Responses: 200 Auth required
PATCH /v2/organizers/{organizerId}/training-programs/{templateId}

Update a template (name / description / sport / status / etc.).

Responses: 200 Auth required
POST /v2/organizers/{organizerId}/training-programs/{templateId}/assignments

Assign this template to a single athlete for an event (PRD §38.2 G-38-3).

Responses: 201 Auth required
POST /v2/organizers/{organizerId}/training-programs/{templateId}/assignments/bulk

Bulk-assign this template to multiple athletes for an event (PRD §38.2 G-38-3, max 1000 athletes/call).

Responses: 201 Auth required
POST /v2/organizers/{organizerId}/training-programs/{templateId}/workouts

Add a workout to the template schedule.

Responses: 201 Auth required
DELETE /v2/organizers/{organizerId}/training-programs/{templateId}/workouts/{workoutId}

Soft-delete a workout slot.

Responses: 200 Auth required
PATCH /v2/organizers/{organizerId}/training-programs/{templateId}/workouts/{workoutId}

Update an existing workout slot.

Responses: 200 Auth required
POST /v2/organizers/{organizerId}/training-programs/{templateId}/workouts/from-library

Clone a library workout into the template (preserves source linkage).

Responses: 201 Auth required
DELETE /v2/organizers/{organizerId}/training-programs/assignments/{assignmentId}

Unassign a previously-assigned program (soft-deletes the row).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/training-programs/events/{eventId}/assignments

List active program assignments for an event.

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/training-programs/library

Read-only canonical workout library — one example per WorkoutType.

Responses: 200 Auth required

Organizer: Activity

1 operations

GET /v2/organizer/activity

Paginated organizer team activity log (PRD §44.4). Filter by actorId / action / date range. OWNER + ADMIN + VIEWER.

Responses: 200 Auth required

Organizer: Analytics drill-down

6 operations

GET /v2/organizer/analytics/attribution

UTM attribution placeholder — UTM capture on registration is not instrumented today. Tracked under VD-A2.

Responses: 200 Auth required
GET /v2/organizer/analytics/cohorts

Cohort retention matrix for this organizer. Requires 10 participants + 2 events as a minimum; smaller orgs get a structured insufficient-data response.

Responses: 200 Auth required
GET /v2/organizer/analytics/events/{eventId}/avg-ticket-price

Per-event weighted-average ticket price + paid-only avg + free share (PRD §42.1 G-42-2).

Responses: 200 Auth required
GET /v2/organizer/analytics/events/{eventId}/funnel

Per-event funnel counts: registered → paid → checked-in → attended → (finished if hybrid). Earlier stages (view, interest) not instrumented; see VD-A1.

Responses: 200 Auth required
GET /v2/organizer/analytics/events/{eventId}/funnel.csv

Per-event funnel as CSV — deterministic headers (stage,count,conversionFromPrev,percentOfPeak).

Responses: 200 Auth required
GET /v2/organizer/analytics/events/{eventId}/sales

Per-event sales tab (complement to organizer/events/:eventId/finance): sales-by-category, coupons, add-ons, recent orders, ticket inventory.

Responses: 200 Auth required

Organizer: Audience (portal)

6 operations

GET /v2/organizer/audience

Projected cross-event audience list for the partner portal. OWNER + ADMIN only (PRD §44.3).

Responses: 200 Auth required
GET /v2/organizer/audience/{athleteUserId}

Projected single-athlete LTV snapshot (PRD §44.3). Owner+Admin only. NotFound when the athlete is not in this organizer audience.

Responses: 200 Auth required
GET /v2/organizer/audience/{athleteUserId}/timeline

Per-athlete chronological event timeline (PRD §44.3). Owner+Admin only. 404 if the athlete is not in this organizer audience; otherwise paginated rows (may be empty).

Responses: 200 Auth required
POST /v2/organizer/audience/cohort-link

Mint an HMAC-signed v2 cohort link (PRD §44.3 / §40). Returns the URL + expiration ISO.

Responses: 201 Auth required
POST /v2/organizer/audience/cohort-link/verify

Verify a v2 cohort link token; returns the safe criteria when the signature, expiration, and organizer-match all pass.

Responses: 201 Auth required
GET /v2/organizer/audience/summary

Audience summary aggregates (totalAudience / repeatParticipants / averageEventsPerParticipant / totalRegistrations / totalLifetimeSpendInr / dormantParticipants).

Responses: 200 Auth required

Organizer: Benchmarking

1 operations

GET /v2/organizer/benchmarking/events/{eventId}

Benchmark an event against comparable peers (aggregate-only).

Responses: 200 Auth required

Organizer: Bib Config

2 operations

GET /v2/organizer/events/{eventId}/bib-config

Read the current bib config for an event.

Responses: 200 Public or optional auth
PATCH /v2/organizer/events/{eventId}/bib-config

Patch the bib config. Any omitted field is left untouched.

Responses: 200 Public or optional auth

Organizer: Brand + Training

16 operations

GET /v2/organizer/brand/cascade-defaults

GET /v2/organizer/brand/cascade-defaults

Responses: 200 Public or optional auth
PATCH /v2/organizer/brand/cascade-defaults

PATCH /v2/organizer/brand/cascade-defaults

Responses: 200 Public or optional auth
GET /v2/organizer/brand/followers

GET /v2/organizer/brand/followers

Responses: 200 Public or optional auth
GET /v2/organizer/brand/followers/export.csv

GET /v2/organizer/brand/followers/export.csv

Responses: 200 Public or optional auth
GET /v2/organizer/brand/page

GET /v2/organizer/brand/page

Responses: 200 Public or optional auth
PATCH /v2/organizer/brand/page

PATCH /v2/organizer/brand/page

Responses: 200 Public or optional auth
GET /v2/organizer/brand/prep-programs

GET /v2/organizer/brand/prep-programs

Responses: 200 Public or optional auth
POST /v2/organizer/brand/prep-programs

POST /v2/organizer/brand/prep-programs

Responses: 201 Public or optional auth
GET /v2/organizer/brand/prep-programs/{id}

GET /v2/organizer/brand/prep-programs/{id}

Responses: 200 Public or optional auth
PATCH /v2/organizer/brand/prep-programs/{id}

PATCH /v2/organizer/brand/prep-programs/{id}

Responses: 200 Public or optional auth
POST /v2/organizer/brand/prep-programs/{id}/assign

POST /v2/organizer/brand/prep-programs/{id}/assign

Responses: 201 Public or optional auth
PATCH /v2/organizer/brand/prep-programs/{id}/weekly-plan

PATCH /v2/organizer/brand/prep-programs/{id}/weekly-plan

Responses: 200 Public or optional auth
POST /v2/organizer/brand/saas/cancel

POST /v2/organizer/brand/saas/cancel

Responses: 201 Public or optional auth
GET /v2/organizer/brand/saas/my

GET /v2/organizer/brand/saas/my

Responses: 200 Public or optional auth
GET /v2/organizer/brand/saas/plans

GET /v2/organizer/brand/saas/plans

Responses: 200 Public or optional auth
POST /v2/organizer/brand/saas/subscribe

POST /v2/organizer/brand/saas/subscribe

Responses: 201 Public or optional auth

Organizer: Challenge Goodies

1 operations

GET /v2/organizers/challenges/{challengeId}/goodies

Goodies awarded against one of the caller's own challenges.

Responses: 200 Auth required

Organizer: Check-in + Bib

15 operations

POST /v2/organizer/events/{eventId}/bibs/assign

POST /v2/organizer/events/{eventId}/bibs/assign

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/bibs/auto-assign

POST /v2/organizer/events/{eventId}/bibs/auto-assign

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/check-in/{checkinId}/undo

POST /v2/organizer/events/{eventId}/check-in/{checkinId}/undo

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/check-in/scan

POST /v2/organizer/events/{eventId}/check-in/scan

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/check-in/scan-by-bib

POST /v2/organizer/events/{eventId}/check-in/scan-by-bib

Responses: 201 Public or optional auth
GET /v2/organizer/events/{eventId}/check-in/search

GET /v2/organizer/events/{eventId}/check-in/search

Responses: 200 Public or optional auth
GET /v2/organizer/events/{eventId}/check-in/status

GET /v2/organizer/events/{eventId}/check-in/status

Responses: 200 Public or optional auth
GET /v2/organizer/events/{eventId}/check-in/summary

GET /v2/organizer/events/{eventId}/check-in/summary

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/check-in/sync-batch

POST /v2/organizer/events/{eventId}/check-in/sync-batch

Responses: 201 Public or optional auth
PATCH /v2/organizer/events/{eventId}/participants/{participantId}/bib

PATCH /v2/organizer/events/{eventId}/participants/{participantId}/bib

Responses: 200 Public or optional auth
GET /v2/organizer/events/{eventId}/waves

GET /v2/organizer/events/{eventId}/waves

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/waves/{slotId}/close

POST /v2/organizer/events/{eventId}/waves/{slotId}/close

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/waves/{slotId}/open

POST /v2/organizer/events/{eventId}/waves/{slotId}/open

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/waves/{slotId}/start

POST /v2/organizer/events/{eventId}/waves/{slotId}/start

Responses: 201 Public or optional auth
GET /v2/organizer/events/{eventId}/waves/capacity

GET /v2/organizer/events/{eventId}/waves/capacity

Responses: 200 Public or optional auth

Organizer: Club Creator Analytics

5 operations

GET /v2/organizer/clubs/{clubId}/analytics/churn

Churn over a sliding window.

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/{clubId}/analytics/cohort-retention

Cohort retention by month-joined.

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/{clubId}/analytics/dashboard

Combined analytics dashboard.

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/{clubId}/analytics/ltv

Lifetime value (ARPU ÷ monthly churn).

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/{clubId}/analytics/mrr

Monthly recurring revenue (MRR).

Responses: 200 Public or optional auth

Organizer: Club Moderation

8 operations

GET /v2/organizer/clubs/{clubId}/moderation/posts

GET /v2/organizer/clubs/{clubId}/moderation/posts

Responses: 200 Public or optional auth
DELETE /v2/organizer/clubs/{clubId}/moderation/posts/{postId}

DELETE /v2/organizer/clubs/{clubId}/moderation/posts/{postId}

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/{clubId}/moderation/posts/{postId}/comments

GET /v2/organizer/clubs/{clubId}/moderation/posts/{postId}/comments

Responses: 200 Public or optional auth
DELETE /v2/organizer/clubs/{clubId}/moderation/posts/{postId}/comments/{commentId}

DELETE /v2/organizer/clubs/{clubId}/moderation/posts/{postId}/comments/{commentId}

Responses: 200 Public or optional auth
POST /v2/organizer/clubs/{clubId}/moderation/posts/{postId}/comments/{commentId}/hide

POST /v2/organizer/clubs/{clubId}/moderation/posts/{postId}/comments/{commentId}/hide

Responses: 201 Public or optional auth
POST /v2/organizer/clubs/{clubId}/moderation/posts/{postId}/comments/{commentId}/unhide

POST /v2/organizer/clubs/{clubId}/moderation/posts/{postId}/comments/{commentId}/unhide

Responses: 201 Public or optional auth
POST /v2/organizer/clubs/{clubId}/moderation/posts/{postId}/hide

POST /v2/organizer/clubs/{clubId}/moderation/posts/{postId}/hide

Responses: 201 Public or optional auth
POST /v2/organizer/clubs/{clubId}/moderation/posts/{postId}/unhide

POST /v2/organizer/clubs/{clubId}/moderation/posts/{postId}/unhide

Responses: 201 Public or optional auth

Organizer: Club monetization

2 operations

GET /v2/organizer/clubs/{clubId}/monetization/payments

Paginated payment history. Optional status filter (CAPTURED / REFUNDED / PENDING / FAILED / CANCELLED).

Responses: 200 Auth required
GET /v2/organizer/clubs/{clubId}/monetization/summary

Per-tier revenue rows + club totals + sourceStatus map (NOT_TRACKED_YET for mrr / churnRate / lifetimeValue — no fabricated numbers).

Responses: 200 Auth required

Organizer: Clubs

33 operations

GET /v2/organizer/clubs

GET /v2/organizer/clubs

Responses: 200 Public or optional auth
POST /v2/organizer/clubs

POST /v2/organizer/clubs

Responses: 201 Public or optional auth
GET /v2/organizer/clubs/{clubId}/active-members-roster

GET /v2/organizer/clubs/{clubId}/active-members-roster

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/{clubId}/activity

GET /v2/organizer/clubs/{clubId}/activity

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/{clubId}/admins

GET /v2/organizer/clubs/{clubId}/admins

Responses: 200 Public or optional auth
POST /v2/organizer/clubs/{clubId}/banner

POST /v2/organizer/clubs/{clubId}/banner

Responses: 201 Public or optional auth
POST /v2/organizer/clubs/{clubId}/logo

POST /v2/organizer/clubs/{clubId}/logo

Responses: 201 Public or optional auth
PATCH /v2/organizer/clubs/{clubId}/memberships/{membershipId}/notes

PATCH /v2/organizer/clubs/{clubId}/memberships/{membershipId}/notes

Responses: 200 Public or optional auth
POST /v2/organizer/clubs/{clubId}/memberships/{membershipId}/transfer-ownership

POST /v2/organizer/clubs/{clubId}/memberships/{membershipId}/transfer-ownership

Responses: 201 Public or optional auth
GET /v2/organizer/clubs/{clubId}/metrics

GET /v2/organizer/clubs/{clubId}/metrics

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/{clubId}/my-role

GET /v2/organizer/clubs/{clubId}/my-role

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/{clubId}/ownership-transfer

GET /v2/organizer/clubs/{clubId}/ownership-transfer

Responses: 200 Public or optional auth
POST /v2/organizer/clubs/{clubId}/ownership-transfer/{requestId}/cancel

POST /v2/organizer/clubs/{clubId}/ownership-transfer/{requestId}/cancel

Responses: 201 Public or optional auth
POST /v2/organizer/clubs/{clubId}/sports

POST /v2/organizer/clubs/{clubId}/sports

Responses: 201 Public or optional auth
DELETE /v2/organizer/clubs/{clubId}/sports/{sportId}

DELETE /v2/organizer/clubs/{clubId}/sports/{sportId}

Responses: 200 Public or optional auth
PATCH /v2/organizer/clubs/{clubId}/sports/{sportId}/primary

PATCH /v2/organizer/clubs/{clubId}/sports/{sportId}/primary

Responses: 200 Public or optional auth
POST /v2/organizer/clubs/{clubId}/submit-setup

POST /v2/organizer/clubs/{clubId}/submit-setup

Responses: 201 Public or optional auth
GET /v2/organizer/clubs/{clubId}/tiers

GET /v2/organizer/clubs/{clubId}/tiers

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/{clubId}/verification-eligibility

GET /v2/organizer/clubs/{clubId}/verification-eligibility

Responses: 200 Public or optional auth
POST /v2/organizer/clubs/{clubId}/verify-request

POST /v2/organizer/clubs/{clubId}/verify-request

Responses: 201 Public or optional auth
PATCH /v2/organizer/clubs/{id}

PATCH /v2/organizer/clubs/{id}

Responses: 200 Public or optional auth
POST /v2/organizer/clubs/{id}/announcements

POST /v2/organizer/clubs/{id}/announcements

Responses: 201 Public or optional auth
DELETE /v2/organizer/clubs/{id}/members/{userId}

DELETE /v2/organizer/clubs/{id}/members/{userId}

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/{id}/members/{userId}

GET /v2/organizer/clubs/{id}/members/{userId}

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/{id}/memberships

GET /v2/organizer/clubs/{id}/memberships

Responses: 200 Public or optional auth
POST /v2/organizer/clubs/{id}/memberships/{membershipId}/approve

POST /v2/organizer/clubs/{id}/memberships/{membershipId}/approve

Responses: 201 Public or optional auth
POST /v2/organizer/clubs/{id}/memberships/{membershipId}/reject

POST /v2/organizer/clubs/{id}/memberships/{membershipId}/reject

Responses: 201 Public or optional auth
POST /v2/organizer/clubs/{id}/runs

POST /v2/organizer/clubs/{id}/runs

Responses: 201 Public or optional auth
DELETE /v2/organizer/clubs/{id}/runs/{runId}

DELETE /v2/organizer/clubs/{id}/runs/{runId}

Responses: 200 Public or optional auth
PATCH /v2/organizer/clubs/{id}/runs/{runId}

PATCH /v2/organizer/clubs/{id}/runs/{runId}

Responses: 200 Public or optional auth
POST /v2/organizer/clubs/{id}/tiers

POST /v2/organizer/clubs/{id}/tiers

Responses: 201 Public or optional auth
PATCH /v2/organizer/clubs/{id}/tiers/{tierId}

PATCH /v2/organizer/clubs/{id}/tiers/{tierId}

Responses: 200 Public or optional auth
GET /v2/organizer/clubs/setup-status

GET /v2/organizer/clubs/setup-status

Responses: 200 Public or optional auth

Organizer: Cross-event Marketing

1 operations

POST /v2/organizers/{organizerId}/marketing/bulk-notify

Send a bulk notification across all (or a subset of) the organizer's events. Recipients are deduped globally.

Responses: 201 Auth required

Organizer: Custom Reports

8 operations

GET /v2/organizers/{organizerId}/reports

List all report templates for the organizer.

Responses: 200 Auth required
POST /v2/organizers/{organizerId}/reports

Create a custom report template (DRAFT).

Responses: 201 Auth required
GET /v2/organizers/{organizerId}/reports/{id}

Fetch a single report template.

Responses: 200 Auth required
PATCH /v2/organizers/{organizerId}/reports/{id}

Update a report template definition.

Responses: 200 Auth required
POST /v2/organizers/{organizerId}/reports/{id}/archive

Archive a report template (terminal).

Responses: 201 Auth required
POST /v2/organizers/{organizerId}/reports/{id}/run

Execute the template now and return result rows (limited).

Responses: 201 Auth required
PATCH /v2/organizers/{organizerId}/reports/{id}/schedule

Set or update the cron schedule + recipient emails. PUBLISHED on first set.

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/reports/schema

Report-builder schema (whitelisted sources/columns/aggregations).

Responses: 200 Auth required

Organizer: Demographics

1 operations

GET /v2/organizer/demographics

Aggregate participant demographics by a dimension (k-anon safe).

Responses: 200 Auth required

Organizer: Disputes

10 operations

GET /v2/organizer/disputes

List chargebacks affecting this organizer's events. Read-only per PRD §42.6 G-42-15.

Responses: 200 Auth required
GET /v2/organizer/disputes/{id}

Get a single dispute by id (cross-org leak guard returns 404 on mismatch).

Responses: 200 Auth required
GET /v2/organizer/disputes/{id}/audit

Paginated audit trail for a chargeback (PRD §42.6). Read-only — OWNER + ADMIN + VIEWER.

Responses: 200 Auth required
POST /v2/organizer/disputes/{id}/evidence

Upload an evidence file for a chargeback (PRD §42.6). OWNER + ADMIN only.

Responses: 201 Auth required
DELETE /v2/organizer/disputes/{id}/evidence/{fileKey}

Remove an uploaded evidence file from a chargeback (PRD §42.6). OWNER + ADMIN only.

Responses: 200 Auth required
GET /v2/organizer/disputes/{id}/evidence/{fileKey}/download

Get a short-lived (15-min) signed download URL for an uploaded evidence file. OWNER + ADMIN + VIEWER read.

Responses: 200 Auth required
PATCH /v2/organizer/disputes/{id}/response

Submit a draft / final response for a chargeback (PRD §42.6 G-42-16). OWNER + ADMIN only; VIEWER read-only.

Responses: 200 Auth required
GET /v2/organizer/disputes/{id}/thread

Paginated dispute thread for a chargeback (PRD §42.6). Read-only — OWNER + ADMIN + VIEWER.

Responses: 200 Auth required
POST /v2/organizer/disputes/{id}/thread

Post a thread message on a chargeback (PRD §42.6 G-42-16). OWNER + ADMIN only; status must be INITIATED.

Responses: 201 Auth required
GET /v2/organizer/disputes/summary

Aggregate dispute counts + next deadline (drives partner-portal banner).

Responses: 200 Auth required

Organizer: Event attachments

3 operations

GET /v2/organizer/events/attachment-requests

OM: list attach requests for events the organizer owns.

Responses: 200 Auth required
POST /v2/organizer/events/attachment-requests/{attachmentId}/approve

OM: approve a club attach request. Emits club.event_attach.approved.

Responses: 201 Auth required
POST /v2/organizer/events/attachment-requests/{attachmentId}/reject

OM: reject a club attach request. Emits club.event_attach.rejected.

Responses: 201 Auth required

Organizer: Event clone

1 operations

POST /v2/events/{eventId}/clone

Clone the event SHELL (metadata + tickets) into a new DRAFT row. Does NOT copy registrations, payments, results, check-ins, or incidents.

Responses: 201 Public or optional auth

Organizer: Event Goodies

1 operations

GET /v2/organizers/events/{eventId}/goodies

Goodies awarded against one of the caller's own events.

Responses: 200 Auth required

Organizer: Event Money Tab

1 operations

GET /v2/organizer/events/{eventId}/money

Money tab for one event: settlement breakdown (gross→platform→gateway→TDS→net), GST invoices, refunds, disputes.

Responses: 200 Auth required

Organizer: Event Participations

11 operations

GET /v2/organizer/events/{eventId}/participations/{participationId}

GET /v2/organizer/events/{eventId}/participations/{participationId}

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/participations/{participationId}/defer

POST /v2/organizer/events/{eventId}/participations/{participationId}/defer

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/participations/{participationId}/notify

POST /v2/organizer/events/{eventId}/participations/{participationId}/notify

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/participations/{participationId}/transfer

POST /v2/organizer/events/{eventId}/participations/{participationId}/transfer

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/participations/bulk-defer

POST /v2/organizer/events/{eventId}/participations/bulk-defer

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/participations/bulk-notify

POST /v2/organizer/events/{eventId}/participations/bulk-notify

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/participations/bulk-notify/preview

POST /v2/organizer/events/{eventId}/participations/bulk-notify/preview

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/participations/bulk-transfer

POST /v2/organizer/events/{eventId}/participations/bulk-transfer

Responses: 201 Public or optional auth
GET /v2/organizer/events/{eventId}/participations/export

GET /v2/organizer/events/{eventId}/participations/export

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/participations/offline-reg

POST /v2/organizer/events/{eventId}/participations/offline-reg

Responses: 201 Public or optional auth
GET /v2/organizer/events/{eventId}/participations/summary

GET /v2/organizer/events/{eventId}/participations/summary

Responses: 200 Public or optional auth

Organizer: Event Photos

6 operations

GET /v2/organizer/events/{eventId}/photos

GET /v2/organizer/events/{eventId}/photos

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/photos

POST /v2/organizer/events/{eventId}/photos

Responses: 201 Public or optional auth
DELETE /v2/organizer/events/{eventId}/photos/{photoId}

DELETE /v2/organizer/events/{eventId}/photos/{photoId}

Responses: 200 Public or optional auth
PATCH /v2/organizer/events/{eventId}/photos/{photoId}/bib

PATCH /v2/organizer/events/{eventId}/photos/{photoId}/bib

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/photos/bulk

POST /v2/organizer/events/{eventId}/photos/bulk

Responses: 201 Public or optional auth
GET /v2/organizer/events/{eventId}/photos/sales-analytics

GET /v2/organizer/events/{eventId}/photos/sales-analytics

Responses: 200 Public or optional auth

Organizer: Event sponsorship packages

6 operations

GET /v2/organizer/events/{eventId}/sponsorship-packages

List sponsorship packages for an event (PRD §38 / §41). OWNER + ADMIN + VIEWER.

Responses: 200 Auth required
POST /v2/organizer/events/{eventId}/sponsorship-packages

Create a sponsorship package (DRAFT). OWNER + ADMIN only.

Responses: 201 Auth required
DELETE /v2/organizer/events/{eventId}/sponsorship-packages/{packageId}

Archive a sponsorship package (terminal). OWNER + ADMIN only.

Responses: 200 Auth required
GET /v2/organizer/events/{eventId}/sponsorship-packages/{packageId}

Get a single sponsorship package by id (cross-org guard returns 404).

Responses: 200 Auth required
PATCH /v2/organizer/events/{eventId}/sponsorship-packages/{packageId}

Update a sponsorship package (non-archived only). OWNER + ADMIN only.

Responses: 200 Auth required
PATCH /v2/organizer/events/{eventId}/sponsorship-packages/{packageId}/status

Transition status (DRAFT ⇄ ACTIVE → ARCHIVED). OWNER + ADMIN only.

Responses: 200 Auth required

Organizer: Event Templates

6 operations

GET /v2/events/templates

GET /v2/events/templates

Responses: 200 Public or optional auth
POST /v2/events/templates

POST /v2/events/templates

Responses: 201 Public or optional auth
DELETE /v2/events/templates/{templateId}

DELETE /v2/events/templates/{templateId}

Responses: 200 Public or optional auth
GET /v2/events/templates/{templateId}

GET /v2/events/templates/{templateId}

Responses: 200 Public or optional auth
POST /v2/events/templates/{templateId}/clone

POST /v2/events/templates/{templateId}/clone

Responses: 201 Public or optional auth
POST /v2/events/templates/from-event/{eventId}

POST /v2/events/templates/from-event/{eventId}

Responses: 201 Public or optional auth

Organizer: Hybrid Race Ops

11 operations

GET /v2/organizer/events/{eventId}/hybrid-race/cockpit

GET /v2/organizer/events/{eventId}/hybrid-race/cockpit

Responses: 200 Public or optional auth
GET /v2/organizer/events/{eventId}/hybrid-race/config

GET /v2/organizer/events/{eventId}/hybrid-race/config

Responses: 200 Public or optional auth
PATCH /v2/organizer/events/{eventId}/hybrid-race/config

PATCH /v2/organizer/events/{eventId}/hybrid-race/config

Responses: 200 Public or optional auth
GET /v2/organizer/events/{eventId}/hybrid-race/dashboard

GET /v2/organizer/events/{eventId}/hybrid-race/dashboard

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/hybrid-race/ensure

POST /v2/organizer/events/{eventId}/hybrid-race/ensure

Responses: 201 Public or optional auth
GET /v2/organizer/events/{eventId}/hybrid-race/participants

GET /v2/organizer/events/{eventId}/hybrid-race/participants

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/hybrid-race/physical-results/upload

POST /v2/organizer/events/{eventId}/hybrid-race/physical-results/upload

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/hybrid-race/results/{resultId}/flag-for-review

POST /v2/organizer/events/{eventId}/hybrid-race/results/{resultId}/flag-for-review

Responses: 201 Public or optional auth
PATCH /v2/organizer/events/{eventId}/hybrid-race/results/{resultId}/merch-shipment

PATCH /v2/organizer/events/{eventId}/hybrid-race/results/{resultId}/merch-shipment

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/hybrid-race/results/{resultId}/resolve-review

POST /v2/organizer/events/{eventId}/hybrid-race/results/{resultId}/resolve-review

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/hybrid-race/results/recompute-ranks

POST /v2/organizer/events/{eventId}/hybrid-race/results/recompute-ranks

Responses: 201 Public or optional auth

Organizer: KYC workflow

5 operations

GET /v2/organizers/me/kyc

Owner read of the current organizer's KYC state. Returns null when no BusinessKyc has been created yet — the partner portal renders the 'not started' state.

Responses: 200 Auth required
GET /v2/organizers/me/kyc/bank-verification

Get the signed-in organizer's bank verification status.

Responses: 200 Auth required
POST /v2/organizers/me/kyc/resubmit

Resubmit KYC after rejection. REJECTED or RESUBMIT only. Clears prior rejection metadata.

Responses: 201 Auth required
POST /v2/organizers/me/kyc/submit

Submit KYC for admin review. PENDING or RESUBMIT only. Requires businessRegistrationCertificate + panCard documents already uploaded via /v2/organizers/:id/business-kyc.

Responses: 201 Auth required
POST /v2/organizers/me/kyc/verify-bank

Verify the saved organizer payout account using the configured penny-drop provider.

Responses: 200 Auth required

Organizer: Marketing Drafts

5 operations

GET /v2/organizer/marketing/drafts

GET /v2/organizer/marketing/drafts

Responses: 200 Auth required
POST /v2/organizer/marketing/drafts

POST /v2/organizer/marketing/drafts

Responses: 201 Auth required
DELETE /v2/organizer/marketing/drafts/{id}

DELETE /v2/organizer/marketing/drafts/{id}

Responses: 200 Auth required
GET /v2/organizer/marketing/drafts/{id}

GET /v2/organizer/marketing/drafts/{id}

Responses: 200 Auth required
PATCH /v2/organizer/marketing/drafts/{id}

PATCH /v2/organizer/marketing/drafts/{id}

Responses: 200 Auth required

Organizer: Master Events

8 operations

GET /v2/organizers/{organizerId}/master-events/{eventId}

Master configuration, components and readiness.

Responses: 200 Auth required
PATCH /v2/organizers/{organizerId}/master-events/{eventId}

Create or update master-event rules.

Responses: 200 Auth required
PUT /v2/organizers/{organizerId}/master-events/{eventId}/components

Atomically replace ordered master components.

Responses: 200 Auth required
PUT /v2/organizers/{organizerId}/master-events/{eventId}/configure

Atomically save master rules and ordered components.

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/master-events/{eventId}/orders

List master bundle payment and enrollment orders.

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/master-events/{eventId}/participants

Master participant progress roster.

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/master-events/{eventId}/rewards

List master reward grants.

Responses: 200 Auth required
POST /v2/organizers/{organizerId}/master-events/{eventId}/rewards/finalize

Finalize idempotent master reward grants.

Responses: 201 Auth required

Organizer: Medical tent

7 operations

GET /v2/organizer/events/{eventId}/medical/incidents

GET /v2/organizer/events/{eventId}/medical/incidents

Responses: 200 Auth required
GET /v2/organizer/events/{eventId}/medical/incidents/{incidentId}

GET /v2/organizer/events/{eventId}/medical/incidents/{incidentId}

Responses: 200 Auth required
PATCH /v2/organizer/events/{eventId}/medical/incidents/{incidentId}

PATCH /v2/organizer/events/{eventId}/medical/incidents/{incidentId}

Responses: 200 Auth required
POST /v2/organizer/events/{eventId}/medical/incidents/{incidentId}/close

POST /v2/organizer/events/{eventId}/medical/incidents/{incidentId}/close

Responses: 201 Auth required
POST /v2/organizer/events/{eventId}/medical/participants/{participantId}/incidents

POST /v2/organizer/events/{eventId}/medical/participants/{participantId}/incidents

Responses: 201 Auth required
POST /v2/organizer/events/{eventId}/medical/participants/{participantId}/reveal

Reveal a participant safety profile. Required: justification (10–500 chars). Writes a medical_info_access_logs row + a hash-chained audit-log entry.

Responses: 201 Auth required
GET /v2/organizer/events/{eventId}/medical/participants/search

Search participants for medical-tent operations. Returns name, bib, check-in status, open-incident count. NEVER returns medical info.

Responses: 200 Auth required

Organizer: Payouts

14 operations

GET /v2/organizer/payouts

List settlement (payout) rows for the authenticated organizer. Paginated, filterable by date / stream / status.

Responses: 200 Auth required
GET /v2/organizer/payouts/{settlementId}/fee-breakdown

Per-transaction fee breakdown for a single settlement (PRD §42.3 G-42-9). Returns gross / platformFee / gatewayFee / gst / net + reconciliation delta.

Responses: 200 Auth required
POST /v2/organizer/payouts/{settlementId}/request

Request a payout for a settlement. Idempotent — a second open request returns the existing one.

Responses: 201 Auth required
GET /v2/organizer/payouts/{settlementId}/statement.pdf

Generate / fetch the settlement statement PDF (PRD §42.4 D-114). Returns S3 URL info.

Responses: 200 Auth required
GET /v2/organizer/payouts/balance

Payout balance: available, pending, in-transit, paid + next payout date (PRD §42.4).

Responses: 200 Auth required
GET /v2/organizer/payouts/events/{eventId}/finance

Per-event finance aggregator (PRD §42 / §44) — gross / net / fees / by-stream scoped to one event.

Responses: 200 Auth required
GET /v2/organizer/payouts/export

Download the current filter state as CSV.

Responses: 200 Auth required
GET /v2/organizer/payouts/payout-schedule

Get the caller organizer's payout cadence (PRD §42.4). Returns { organizerId, schedule }.

Responses: 200 Auth required
PATCH /v2/organizer/payouts/payout-schedule

Update the caller organizer's payout cadence (PRD §42.4). OWNER + ADMIN only; VIEWER blocked.

Responses: 200 Auth required
GET /v2/organizer/payouts/requests

List the organizer’s own payout requests.

Responses: 200 Auth required
POST /v2/organizer/payouts/requests/{id}/cancel

Cancel an open payout request (reason required).

Responses: 201 Auth required
GET /v2/organizer/payouts/summary

Filter-aware totals for the ledger. Returns overall + per-stream breakdown.

Responses: 200 Auth required
GET /v2/organizer/payouts/transactions-export

Download per-participant transaction-log as CSV. PRD §42.2 columns: date / time / participant / amount / payment method / status / reference IDs.

Responses: 200 Auth required
GET /v2/organizer/payouts/year-over-year

Year-over-year revenue comparison (current window vs same window prior year). Requires explicit from + to dates (PRD §42.1 G-42-4).

Responses: 200 Auth required

Organizer: Promotions

2 operations

GET /v2/organizer/promotions

GET /v2/organizer/promotions

Responses: 200 Auth required
GET /v2/organizer/promotions/{promotionId}/analytics

GET /v2/organizer/promotions/{promotionId}/analytics

Responses: 200 Auth required

Organizer: Proof Review

2 operations

POST /v2/organizer/proofs/{proofId}/resolve

Approve or reject a proof on an edition you own (idempotent).

Responses: 201 Auth required
GET /v2/organizer/proofs/review-queue

Edition proofs awaiting review, for this organizer's editions.

Responses: 200 Auth required

Organizer: Race-day announcements

5 operations

GET /v2/organizer/events/{eventId}/race-day/announcements

List recent announcements for the cockpit history drawer.

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/race-day/announcements/{id}/mark-failed

Mark an announcement as FAILED with audited reason. Used by post-dispatch error handling.

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/race-day/announcements/{id}/send

Dispatch the announcement. Text broadcast unconditional; audio attempted only if SARVAM_API_KEY (or other audio provider) configured. Returns explicit `audioReason: AUDIO_PROVIDER_NOT_CONFIGURED` when audio is honest-degraded.

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/race-day/announcements/preview

Persist an announcement as PREVIEWED (audited). Cockpit shows the operator the rendered body before they click Send.

Responses: 201 Public or optional auth
GET /v2/organizer/events/{eventId}/race-day/announcements/templates

List the 8 canonical announcement templates (wave opening / starting / route change / weather / medical / sponsor / results / custom).

Responses: 200 Public or optional auth

Organizer: Race-day mass notify

3 operations

GET /v2/organizer/events/{eventId}/race-day/mass-notify/dry-run

Count recipients matching the segment without sending — used by OM confirm dialog before send.

Responses: 200 Public or optional auth
GET /v2/organizer/events/{eventId}/race-day/mass-notify/segments

List supported recipient segments

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/race-day/mass-notify/send

Record + dispatch a race-day mass notification. Returns dispatched=false + reason=PROVIDER_NOT_CONFIGURED when no provider is configured (audit row still written for forensic intent).

Responses: 201 Public or optional auth

Organizer: Race-day validation queue

2 operations

GET /v2/organizer/race-day/validation-queue/counts

Validation queue counts for the cockpit tile: open, underReview, recent24hResolved, recent24hDismissed.

Responses: 200 Public or optional auth
GET /v2/organizer/race-day/validation-queue/recent

Most recent OPEN/UNDER_REVIEW flags for the cockpit drawer (default 20, max 100).

Responses: 200 Public or optional auth

Organizer: Recommendations

4 operations

GET /v2/organizer/recommendations

List recommendations (defaults to OPEN).

Responses: 200 Auth required
POST /v2/organizer/recommendations/{id}/complete

Mark a recommendation as actioned.

Responses: 201 Auth required
POST /v2/organizer/recommendations/{id}/dismiss

Dismiss a recommendation.

Responses: 201 Auth required
POST /v2/organizer/recommendations/refresh

Regenerate recommendations (idempotent).

Responses: 201 Auth required

Organizer: Refunds

2 operations

GET /v2/organizer/refunds

Cross-event refund queue (PRD §35 / §72). Filterable by status / event / date. Cursor pagination.

Responses: 200 Auth required
POST /v2/organizer/refunds/quote

Deterministic pro-rated refund quote for an event cancellation. Preview only — no mutation.

Responses: 201 Auth required

Organizer: Reports

6 operations

GET /v2/organizer/reports

List the 5 PRD §42.7 standard report types + their shipped status. Use the `key` to call the per-report endpoints below.

Responses: 200 Auth required
GET /v2/organizer/reports/cash-flow

Cash Flow (PRD §42.7) — money in (settlement payouts received) vs money out (refunds disbursed). Both COMPLETED-status only. Net cash position + inflow/outflow counts.

Responses: 200 Auth required
GET /v2/organizer/reports/income-statement

Income Statement (PRD §42.7) — gross / commission / gateway / GST / net + reconciliation flag. Settlement-ledger aggregation.

Responses: 200 Auth required
GET /v2/organizer/reports/payment-method-breakdown

Payment Method Breakdown (PRD §42.7) — per-method volume + count + share %. Cross-org leak guard via EventParticipation→Event→Organizer chain. SUCCESS payments only.

Responses: 200 Auth required
GET /v2/organizer/reports/refund-analysis

Refund Analysis (PRD §42.7) — refund volume + per-reason mix + per-status breakdown + refundRate (refunds ÷ SUCCESS payments). Cross-org via Refund.participation.event.organizer.

Responses: 200 Auth required
GET /v2/organizer/reports/tax-liability

Tax Liability (PRD §42.7) — GST collected (ISSUED TaxInvoice rows) + TDS deducted (TdsDeduction rows scoped to deducteeType=ORGANIZER). Per-FY rollup + per-section TDS breakdown.

Responses: 200 Auth required

Organizer: SaaS Tier

4 operations

POST /v2/organizer/saas/cancel

POST /v2/organizer/saas/cancel

Responses: 201 Public or optional auth
GET /v2/organizer/saas/plans

GET /v2/organizer/saas/plans

Responses: 200 Public or optional auth
POST /v2/organizer/saas/subscribe

POST /v2/organizer/saas/subscribe

Responses: 201 Public or optional auth
GET /v2/organizer/saas/subscription

GET /v2/organizer/saas/subscription

Responses: 200 Public or optional auth

Organizer: Series Passes

7 operations

GET /v2/organizers/{organizerId}/series-passes

List series passes for this organizer.

Responses: 200 Auth required
POST /v2/organizers/{organizerId}/series-passes

Create a new series pass (DRAFT status).

Responses: 201 Auth required
GET /v2/organizers/{organizerId}/series-passes/{passId}

Get a single series pass by ID.

Responses: 200 Auth required
PATCH /v2/organizers/{organizerId}/series-passes/{passId}

Update a series pass (non-archived only).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/series-passes/{passId}/discount-stats

Compute discount stats: bundle vs sum of cheapest event tickets + savings + savings %.

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/series-passes/{passId}/registrations

List athlete registrations for this series pass.

Responses: 200 Auth required
PATCH /v2/organizers/{organizerId}/series-passes/{passId}/status

Transition pass status (DRAFT/PUBLISHED/CLOSED/ARCHIVED).

Responses: 200 Auth required

Organizer: Settlements

1 operations

GET /v2/organizer/settlements/events/{eventId}/summary

Per-event settlement summary for the Money tab (Missing-API P2, BACKEND_API_SPEC.md §2.3).

Responses: 200 Auth required

Organizer: Sponsorship marketplace

18 operations

GET /v2/organizer/brands

Browse the brand directory. Returns id, name, logo, description, industry, categories and more so the organizer can select a brand to approach.

Responses: 200 Public or optional auth
POST /v2/organizer/brands/{brandId}/sponsorship-proposals

Organizer sends outbound proposal directly to a brand.

Responses: 201 Public or optional auth
GET /v2/organizer/brands/{id}

Get a single brand profile (to review before sending a proposal).

Responses: 200 Public or optional auth
GET /v2/organizer/sponsorship-opportunities

List my sponsorship opportunities.

Responses: 200 Public or optional auth
POST /v2/organizer/sponsorship-opportunities

Create a sponsorship opportunity (DRAFT). priceMin and priceMax are required. Send as multipart/form-data and attach a media file (PDF or image ≤10 MB) under field "file" to describe what brands get instead of a mediaUrl — description is optional when a file is attached. Plain JSON body (no file) also still works. Optional openAt sets a scheduled open/start time, distinct from deadline (close time).

Responses: 201 Public or optional auth
DELETE /v2/organizer/sponsorship-opportunities/{id}

Delete a DRAFT opportunity. Returns 400 if the opportunity is OPEN, CLOSED, or FULFILLED — transition or cancel it first.

Responses: 200 Public or optional auth
GET /v2/organizer/sponsorship-opportunities/{id}

Get one of my opportunities by id.

Responses: 200 Public or optional auth
PATCH /v2/organizer/sponsorship-opportunities/{id}

Edit DRAFT or OPEN opportunity fields.

Responses: 200 Public or optional auth
POST /v2/organizer/sponsorship-opportunities/{id}/cancel

Cancel a DRAFT or OPEN opportunity — sets status to CLOSED. Returns 400 if already CLOSED or FULFILLED.

Responses: 201 Public or optional auth
POST /v2/organizer/sponsorship-opportunities/{id}/media

Upload a media file (PDF or image ≤10 MB) describing what brands get. Replaces the text description. Send as multipart/form-data with field name "file".

Responses: 201 Public or optional auth
GET /v2/organizer/sponsorship-opportunities/{id}/proposals

List proposals for one of my opportunities.

Responses: 200 Public or optional auth
POST /v2/organizer/sponsorship-opportunities/{id}/transition

Transition opportunity state (DRAFT→OPEN, OPEN→CLOSED, OPEN→FULFILLED).

Responses: 201 Public or optional auth
GET /v2/organizer/sponsorship-proposals

Unified inbox — all proposals across both lanes (opportunity + package) plus outbound proposals the organizer created directly.

Responses: 200 Public or optional auth
GET /v2/organizer/sponsorship-proposals/{id}

Get a single proposal detail (any lane).

Responses: 200 Public or optional auth
POST /v2/organizer/sponsorship-proposals/{id}/accept

Accept a proposal. Auto-declines every other PENDING proposal on the same opportunity and flips it to FULFILLED.

Responses: 201 Public or optional auth
POST /v2/organizer/sponsorship-proposals/{id}/counter

Counter a brand proposal with a new offer.

Responses: 201 Public or optional auth
POST /v2/organizer/sponsorship-proposals/{id}/decline

Decline a proposal.

Responses: 201 Public or optional auth
POST /v2/organizer/sponsorship-proposals/{id}/withdraw

Withdraw an outbound proposal the organizer sent (only works for ORGANIZER-initiated proposals in PENDING or COUNTERED state).

Responses: 201 Public or optional auth

Organizer: Standard event templates

3 operations

GET /v2/events/standard-templates

List the 8 platform-provided templates

Responses: 200 Public or optional auth
GET /v2/events/standard-templates/{key}

Get a single template by key

Responses: 200 Public or optional auth
POST /v2/events/standard-templates/{key}/instantiate

Hydrate a draft event-create payload from a template. Organizer reviews + edits before persisting.

Responses: 201 Public or optional auth

Organizer: Suggested Actions

5 operations

GET /v2/organizer/suggested-actions

List suggested actions (defaults to OPEN).

Responses: 200 Auth required
POST /v2/organizer/suggested-actions/{id}/complete

Mark a suggested action complete.

Responses: 201 Auth required
POST /v2/organizer/suggested-actions/{id}/dismiss

Dismiss a suggested action.

Responses: 201 Auth required
POST /v2/organizer/suggested-actions/{id}/snooze

Snooze a suggested action for N days.

Responses: 201 Auth required
POST /v2/organizer/suggested-actions/refresh

Regenerate suggested actions from current signals (idempotent).

Responses: 201 Auth required

Organizer: Tax

13 operations

GET /v2/organizer/tax/documents

List the organizer-uploaded tax documents.

Responses: 200 Public or optional auth
POST /v2/organizer/tax/documents

Register a tax document (metadata + file ref).

Responses: 201 Public or optional auth
PATCH /v2/organizer/tax/documents/{id}

Update a tax document status (or archive).

Responses: 200 Public or optional auth
GET /v2/organizer/tax/events/{eventId}/rollup

Per-event tax report rollup (PRD §42.5 G-42-13) — totals + filing-ready (ISSUED-only) + per-status breakdown + FY list.

Responses: 200 Public or optional auth
GET /v2/organizer/tax/form-16a

Form 16A certificates for this organizer. 194-O section only.

Responses: 200 Public or optional auth
GET /v2/organizer/tax/form-16a/{id}/pdf

Form 16A PDF descriptor (PRD §42.5). Ownership-guarded. 404 on cross-org access; 409 when status is DRAFT / CANCELLED or pdfUrl is missing.

Responses: 200 Public or optional auth
GET /v2/organizer/tax/invoices

List GST invoices for the caller organizer. Optional FY + status + eventId filter.

Responses: 200 Public or optional auth
GET /v2/organizer/tax/invoices/{id}

Get a single invoice by id.

Responses: 200 Public or optional auth
POST /v2/organizer/tax/invoices/{id}/issue

Attempt to issue a DRAFT invoice via ClearTax. Returns 503 when the vendor wiring is absent.

Responses: 201 Public or optional auth
GET /v2/organizer/tax/invoices/{id}/pdf

Generate / fetch the GST tax invoice PDF for the caller organizer (PRD §42.5 D-116). Lazy + cached on TaxInvoice.pdfS3Key. Returns S3 key + signed URL.

Responses: 200 Public or optional auth
GET /v2/organizer/tax/invoices/export.csv

CSV export of the caller organizer's tax invoices for a FY. Optional status filter.

Responses: 200 Public or optional auth
GET /v2/organizer/tax/tds/194o

194-O deductions against the caller organizer. Filter by FY + quarter.

Responses: 200 Public or optional auth
GET /v2/organizer/tax/tds/194o/export.csv

CSV export of the caller organizer's 194-O TDS rows for a FY. Optional quarter filter.

Responses: 200 Public or optional auth

Organizer: Team

5 operations

GET /v2/organizer/team

GET /v2/organizer/team

Responses: 200 Public or optional auth
DELETE /v2/organizer/team/{id}

DELETE /v2/organizer/team/{id}

Responses: 200 Public or optional auth
PATCH /v2/organizer/team/{id}

PATCH /v2/organizer/team/{id}

Responses: 200 Public or optional auth
GET /v2/organizer/team/activity

GET /v2/organizer/team/activity

Responses: 200 Public or optional auth
POST /v2/organizer/team/invite

POST /v2/organizer/team/invite

Responses: 201 Public or optional auth

Organizer: Ticket Bundles

5 operations

GET /v2/organizers/{organizerId}/ticket-bundles

List ticket bundles for this organizer.

Responses: 200 Auth required
POST /v2/organizers/{organizerId}/ticket-bundles

Capture an event's slots/tiers/refund/add-ons/coupons into a reusable bundle.

Responses: 201 Auth required
DELETE /v2/organizers/{organizerId}/ticket-bundles/{bundleId}

Delete a ticket bundle (soft).

Responses: 200 Auth required
GET /v2/organizers/{organizerId}/ticket-bundles/{bundleId}

Get one ticket bundle.

Responses: 200 Auth required
POST /v2/organizers/{organizerId}/ticket-bundles/{bundleId}/apply

Re-apply a bundle to a target event.

Responses: 201 Auth required

OrganizerPremiumEvent

22 operations

PUT /v2/organizers/events/{eventId}/badge

PUT /v2/organizers/events/{eventId}/badge

Responses: 200 Public or optional auth
POST /v2/organizers/events/{eventId}/badge/back-image

POST /v2/organizers/events/{eventId}/badge/back-image

Responses: 201 Public or optional auth
POST /v2/organizers/events/{eventId}/badge/icon

POST /v2/organizers/events/{eventId}/badge/icon

Responses: 201 Public or optional auth
GET /v2/organizers/events/{eventId}/deliverables

GET /v2/organizers/events/{eventId}/deliverables

Responses: 200 Public or optional auth
POST /v2/organizers/events/{eventId}/deliverables

POST /v2/organizers/events/{eventId}/deliverables

Responses: 201 Public or optional auth
DELETE /v2/organizers/events/{eventId}/deliverables/{definitionId}

DELETE /v2/organizers/events/{eventId}/deliverables/{definitionId}

Responses: 200 Public or optional auth
PATCH /v2/organizers/events/{eventId}/deliverables/{definitionId}

PATCH /v2/organizers/events/{eventId}/deliverables/{definitionId}

Responses: 200 Public or optional auth
POST /v2/organizers/events/{eventId}/deliverables/assets

POST /v2/organizers/events/{eventId}/deliverables/assets

Responses: 201 Public or optional auth
GET /v2/organizers/events/{eventId}/fulfilment

GET /v2/organizers/events/{eventId}/fulfilment

Responses: 200 Public or optional auth
PATCH /v2/organizers/events/{eventId}/fulfilment/{id}

PATCH /v2/organizers/events/{eventId}/fulfilment/{id}

Responses: 200 Public or optional auth
PATCH /v2/organizers/events/{eventId}/fulfilment/{id}/ship-via-shiprocket

PATCH /v2/organizers/events/{eventId}/fulfilment/{id}/ship-via-shiprocket

Responses: 200 Public or optional auth
POST /v2/organizers/events/{eventId}/participants/import/commit

POST /v2/organizers/events/{eventId}/participants/import/commit

Responses: 201 Public or optional auth
POST /v2/organizers/events/{eventId}/participants/import/preview

POST /v2/organizers/events/{eventId}/participants/import/preview

Responses: 201 Public or optional auth
GET /v2/organizers/events/{eventId}/participants/imported

GET /v2/organizers/events/{eventId}/participants/imported

Responses: 200 Public or optional auth
GET /v2/organizers/events/{eventId}/participants/imports

GET /v2/organizers/events/{eventId}/participants/imports

Responses: 200 Public or optional auth
GET /v2/organizers/events/{eventId}/participants/roster

GET /v2/organizers/events/{eventId}/participants/roster

Responses: 200 Public or optional auth
GET /v2/organizers/events/{eventId}/premium

GET /v2/organizers/events/{eventId}/premium

Responses: 200 Public or optional auth
PUT /v2/organizers/events/{eventId}/premium

PUT /v2/organizers/events/{eventId}/premium

Responses: 200 Public or optional auth
POST /v2/organizers/events/{eventId}/premium/brand-partner-logos

POST /v2/organizers/events/{eventId}/premium/brand-partner-logos

Responses: 201 Public or optional auth
GET /v2/organizers/events/{eventId}/premium/capabilities

GET /v2/organizers/events/{eventId}/premium/capabilities

Responses: 200 Public or optional auth
POST /v2/organizers/events/{eventId}/results/import/commit

POST /v2/organizers/events/{eventId}/results/import/commit

Responses: 201 Public or optional auth
POST /v2/organizers/events/{eventId}/results/import/preview

POST /v2/organizers/events/{eventId}/results/import/preview

Responses: 201 Public or optional auth

Organizers

21 operations

GET /v2/organizers

GET /v2/organizers

Responses: 200 Public or optional auth
POST /v2/organizers

Create a new organizer

Responses: 201 Public or optional auth
DELETE /v2/organizers/{id}

DELETE /v2/organizers/{id}

Responses: 200 Public or optional auth
GET /v2/organizers/{id}

GET /v2/organizers/{id}

Responses: 200 Public or optional auth
PATCH /v2/organizers/{id}

Update organizer

Responses: 200 Public or optional auth
GET /v2/organizers/{id}/business-kyc

Get business KYC documents by organizer ID

Get business KYC details for an organizer. Admin can view any organizer, organizer can only view their own.

Responses: 200 Public or optional auth
PATCH /v2/organizers/{id}/business-kyc

Update business KYC documents (Public)

Public endpoint for organizers to update KYC documents. Use this when documents were uploaded incorrectly or when approval was rejected. All fields are optional - only provided documents will be updated.

Responses: 200 Public or optional auth
POST /v2/organizers/{id}/business-kyc

Submit business KYC documents (Public)

Public endpoint for organizers to submit KYC documents. Required: businessRegistrationCertificate, panCard, and either gstRegistrationCertificate OR declarationForm (signed).

Responses: 201 Public or optional auth
GET /v2/organizers/{id}/declaration-form

Get declaration form with organizer data (Public)

Get the declaration form template filled with organizer data. Returns missing required fields if any.

Responses: 200 Public or optional auth
PATCH /v2/organizers/{id}/declaration-form-details

Update declaration form details (Public)

Update organizer details required for declaration form (PAN number, address, etc.)

Responses: 200 Public or optional auth
GET /v2/organizers/{id}/declaration-form/download

Download declaration form as PDF (Public)

Download the declaration form as PDF. All required fields must be filled before downloading.

Responses: 200 Public or optional auth
POST /v2/organizers/{id}/kyc/resubmit

Resubmit KYC after rejection — no auth required (Public)

Allows a REJECTED organizer to trigger a resubmit without a JWT. The organizer proves their identity by knowing their own organizerId (received in the verify-otp response). KYC must be in REJECTED or RESUBMIT state.

Responses: 201 Public or optional auth
PATCH /v2/organizers/{id}/toggle

PATCH /v2/organizers/{id}/toggle

Responses: 200 Public or optional auth
GET /v2/organizers/{organizerId}/shipping/pickup-address

GET /v2/organizers/{organizerId}/shipping/pickup-address

Responses: 200 Public or optional auth
POST /v2/organizers/{organizerId}/shipping/pickup-address

POST /v2/organizers/{organizerId}/shipping/pickup-address

Responses: 201 Public or optional auth
GET /v2/organizers/{orgId}/events

Get organizer's events for ad redirect selection

Get a list of events belonging to an organizer. Used for selecting event redirects in ad creation.

Responses: 200 Public or optional auth
POST /v2/organizers/create

Create organizer if not exists (Public)

Responses: 201 Public or optional auth
POST /v2/organizers/create/verified

Create an organizer after phone verification

Uses the authenticated user phone as proof and does not send a second signup OTP.

Responses: 201 Public or optional auth
GET /v2/organizers/me/memberships

List my organizer memberships + roles.

Responses: 200 Public or optional auth
GET /v2/organizers/me/onboarding-status

Get my organizer onboarding journey status (PRD §32.2).

Responses: 200 Public or optional auth
POST /v2/organizers/send-otp

POST /v2/organizers/send-otp

Responses: 201 Public or optional auth

Organizers — sponsorship money

1 operations

GET /v2/organizers/{organizerId}/sponsorship-earnings

Sponsorship money owed to or paid to this organizer. Same shape as the club surface.

Responses: 200 Public or optional auth

OrganizerStaffTasks

3 operations

GET /v2/organizer/staff-tasks

GET /v2/organizer/staff-tasks

Responses: 200 Public or optional auth
POST /v2/organizer/staff-tasks

POST /v2/organizer/staff-tasks

Responses: 201 Public or optional auth
PATCH /v2/organizer/staff-tasks/{taskId}/status

PATCH /v2/organizer/staff-tasks/{taskId}/status

Responses: 200 Public or optional auth

Participation Feed

1 operations

GET /v2/participation-feed

Following (graph) + For You (discovery) participation feed.

Responses: 200 Auth required

Partner Console: My Workspaces

2 operations

GET /v2/users/me/workspaces

GET /v2/users/me/workspaces

Responses: 200 Public or optional auth
POST /v2/users/me/workspaces/switch

Record a workspace switch in the append-only audit log. 403 if the caller does not belong to the target workspace.

Responses: 204 Public or optional auth

Partner Hub: My Preferences

2 operations

GET /v2/users/me/preferences

GET /v2/users/me/preferences

Responses: 200 Public or optional auth
PUT /v2/users/me/preferences

PUT /v2/users/me/preferences

Responses: 200 Public or optional auth

Photo Packages

2 operations

GET /v2/events/{eventId}/photo-packages

GET /v2/events/{eventId}/photo-packages

Responses: 200 Public or optional auth
GET /v2/events/{eventId}/photo-packages/{packageId}

GET /v2/events/{eventId}/photo-packages/{packageId}

Responses: 200 Public or optional auth

Podcasts

7 operations

GET /v2/podcasts

GET /v2/podcasts

Responses: 200 Public or optional auth
POST /v2/podcasts

POST /v2/podcasts

Responses: 201 Public or optional auth
DELETE /v2/podcasts/{id}

DELETE /v2/podcasts/{id}

Responses: 200 Public or optional auth
GET /v2/podcasts/{id}

GET /v2/podcasts/{id}

Responses: 200 Public or optional auth
PATCH /v2/podcasts/{id}

PATCH /v2/podcasts/{id}

Responses: 200 Public or optional auth
PATCH /v2/podcasts/{id}/review

PATCH /v2/podcasts/{id}/review

Responses: 200 Public or optional auth
PATCH /v2/podcasts/{id}/toggle

PATCH /v2/podcasts/{id}/toggle

Responses: 200 Public or optional auth

Privacy Policies

8 operations

GET /v2/privacy-policies

GET /v2/privacy-policies

Responses: 200 Auth required
POST /v2/privacy-policies

POST /v2/privacy-policies

Responses: 201 Auth required
DELETE /v2/privacy-policies/{id}

DELETE /v2/privacy-policies/{id}

Responses: 200 Auth required
GET /v2/privacy-policies/{id}

GET /v2/privacy-policies/{id}

Responses: 200 Auth required
PATCH /v2/privacy-policies/{id}

PATCH /v2/privacy-policies/{id}

Responses: 200 Auth required
GET /v2/privacy-policies/{id}/public

GET /v2/privacy-policies/{id}/public

Responses: 200 Auth required
PATCH /v2/privacy-policies/{id}/review

PATCH /v2/privacy-policies/{id}/review

Responses: 200 Auth required
PATCH /v2/privacy-policies/{id}/toggle

PATCH /v2/privacy-policies/{id}/toggle

Responses: 200 Auth required

Product Categories

7 operations

GET /v2/product-categories

Get all product categories

Responses: 200 Auth required
POST /v2/product-categories

Create a product category

Responses: 201 Auth required
DELETE /v2/product-categories/{id}

Delete a product category by id

Responses: 200 Auth required
GET /v2/product-categories/{id}

Get a product category by id

Responses: 200 Auth required
PATCH /v2/product-categories/{id}

Update a product category by id

Responses: 200 Auth required
PATCH /v2/product-categories/{id}/review

Review a product category by id

Responses: 200 Auth required
PATCH /v2/product-categories/{id}/toggle

Toggle a product category status

Responses: 200 Auth required

Products

7 operations

GET /v2/products

GET /v2/products

Responses: 200 Auth required
POST /v2/products

POST /v2/products

Responses: 201 Auth required
DELETE /v2/products/{id}

DELETE /v2/products/{id}

Responses: 200 Auth required
GET /v2/products/{id}

GET /v2/products/{id}

Responses: 200 Auth required
PATCH /v2/products/{id}

PATCH /v2/products/{id}

Responses: 200 Auth required
PATCH /v2/products/{id}/review

PATCH /v2/products/{id}/review

Responses: 200 Auth required
PATCH /v2/products/{id}/toggle

PATCH /v2/products/{id}/toggle

Responses: 200 Auth required

Programs — Reviews (Public)

1 operations

GET /v2/programs/{templateId}/reviews

List published reviews for a program. Public — anonymous browsers can see.

Responses: 200 Public or optional auth

Public Web

4 operations

GET /v2/public/og/challenges/{idOrSlug}.svg

GET /v2/public/og/challenges/{idOrSlug}.svg

Responses: 200 Public or optional auth
GET /v2/public/og/clubs/{idOrSlug}.svg

GET /v2/public/og/clubs/{idOrSlug}.svg

Responses: 200 Public or optional auth
GET /v2/public/og/events/{idOrSlug}.svg

GET /v2/public/og/events/{idOrSlug}.svg

Responses: 200 Public or optional auth
GET /v2/public/stats

GET /v2/public/stats

Responses: 200 Public or optional auth

Public: Brand Ambassadors

1 operations

GET /v2/public/brands/{slug}/ambassadors

GET /v2/public/brands/{slug}/ambassadors

Responses: 200 Public or optional auth

Public: Brand Discover

3 operations

GET /v2/brands/challenges/discover

§28 — public list of brand-sponsored challenges currently joinable.

Responses: 200 Public or optional auth
GET /v2/brands/discover

§47 — public catalogue of active sponsor brands for the mobile Discover screen

Responses: 200 Public or optional auth
GET /v2/brands/profile/{slug}

§47 — brand profile (logo, story, categories, kyc) for the mobile brand-detail screen

Responses: 200 Public or optional auth

Public: Client Error Ingress

1 operations

POST /v2/client-errors

POST /v2/client-errors

Responses: 204 Public or optional auth

Public: Client Event Ingress

1 operations

POST /v2/client-events

POST /v2/client-events

Responses: 204 Public or optional auth

Public: Club Awards

1 operations

GET /v2/clubs/{clubId}/awards

GET /v2/clubs/{clubId}/awards

Responses: 200 Public or optional auth

Public: Email Webhooks

1 operations

POST /v2/webhooks/postmark/inbound

Postmark Inbound Parse receiver. Auth via HTTP Basic Auth (recommended) or ?token= query.

Responses: 200 Public or optional auth

Public: Event Live

2 operations

GET /v2/events/{eventId}/live-counts

GET /v2/events/{eventId}/live-counts

Responses: 200 Public or optional auth
GET /v2/events/{eventId}/share-link

GET /v2/events/{eventId}/share-link

Responses: 200 Public or optional auth

Public: Event Photos

1 operations

GET /v2/events/{eventId}/photos

GET /v2/events/{eventId}/photos

Responses: 200 Public or optional auth

Public: Live Leaderboard

1 operations

GET /v2/live-leaderboards

GET /v2/live-leaderboards

Responses: 200 Public or optional auth

Public: Live tracking share recipient

2 operations

GET /v2/track/{token}

Fetch state for a live-tracking share. Token is HMAC-signed; recipient does NOT need a Repeak account.

Responses: 200 Public or optional auth
POST /v2/track/{token}/opt-out

Recipient opts out of the share. Idempotent — already-opted-out is treated as success.

Responses: 200 Public or optional auth

Public: Marketplace economics

1 operations

GET /v2/marketplace/economics

Public-safe active marketplace economics. Returns null fields + honest availability note when no ACTIVE config exists.

Responses: 200 Public or optional auth

Public: Observability

1 operations

GET /v2/observability/metrics-status

GET /v2/observability/metrics-status

Responses: 200 Public or optional auth

Public: Organizations

1 operations

GET /v2/organizations/{idOrSlug}

Public organization detail by id or slug.

Responses: 200 Public or optional auth

Public: Organizer Brand Page

3 operations

GET /v2/public/organizers/{slug}

GET /v2/public/organizers/{slug}

Responses: 200 Public or optional auth
GET /v2/public/organizers/events/{eventId}/prep-programs

GET /v2/public/organizers/events/{eventId}/prep-programs

Responses: 200 Public or optional auth
GET /v2/public/organizers/sitemap-rows

GET /v2/public/organizers/sitemap-rows

Responses: 200 Public or optional auth

Public: Payment Webhooks

5 operations

POST /v2/event-participations/webhooks/cashfree

POST /v2/event-participations/webhooks/cashfree

Responses: 200 Public or optional auth
POST /v2/payments/webhooks/cashfree

POST /v2/payments/webhooks/cashfree

Responses: 200 Public or optional auth
POST /v2/payments/webhooks/manual

POST /v2/payments/webhooks/manual

Responses: 200 Public or optional auth
POST /v2/payments/webhooks/razorpay

POST /v2/payments/webhooks/razorpay

Responses: 200 Public or optional auth
POST /v2/payments/webhooks/stripe

POST /v2/payments/webhooks/stripe

Responses: 200 Public or optional auth

Public: Pricing

1 operations

GET /v2/pricing/tiers

List ACTIVE pricing tiers, optionally filtered by audience.

Responses: 200 Public or optional auth

Public: Referrals

2 operations

GET /v2/referrals/by-code/{code}

GET /v2/referrals/by-code/{code}

Responses: 200 Public or optional auth
GET /v2/referrals/leaderboard

GET /v2/referrals/leaderboard

Responses: 200 Public or optional auth

Public: Sponsor brand profile

2 operations

GET /v2/public/brands/{slug}

Public sponsor brand profile by slug. Closed-allowlist projection — no contact email / KYC / audit fields.

Responses: 200 Public or optional auth
GET /v2/public/brands/{slug}/stories

Public list of PUBLISHED brand stories by slug (most recent first).

Responses: 200 Public or optional auth

Public: Subscription Webhooks

1 operations

POST /v2/subscriptions/webhooks/cashfree

Cashfree subscription webhook. HMAC-SHA256 signature required. Returns 503 SUBSCRIPTION_WEBHOOK_NOT_CONFIGURED when secret unset (no silent acceptance).

Responses: 200 Public or optional auth

Public: Unsubscribe

1 operations

POST /v2/unsubscribe/{token}

Confirm a recipient's unsubscribe from an organizer's marketing sends.

Responses: 201 Public or optional auth

Public: Wearable Webhooks

1 operations

POST /v2/integrations/wearables/terra/webhook

Terra webhook receiver. Verified with terra-signature HMAC; unsigned requests fail.

Responses: 200 Public or optional auth

RA Crew: Assignments

1 operations

POST /v2/assignments/{id}/respond

POST /v2/assignments/{id}/respond

Responses: 201 Public or optional auth

RA Crew: Attendance

7 operations

POST /v2/attendance/{id}/approve

POST /v2/attendance/{id}/approve

Responses: 201 Public or optional auth
POST /v2/attendance/check-in

POST /v2/attendance/check-in

Responses: 201 Public or optional auth
POST /v2/attendance/check-out

POST /v2/attendance/check-out

Responses: 201 Public or optional auth
GET /v2/attendance/me

GET /v2/attendance/me

Responses: 200 Public or optional auth
GET /v2/attendance/me/shifts

GET /v2/attendance/me/shifts

Responses: 200 Public or optional auth
GET /v2/attendance/pending

GET /v2/attendance/pending

Responses: 200 Public or optional auth
POST /v2/attendance/sync-batch

POST /v2/attendance/sync-batch

Responses: 201 Public or optional auth

RA Crew: Crew staffing (head)

5 operations

GET /v2/crew/events/{eventId}

GET /v2/crew/events/{eventId}

Responses: 200 Public or optional auth
GET /v2/crew/events/{eventId}/assignments

GET /v2/crew/events/{eventId}/assignments

Responses: 200 Public or optional auth
POST /v2/crew/events/{eventId}/assignments

POST /v2/crew/events/{eventId}/assignments

Responses: 201 Public or optional auth
DELETE /v2/crew/events/{eventId}/assignments/{id}

DELETE /v2/crew/events/{eventId}/assignments/{id}

Responses: 200 Public or optional auth
GET /v2/crew/events/{eventId}/crew

GET /v2/crew/events/{eventId}/crew

Responses: 200 Public or optional auth

RA Crew: Fulfillment (goodie handout)

7 operations

POST /v2/organizer/events/{eventId}/fulfillment/{handoutId}/undo

POST /v2/organizer/events/{eventId}/fulfillment/{handoutId}/undo

Responses: 201 Public or optional auth
POST /v2/organizer/events/{eventId}/fulfillment/handout

POST /v2/organizer/events/{eventId}/fulfillment/handout

Responses: 201 Public or optional auth
GET /v2/organizer/events/{eventId}/fulfillment/item-types

GET /v2/organizer/events/{eventId}/fulfillment/item-types

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/fulfillment/item-types

POST /v2/organizer/events/{eventId}/fulfillment/item-types

Responses: 201 Public or optional auth
GET /v2/organizer/events/{eventId}/fulfillment/participant

GET /v2/organizer/events/{eventId}/fulfillment/participant

Responses: 200 Public or optional auth
GET /v2/organizer/events/{eventId}/fulfillment/summary

GET /v2/organizer/events/{eventId}/fulfillment/summary

Responses: 200 Public or optional auth
POST /v2/organizer/events/{eventId}/fulfillment/sync-batch

POST /v2/organizer/events/{eventId}/fulfillment/sync-batch

Responses: 201 Public or optional auth

RA Crew: Org volunteers

13 operations

POST /v2/orgs/{orgId}/members/{membershipId}/reinstate

POST /v2/orgs/{orgId}/members/{membershipId}/reinstate

Responses: 201 Public or optional auth
POST /v2/orgs/{orgId}/members/{membershipId}/remove

POST /v2/orgs/{orgId}/members/{membershipId}/remove

Responses: 201 Public or optional auth
POST /v2/orgs/{orgId}/members/{membershipId}/respond

POST /v2/orgs/{orgId}/members/{membershipId}/respond

Responses: 201 Public or optional auth
POST /v2/orgs/{orgId}/members/{membershipId}/revoke

POST /v2/orgs/{orgId}/members/{membershipId}/revoke

Responses: 201 Public or optional auth
POST /v2/orgs/{orgId}/members/{membershipId}/role

POST /v2/orgs/{orgId}/members/{membershipId}/role

Responses: 201 Public or optional auth
POST /v2/orgs/{orgId}/members/invite

POST /v2/orgs/{orgId}/members/invite

Responses: 201 Public or optional auth
GET /v2/orgs/{orgId}/volunteer-heads

GET /v2/orgs/{orgId}/volunteer-heads

Responses: 200 Public or optional auth
POST /v2/orgs/{orgId}/volunteer-heads

POST /v2/orgs/{orgId}/volunteer-heads

Responses: 201 Public or optional auth
GET /v2/orgs/{orgId}/volunteers

GET /v2/orgs/{orgId}/volunteers

Responses: 200 Public or optional auth
POST /v2/orgs/{orgId}/volunteers

POST /v2/orgs/{orgId}/volunteers

Responses: 201 Public or optional auth
POST /v2/orgs/{orgId}/volunteers/{volunteerId}/head

POST /v2/orgs/{orgId}/volunteers/{volunteerId}/head

Responses: 201 Public or optional auth
POST /v2/orgs/{orgId}/volunteers/{volunteerId}/rate

POST /v2/orgs/{orgId}/volunteers/{volunteerId}/rate

Responses: 201 Public or optional auth
GET /v2/orgs/{orgId}/volunteers/pool

GET /v2/orgs/{orgId}/volunteers/pool

Responses: 200 Public or optional auth

RA Crew: Participant check-in

10 operations

POST /v2/crew/events/{eventId}/check-in/{checkinId}/undo

POST /v2/crew/events/{eventId}/check-in/{checkinId}/undo

Responses: 201 Public or optional auth
POST /v2/crew/events/{eventId}/check-in/addons/{addOnId}/collect

POST /v2/crew/events/{eventId}/check-in/addons/{addOnId}/collect

Responses: 201 Public or optional auth
GET /v2/crew/events/{eventId}/check-in/checked-in

GET /v2/crew/events/{eventId}/check-in/checked-in

Responses: 200 Public or optional auth
GET /v2/crew/events/{eventId}/check-in/participant/{participantId}

GET /v2/crew/events/{eventId}/check-in/participant/{participantId}

Responses: 200 Public or optional auth
POST /v2/crew/events/{eventId}/check-in/participant/{participantId}/undo

POST /v2/crew/events/{eventId}/check-in/participant/{participantId}/undo

Responses: 201 Public or optional auth
POST /v2/crew/events/{eventId}/check-in/scan

POST /v2/crew/events/{eventId}/check-in/scan

Responses: 201 Public or optional auth
POST /v2/crew/events/{eventId}/check-in/scan-by-bib

POST /v2/crew/events/{eventId}/check-in/scan-by-bib

Responses: 201 Public or optional auth
GET /v2/crew/events/{eventId}/check-in/search

GET /v2/crew/events/{eventId}/check-in/search

Responses: 200 Public or optional auth
POST /v2/crew/events/{eventId}/check-in/sync-batch

POST /v2/crew/events/{eventId}/check-in/sync-batch

Responses: 201 Public or optional auth
POST /v2/crew/events/{eventId}/participant/{participantId}/collect-bib

POST /v2/crew/events/{eventId}/participant/{participantId}/collect-bib

Responses: 201 Public or optional auth

RA Crew: Staffing

3 operations

GET /v2/events/{eventId}/assignments

GET /v2/events/{eventId}/assignments

Responses: 200 Public or optional auth
POST /v2/events/{eventId}/assignments

POST /v2/events/{eventId}/assignments

Responses: 201 Public or optional auth
DELETE /v2/events/{eventId}/assignments/{id}

DELETE /v2/events/{eventId}/assignments/{id}

Responses: 200 Public or optional auth

RA Crew: Supervisor dashboard

1 operations

GET /v2/crew/orgs/{orgId}/events/{eventId}/dashboard

GET /v2/crew/orgs/{orgId}/events/{eventId}/dashboard

Responses: 200 Public or optional auth

RA Crew: Volunteer (me)

11 operations

POST /v2/volunteers/me/consent

POST /v2/volunteers/me/consent

Responses: 201 Public or optional auth
PATCH /v2/volunteers/me/discoverable

PATCH /v2/volunteers/me/discoverable

Responses: 200 Public or optional auth
GET /v2/volunteers/me/events

GET /v2/volunteers/me/events

Responses: 200 Public or optional auth
GET /v2/volunteers/me/invites

GET /v2/volunteers/me/invites

Responses: 200 Public or optional auth
POST /v2/volunteers/me/invites/{id}/respond

POST /v2/volunteers/me/invites/{id}/respond

Responses: 201 Public or optional auth
GET /v2/volunteers/me/memberships

GET /v2/volunteers/me/memberships

Responses: 200 Public or optional auth
GET /v2/volunteers/me/profile

GET /v2/volunteers/me/profile

Responses: 200 Public or optional auth
PATCH /v2/volunteers/me/profile

PATCH /v2/volunteers/me/profile

Responses: 200 Public or optional auth
GET /v2/volunteers/me/shifts

GET /v2/volunteers/me/shifts

Responses: 200 Public or optional auth
GET /v2/volunteers/me/volunteered-events

GET /v2/volunteers/me/volunteered-events

Responses: 200 Public or optional auth
GET /v2/volunteers/me/volunteered-events/{eventId}

GET /v2/volunteers/me/volunteered-events/{eventId}

Responses: 200 Public or optional auth

RA Crew: Volunteer (public)

1 operations

GET /v2/volunteers/{userId}/statistics

GET /v2/volunteers/{userId}/statistics

Responses: 200 Public or optional auth

ra-crew

3 operations

DELETE /v2/ra-crew/push-token

Unregister push token (logout)

Responses: 204 Public or optional auth
POST /v2/ra-crew/push-token

Register or refresh FCM push token

Responses: 204 Public or optional auth
POST /v2/ra-crew/push-token/test

Send a test push to the calling user (debug)

Responses: 204 Public or optional auth

Race Day Aggregate

1 operations

GET /v2/organizers/{organizerId}/race-day-aggregate/today

Per-event headline counts + organizer-wide totals for events within ±24h (PRD §44 R9).

Responses: 200 Auth required

Race Day Dashboard

4 operations

GET /v2/organizers/events/{eventId}/race-day-dashboard

Get race-day dashboard snapshot (PRD §36.1 single pane of glass).

Responses: 200 Auth required
GET /v2/organizers/events/{eventId}/race-day-dashboard/check-in-rate

Check-in rate over time series — bucketed CHECKED_IN counts (PRD §43.5 G-43-14).

Responses: 200 Auth required
GET /v2/organizers/events/{eventId}/race-day-dashboard/progress-buckets

Race-day deeper analytics: per-wave progress, km histogram, late finishers (PRD §36.1 / §36.4 R8).

Responses: 200 Auth required
GET /v2/organizers/events/{eventId}/race-day-dashboard/volunteer-performance

Per-volunteer scan performance rollup (PRD §43.5 G-43-16).

Responses: 200 Auth required

Race Signing

2 operations

POST /v2/security/race-signing/session

POST /v2/security/race-signing/session

Responses: 201 Public or optional auth
DELETE /v2/security/race-signing/session/{signingSessionId}

DELETE /v2/security/race-signing/session/{signingSessionId}

Responses: 200 Public or optional auth

Race-day companion

3 operations

GET /v2/hybrid-race/races/{hybridRaceId}/chat

GET /v2/hybrid-race/races/{hybridRaceId}/chat

Responses: 200 Public or optional auth
POST /v2/hybrid-race/results/{resultId}/cheer

POST /v2/hybrid-race/results/{resultId}/cheer

Responses: 201 Public or optional auth
GET /v2/hybrid-race/results/{resultId}/cheers

GET /v2/hybrid-race/results/{resultId}/cheers

Responses: 200 Public or optional auth

Reviews

7 operations

GET /v2/reviews

GET /v2/reviews

Responses: 200 Public or optional auth
POST /v2/reviews

POST /v2/reviews

Responses: 201 Public or optional auth
DELETE /v2/reviews/{id}

DELETE /v2/reviews/{id}

Responses: 200 Public or optional auth
GET /v2/reviews/{id}

GET /v2/reviews/{id}

Responses: 200 Public or optional auth
PATCH /v2/reviews/{id}

PATCH /v2/reviews/{id}

Responses: 200 Public or optional auth
GET /v2/reviews/item

GET /v2/reviews/item

Responses: 200 Public or optional auth
GET /v2/reviews/stats

GET /v2/reviews/stats

Responses: 200 Public or optional auth

Routes (B22)

7 operations

GET /v2/routes

GET /v2/routes

Responses: 200 Public or optional auth
GET /v2/routes/{id}

GET /v2/routes/{id}

Responses: 200 Public or optional auth
POST /v2/routes/{id}/mark-started

POST /v2/routes/{id}/mark-started

Responses: 201 Public or optional auth
DELETE /v2/routes/{id}/save

DELETE /v2/routes/{id}/save

Responses: 200 Public or optional auth
POST /v2/routes/{id}/save

POST /v2/routes/{id}/save

Responses: 201 Public or optional auth
GET /v2/routes/nearby

GET /v2/routes/nearby

Responses: 200 Public or optional auth
GET /v2/routes/saved

GET /v2/routes/saved

Responses: 200 Public or optional auth

Schedules

5 operations

GET /v2/schedules

GET /v2/schedules

Responses: 200 Public or optional auth
POST /v2/schedules

POST /v2/schedules

Responses: 201 Public or optional auth
DELETE /v2/schedules/{id}

DELETE /v2/schedules/{id}

Responses: 200 Public or optional auth
GET /v2/schedules/{id}

GET /v2/schedules/{id}

Responses: 200 Public or optional auth
PATCH /v2/schedules/{id}

PATCH /v2/schedules/{id}

Responses: 200 Public or optional auth

Server Health

3 operations

GET /health

GET /health

Responses: 200, 503 Public or optional auth
GET /health/live

GET /health/live

Responses: 200 Public or optional auth
GET /health/ready

GET /health/ready

Responses: 200, 503 Public or optional auth

Server time

1 operations

GET /v2/time/now

GET /v2/time/now

Responses: 200 Public or optional auth

Settings

4 operations

GET /v2/settings

Get current settings

Get platform settings including fees, taxes, and training plan pricing (trainingPlanNormalPrice, trainingPlanAdvancedPrice, trainingPlanMinDaysBeforeEvent)

Responses: 200 Public or optional auth
PATCH /v2/settings

Update settings (Admin only)

Update platform settings. Use this to update training plan pricing: trainingPlanNormalPrice (default ₹999 per PRD §22.9), trainingPlanAdvancedPrice (default ₹2,999 per PRD §22.9), trainingPlanMinDaysBeforeEvent (default 15 days). Sprint 1 Session 8 fix: previous "₹9 / ₹15" Swagger defaults were USD-looking test units inconsistent with the PRD INR ranges (₹999–2,999 standard, ₹4,999–9,999 coach-attached).

Responses: 200, 403 Public or optional auth
POST /v2/settings

Create settings (Admin only)

Create platform settings including fees, taxes, and training plan pricing

Responses: 201, 403 Public or optional auth
GET /v2/settings/public

Get current settings

Get platform settings including fees, taxes, and training plan pricing (trainingPlanNormalPrice, trainingPlanAdvancedPrice, trainingPlanMinDaysBeforeEvent)

Responses: 200 Public or optional auth

Settlements

18 operations

GET /v2/settlements

Get all settlements (Admin only). Pass `page` to opt into paginated response `{ items, meta }`; absent `page` returns the legacy unpaginated array.

Responses: 200 Auth required
GET /v2/settlements/{id}

Get settlement by ID (Admin only)

Responses: 200 Auth required
PATCH /v2/settlements/{id}

Update settlement (Admin only)

Responses: 200 Auth required
POST /v2/settlements/{id}/accept-drift

Accept a flagged drift on a single settlement. Transitions FLAGGED → ACCEPTED_MANUAL.

Responses: 201 Auth required
GET /v2/settlements/{id}/detailed

Get detailed settlement with payment breakdown (Admin only)

Responses: 200 Auth required
POST /v2/settlements/{id}/hold

Put settlement on hold (Admin only)

Responses: 201 Auth required
POST /v2/settlements/{id}/payout/initiate

Initiate automated payout transfer for an ELIGIBLE settlement (Admin only)

Routes through `PayoutRoutingService` to attempt a provider-driven transfer (Stripe Connect / Razorpay Routes / future). Lifecycle: ELIGIBLE → PROCESSING → COMPLETED on provider success, ELIGIBLE on UNSUPPORTED/FAILED so the operator can retry the manual `processSettlement(transactionId)` paste-flow. Idempotent — a settlement with an existing transactionId rejects to prevent double-transfer.

Responses: 201 Auth required
POST /v2/settlements/{id}/process

Process settlement - Mark as completed with transaction ID (Admin only)

Admin can manually mark a settlement as completed after transferring funds. This works even for settlements that were on hold due to KYC issues.

Responses: 201 Auth required
POST /v2/settlements/{id}/refresh-kyc

Refresh settlement KYC status (Admin only)

Re-check the organizer KYC and bank details status. If now complete, settlement will move from on_hold to pending.

Responses: 201 Auth required
POST /v2/settlements/baseline-drift

One-shot baseline sweep: seal all FLAGGED settlements as ACCEPTED_BASELINE. Requires confirm=true and a matching expectedCount; mismatched count returns 409 with actualCount.

Responses: 201 Auth required
GET /v2/settlements/drift/count

Drift state breakdown across the three reviewable statuses. Powers the baseline-sweep modal (reads byStatus.flagged) and the drift-queue header per-state summary.

Responses: 200 Auth required
GET /v2/settlements/eligible

Get settlements eligible for processing (Admin only)

Responses: 200 Auth required
GET /v2/settlements/export

Download filtered settlements as CSV. Hard 50k row cap; filter that selects more returns 400 with actual count.

Responses: 200 Auth required
GET /v2/settlements/organizer/{organizerId}

Get settlements for an organizer

Responses: 200 Auth required
GET /v2/settlements/organizer/{organizerId}/settlement/{settlementId}

Get detailed settlement for organizer

Returns full settlement details including earnings breakdown, deductions, payment list per user, and KYC status.

Responses: 200 Auth required
GET /v2/settlements/rollup/by-organizer

Rollup settlement totals grouped by organizer. Optional organizerIds filter (comma-separated).

Responses: 200 Auth required
GET /v2/settlements/rollup/by-organizer-stream

Rollup one organizer across all six streams. Required: organizerId.

Responses: 200 Auth required
GET /v2/settlements/rollup/by-stream

Rollup settlement totals grouped by stream. Optional status + date range filters.

Responses: 200 Auth required

Share + Year-in-Sport

5 operations

POST /v2/share/completed

POST /v2/share/completed

Responses: 202 Public or optional auth
POST /v2/share/initiated

POST /v2/share/initiated

Responses: 202 Public or optional auth
POST /v2/share/install-attributed

POST /v2/share/install-attributed

Responses: 202 Public or optional auth
POST /v2/share/link-opened

POST /v2/share/link-opened

Responses: 202 Public or optional auth
GET /v2/share/year-in-sport/{userId}/{year}

GET /v2/share/year-in-sport/{userId}/{year}

Responses: 200 Public or optional auth

Sports

16 operations

GET /v2/sports

GET /v2/sports

Responses: 200 Public or optional auth
POST /v2/sports

POST /v2/sports

Responses: 201 Public or optional auth
DELETE /v2/sports/{id}

DELETE /v2/sports/{id}

Responses: 200 Public or optional auth
GET /v2/sports/{id}

GET /v2/sports/{id}

Responses: 200 Public or optional auth
PATCH /v2/sports/{id}

PATCH /v2/sports/{id}

Responses: 200 Public or optional auth
GET /v2/sports/{id}/challenges

GET /v2/sports/{id}/challenges

Responses: 200 Public or optional auth
GET /v2/sports/{id}/topics

GET /v2/sports/{id}/topics

Responses: 200 Public or optional auth
POST /v2/sports/{id}/topics

POST /v2/sports/{id}/topics

Responses: 201 Public or optional auth
DELETE /v2/sports/{id}/topics/{topicId}

DELETE /v2/sports/{id}/topics/{topicId}

Responses: 200 Public or optional auth
PATCH /v2/sports/{id}/topics/{topicId}

PATCH /v2/sports/{id}/topics/{topicId}

Responses: 200 Public or optional auth
GET /v2/sports/{id}/topics/{topicId}/subtopics

GET /v2/sports/{id}/topics/{topicId}/subtopics

Responses: 200 Public or optional auth
POST /v2/sports/{id}/topics/{topicId}/subtopics

POST /v2/sports/{id}/topics/{topicId}/subtopics

Responses: 201 Public or optional auth
DELETE /v2/sports/{id}/topics/{topicId}/subtopics/{subtopicId}

DELETE /v2/sports/{id}/topics/{topicId}/subtopics/{subtopicId}

Responses: 200 Public or optional auth
PATCH /v2/sports/{id}/topics/{topicId}/subtopics/{subtopicId}

PATCH /v2/sports/{id}/topics/{topicId}/subtopics/{subtopicId}

Responses: 200 Public or optional auth
PUT /v2/sports/{id}/topics/{topicId}/subtopics/order

PUT /v2/sports/{id}/topics/{topicId}/subtopics/order

Responses: 200 Public or optional auth
PUT /v2/sports/{id}/topics/order

PUT /v2/sports/{id}/topics/order

Responses: 200 Public or optional auth

Subscriptions: IAP

6 operations

POST /v2/iap/apple/notifications

App Store Server Notifications v2. Authenticated by Apple JWS signature (x5c chain to a pinned root). Idempotent on notificationUUID.

Responses: 201 Public or optional auth
POST /v2/iap/google/notifications

POST /v2/iap/google/notifications

Responses: 200 Public or optional auth
POST /v2/iap/ops/lifecycle-sweep

Run the lifecycle sweep. Bearer-authenticated with SUBSCRIPTION_OPS_TOKEN, for Cloud Scheduler. Idempotent. 503 when the token is unset.

Responses: 201 Public or optional auth
GET /v2/me/iap/config

Native IAP bootstrap. `enabled:false` means no store query or paywall.

Responses: 200 Public or optional auth
POST /v2/me/iap/purchase

Report a completed store purchase. The token is VERIFIED against the store; the client body never grants entitlement.

Responses: 201 Public or optional auth
POST /v2/me/iap/sync

Re-read the caller’s subscriptions from the stores and apply what changed. Backs Restore Purchases.

Responses: 201 Public or optional auth

Subscriptions: Me

2 operations

GET /v2/me/entitlements

Resolved plan + features + limits + usage for the caller. The single contract clients render from.

Responses: 200 Public or optional auth
GET /v2/subscriptions/catalog

Purchasable plans for an audience, priced for a country. Replaces client-side price tables.

Responses: 200 Public or optional auth

Subscriptions: Plans + entitlements

3 operations

GET /v2/me/subscription

Resolve my effective plan + entitlements (legacy shape — prefer GET /v2/me/entitlements).

Responses: 200 Public or optional auth
GET /v2/me/subscription/upgrade-intent

Record upgrade intent. If the target plan has no provider plan ID configured, returns 503 + caller must surface waitlist UX.

Responses: 200 Public or optional auth
GET /v2/subscriptions/plans

List subscription plans (catalog, read-only). Optionally filter by audience.

Responses: 200 Public or optional auth

Subscriptions: Quote

1 operations

POST /v2/subscriptions/quote

Price a plan for the caller, optionally applying a coupon. Returns line items: base → discount → tax → payable.

Responses: 201 Public or optional auth

Support Tickets

18 operations

GET /v2/support-tickets

Get all support tickets (user sees only their tickets)

Responses: 200 Auth required
POST /v2/support-tickets

Create a new support ticket

Responses: 201 Auth required
GET /v2/support-tickets/{id}

Get support ticket by ID

Responses: 200 Auth required
PATCH /v2/support-tickets/{id}

Update support ticket

Responses: 200 Auth required
GET /v2/support-tickets/{id}/attachments

Get all attachments for a support ticket

Responses: 200 Auth required
POST /v2/support-tickets/{id}/attachments

Upload attachments to a support ticket

Responses: 201 Auth required
POST /v2/support-tickets/{id}/messages

Add message to support ticket

Responses: 201 Auth required
GET /v2/support-tickets/{id}/messages/{messageId}/attachments

Get all attachments for a message

Responses: 200 Auth required
POST /v2/support-tickets/{id}/messages/{messageId}/attachments

Upload attachments to a message

Responses: 201 Auth required
POST /v2/support-tickets/{id}/rating

Add user rating to resolved/closed ticket

Responses: 200 Auth required
GET /v2/support-tickets/{id}/sla

Compute SLA breach status for a ticket (admin-visible UI hint).

Responses: 200 Auth required
GET /v2/support-tickets/by-ticket-number/{ticketNumber}

Get support ticket by ticket number

Responses: 200 Auth required
GET /v2/support-tickets/challenge-participation/{challengeParticipationId}

Get support tickets for a challenge participation

Responses: 200 Auth required
GET /v2/support-tickets/event-participation/{eventParticipationId}

Get support tickets for an event participation

Responses: 200 Auth required
GET /v2/support-tickets/my-tickets

Get current user tickets

Responses: 200 Auth required
GET /v2/support-tickets/my-tickets/stats

Get current user ticket statistics

Responses: 200 Auth required
POST /v2/support-tickets/public-contact

Submit a contact-form enquiry from the marketing site

Responses: 201 Auth required
POST /v2/support-tickets/suggest-articles

Return KB articles relevant to the draft subject + description. No ticket created.

Responses: 200 Auth required

Targets

5 operations

GET /v2/targets

Retrieve multiple Targets

Responses: 200 Public or optional auth
POST /v2/targets

Create a single Target

Responses: 201 Public or optional auth
DELETE /v2/targets/{id}

Delete a single Target

Responses: 200 Public or optional auth
GET /v2/targets/{id}

Retrieve a single Target

Responses: 200 Public or optional auth
PATCH /v2/targets/{id}

Update a single Target

Responses: 200 Public or optional auth

Terms and Conditions

8 operations

GET /v2/terms-and-conditions

GET /v2/terms-and-conditions

Responses: 200 Auth required
POST /v2/terms-and-conditions

POST /v2/terms-and-conditions

Responses: 201 Auth required
DELETE /v2/terms-and-conditions/{id}

DELETE /v2/terms-and-conditions/{id}

Responses: 200 Auth required
GET /v2/terms-and-conditions/{id}

GET /v2/terms-and-conditions/{id}

Responses: 200 Auth required
PATCH /v2/terms-and-conditions/{id}

PATCH /v2/terms-and-conditions/{id}

Responses: 200 Auth required
GET /v2/terms-and-conditions/{id}/public

GET /v2/terms-and-conditions/{id}/public

Responses: 200 Auth required
PATCH /v2/terms-and-conditions/{id}/review

PATCH /v2/terms-and-conditions/{id}/review

Responses: 200 Auth required
PATCH /v2/terms-and-conditions/{id}/toggle

PATCH /v2/terms-and-conditions/{id}/toggle

Responses: 200 Auth required

Ticket Templates

7 operations

GET /v2/ticket-templates

GET /v2/ticket-templates

Responses: 200 Auth required
POST /v2/ticket-templates

POST /v2/ticket-templates

Responses: 201 Auth required
DELETE /v2/ticket-templates/{id}

DELETE /v2/ticket-templates/{id}

Responses: 200 Auth required
GET /v2/ticket-templates/{id}

GET /v2/ticket-templates/{id}

Responses: 200 Auth required
PATCH /v2/ticket-templates/{id}

PATCH /v2/ticket-templates/{id}

Responses: 200 Auth required
PATCH /v2/ticket-templates/{id}/review

PATCH /v2/ticket-templates/{id}/review

Responses: 200 Auth required
PATCH /v2/ticket-templates/{id}/toggle

PATCH /v2/ticket-templates/{id}/toggle

Responses: 200 Auth required

Ticket Types

6 operations

GET /v2/ticket-types

GET /v2/ticket-types

Responses: 200 Public or optional auth
POST /v2/ticket-types

POST /v2/ticket-types

Responses: 201 Public or optional auth
DELETE /v2/ticket-types/{id}

DELETE /v2/ticket-types/{id}

Responses: 200 Public or optional auth
GET /v2/ticket-types/{id}

GET /v2/ticket-types/{id}

Responses: 200 Public or optional auth
PATCH /v2/ticket-types/{id}

PATCH /v2/ticket-types/{id}

Responses: 200 Public or optional auth
PATCH /v2/ticket-types/{id}/review

PATCH /v2/ticket-types/{id}/review

Responses: 200 Public or optional auth

Training (unified)

6 operations

GET /v2/training/plans

§22 — list every training plan owned by the caller across all source systems.

Responses: 200 Public or optional auth
POST /v2/training/plans/{templateId}/enroll

§22 — enrol the caller in an athlete-program template (delegates to ProgramEnrollmentService).

Responses: 201 Public or optional auth
GET /v2/training/plans/active

§22 — return the single active plan across all source systems, or null.

Responses: 200 Public or optional auth
POST /v2/training/plans/generate

§22 — generate a new plan. Routes to adaptive or legacy AI chat plan generators based on sourceSystem.

Responses: 201 Public or optional auth
GET /v2/training/upcoming-workouts

§22 — upcoming workouts merged across the caller's active plans (all source systems).

Responses: 200 Public or optional auth
POST /v2/training/workouts/{workoutId}/complete

§22 — mark a workout/session complete. Adaptive supports direct complete; legacy and program enrollments require activity submission.

Responses: 201 Public or optional auth

Training Plans

25 operations

DELETE /v2/user/training-plans

Delete all training plans

Soft deletes all training plans for the current user

Responses: 200 Public or optional auth
GET /v2/user/training-plans

Get all training plans for current user

Returns all training plans created by the current user

Responses: 200 Public or optional auth
DELETE /v2/user/training-plans/{id}

Delete training plan

Soft deletes a training plan and all associated workouts

Responses: 200, 404 Public or optional auth
GET /v2/user/training-plans/{id}

Get training plan by ID

Returns a specific training plan with all daily workouts

Responses: 200, 404 Public or optional auth
POST /v2/user/training-plans/{id}/adjust

Adjust training plan (GOAT plan only)

Modifies the training plan based on progress, injuries, schedule conflicts, or performance issues using AI. Only available for GOAT plan subscribers.

Responses: 200, 400, 403, 404 Public or optional auth
GET /v2/user/training-plans/{id}/adjustment-suggestions

Get AI-powered adjustment suggestions (GOAT plan only)

Returns automated suggestions for plan adjustments based on current progress without applying them. Only available for GOAT plan subscribers.

Responses: 200, 403, 404 Public or optional auth
GET /v2/user/training-plans/{id}/fitness-history

Get historical fitness scores (ATHLETE & GOAT plans)

Returns fitness score history over the past weeks to show trends and improvements. Available for ATHLETE and GOAT plan subscribers.

Responses: 200, 403, 404 Public or optional auth
GET /v2/user/training-plans/{id}/fitness-score

Get comprehensive fitness score (ATHLETE & GOAT plans)

Calculates overall fitness score with breakdowns for consistency, volume, intensity, and progression. Includes readiness assessment and projected performance. Available for ATHLETE and GOAT plan subscribers.

Responses: 200, 403, 404 Public or optional auth
POST /v2/user/training-plans/{id}/match-activity

Match activity to training plan workout

Automatically matches a tracked activity to the scheduled workout and updates completion status

Responses: 200, 404 Public or optional auth
GET /v2/user/training-plans/{id}/progress

Get training plan progress

Returns statistics about plan completion including completed, missed, and pending workouts

Responses: 200 Public or optional auth
GET /v2/user/training-plans/{id}/workouts/{workoutId}

Get a specific workout

Returns details of a specific workout from a training plan

Responses: 200, 404 Public or optional auth
PATCH /v2/user/training-plans/{id}/workouts/{workoutId}

Update workout status

Update workout completion status and actual performance data

Responses: 200, 404 Public or optional auth
POST /v2/user/training-plans/chat

Send message to AI fitness chatbot

Chat with AI assistant about fitness, nutrition, training, and events. Requires an active training plan.

Responses: 200, 403 Public or optional auth
GET /v2/user/training-plans/chat/access

Check chatbot access

Checks if user has access to the AI chatbot (requires active training plan)

Responses: 200 Public or optional auth
GET /v2/user/training-plans/chat/sessions

Get all chat sessions

Returns list of all chat sessions for the user

Responses: 200 Public or optional auth
DELETE /v2/user/training-plans/chat/sessions/{sessionId}

Delete a chat session

Deletes all messages in a chat session

Responses: 200 Public or optional auth
GET /v2/user/training-plans/chat/sessions/{sessionId}

Get chat history for a session

Returns all messages in a specific chat session

Responses: 200 Public or optional auth
POST /v2/user/training-plans/generate

Generate AI-based training plan

Creates a personalized training plan using AI based on user profile and event details

Responses: 201, 400 Public or optional auth
POST /v2/user/training-plans/generate-test

Generate AI-based training plan (DEV/TEST MODE)

Seeds a training plan against a hardcoded test event fixture. Refuses to run outside NODE_ENV=development|test so this dev-only helper can never be fired from production.

Responses: 201, 403 Public or optional auth
GET /v2/user/training-plans/offer/{eventId}

Get training plan offer for an event

Check eligibility and get pricing for training plan purchase for a specific event

Responses: 200, 404 Public or optional auth
GET /v2/user/training-plans/pricing

Get training plan pricing

Get current pricing for Normal and Advanced training plans

Responses: 200 Public or optional auth
POST /v2/user/training-plans/purchase/generate

Generate training plan

Generates the training plan. For free plans, generates directly. For paid plans, verifies payment first then generates.

Responses: 201, 400, 404 Public or optional auth
POST /v2/user/training-plans/purchase/initiate

Initiate training plan purchase

Creates a Cashfree payment order for training plan purchase. Returns payment session for completing payment.

Responses: 200, 400, 404 Public or optional auth
POST /v2/user/training-plans/purchase/verify

[DEPRECATED] Verify training plan purchase and generate plan

Verifies payment completion and generates the training plan. Use /purchase/verify-payment and /purchase/generate separately instead.

Responses: 200, 400, 404 Public or optional auth
POST /v2/user/training-plans/purchase/verify-payment

Verify payment status only

Verifies payment completion without generating the training plan. Use this to check payment status before generating the plan.

Responses: 200, 404 Public or optional auth

Training templates

2 operations

GET /v2/training-templates

GET /v2/training-templates

Responses: 200 Public or optional auth
GET /v2/training-templates/{id}

GET /v2/training-templates/{id}

Responses: 200 Public or optional auth

Triathlon

3 operations

GET /v2/activities/{activityId}/triathlon-legs

GET /v2/activities/{activityId}/triathlon-legs

Responses: 200 Public or optional auth
PUT /v2/activities/{activityId}/triathlon-legs

PUT /v2/activities/{activityId}/triathlon-legs

Responses: 200 Public or optional auth
PATCH /v2/triathlon-legs/{legId}/complete

PATCH /v2/triathlon-legs/{legId}/complete

Responses: 200 Public or optional auth

User — Notification Center (§29)

6 operations

GET /v2/user/me/notifications

List athlete notifications with filters + cursor pagination + unread count + push-token registration status. Owner-only.

Responses: 200 Public or optional auth
DELETE /v2/user/me/notifications/{notificationId}

Dismiss a single notification (soft delete). Persists so it does not resurface on the next GET — owner-only, 404's on cross-user id.

Responses: 200 Public or optional auth
POST /v2/user/me/notifications/{notificationId}/dismiss

Dismiss a single notification — same as DELETE :notificationId, exposed under the POST .../dismiss convention already used by the organizer recommendations/suggested-actions dismiss routes and the mobile client.

Responses: 201 Public or optional auth
POST /v2/user/me/notifications/{notificationId}/read

Mark a single notification read.

Responses: 201 Public or optional auth
POST /v2/user/me/notifications/read-all

Mark every unread notification read.

Responses: 201 Public or optional auth
GET /v2/user/me/notifications/unread-count

Athlete unread notification count.

Responses: 200 Public or optional auth

User — Notification Preferences (§29)

2 operations

GET /v2/user/me/notification-preferences

Get the athlete notification preferences (per-type isEnabled + per-channel toggles + quietHours + channelSupport). Owner-only.

Responses: 200 Public or optional auth
PATCH /v2/user/me/notification-preferences

Patch the athlete notification preferences. Persists per-type + per-channel + quietHours; returns the refreshed shape.

Responses: 200 Public or optional auth

User — Nutrition Center (§23)

8 operations

GET /v2/user/me/nutrition/dashboard

Athlete nutrition dashboard — daily totals + weekly series + meals + goals + progress. Owner-only.

Responses: 200 Public or optional auth
GET /v2/user/me/nutrition/goals

Get athlete nutrition goals.

Responses: 200 Public or optional auth
PATCH /v2/user/me/nutrition/goals

Patch athlete nutrition goals.

Responses: 200 Public or optional auth
GET /v2/user/me/nutrition/logs

List own nutrition logs for a date.

Responses: 200 Public or optional auth
POST /v2/user/me/nutrition/logs

Create a manual / quick-add nutrition log.

Responses: 201 Public or optional auth
DELETE /v2/user/me/nutrition/logs/{logId}

Delete an own nutrition log (soft-remove).

Responses: 200 Public or optional auth
POST /v2/user/me/nutrition/logs/photo

Upload a meal photo for a scanned log. Owner-only.

Responses: 201 Public or optional auth
GET /v2/user/me/nutrition/quick-add-items

Browse the platform quick-add catalog.

Responses: 200 Public or optional auth

User — Onboarding State (§14)

3 operations

POST /v2/user/me/onboarding/complete

Mark onboarding complete. Refuses when required steps are still pending; persists wizardCompletedAt timestamp.

Responses: 201 Public or optional auth
GET /v2/user/me/onboarding/state

Get the athlete onboarding wizard state — 18 steps with per-step status, current step, lastActiveStep, completion timestamps. Owner-only.

Responses: 200 Public or optional auth
PATCH /v2/user/me/onboarding/state

Patch the wizard state — mark an optional step as COMPLETED/SKIPPED, or update lastActiveStep for resume. Required-step status is derived from User columns and cannot be patched here.

Responses: 200 Public or optional auth

User — Safety Center (§86)

1 operations

GET /v2/user/me/safety-center

Athlete-facing Safety Center aggregator. Returns own report history, block/mute lists, anti-cheat appeals, and published community guidelines. Owner-only.

Responses: 200 Public or optional auth

User — Training Programs Summary (§22)

1 operations

GET /v2/user/me/training-programs/summary

Athlete-facing Training Programs summary — active enrollments + progress + today's workout + library highlights + payment status. Owner-only.

Responses: 200 Public or optional auth

User Badges

6 operations

GET /v2/user-badges

GET /v2/user-badges

Responses: 200 Public or optional auth
PATCH /v2/user-badges/{badgeId}/seen

PATCH /v2/user-badges/{badgeId}/seen

Responses: 200 Public or optional auth
GET /v2/user-badges/earned

GET /v2/user-badges/earned

Responses: 200 Public or optional auth
GET /v2/user-badges/progress

GET /v2/user-badges/progress

Responses: 200 Public or optional auth
PATCH /v2/user-badges/recalculate

PATCH /v2/user-badges/recalculate

Responses: 200 Public or optional auth
GET /v2/user-badges/user/{userId}

GET /v2/user-badges/user/{userId}

Responses: 200 Public or optional auth

User Privacy — Block / Mute

10 operations

DELETE /v2/me/social-blocks/block/{targetUserId}

Unblock a user (idempotent).

Responses: 200 Public or optional auth
POST /v2/me/social-blocks/block/{targetUserId}

Block a user (mutual hide; only blocker is informed).

Responses: 200 Public or optional auth
GET /v2/me/social-blocks/blocks

List users the caller has blocked, with name + avatar + city for settings rendering.

Responses: 200 Public or optional auth
DELETE /v2/me/social-blocks/mute/{targetUserId}

Unmute a user (idempotent).

Responses: 200 Public or optional auth
POST /v2/me/social-blocks/mute/{targetUserId}

Mute a user (one-way feed/search hide).

Responses: 200 Public or optional auth
GET /v2/me/social-blocks/mutes

List users the caller has muted, with name + avatar + city for settings rendering.

Responses: 200 Public or optional auth
DELETE /v2/me/social-blocks/restrict/{targetUserId}

Unrestrict a user (idempotent).

Responses: 200 Public or optional auth
POST /v2/me/social-blocks/restrict/{targetUserId}

Restrict a user (comments held; DMs go to requests).

Responses: 200 Public or optional auth
GET /v2/me/social-blocks/restricts

List users the caller has restricted.

Responses: 200 Public or optional auth
GET /v2/me/social-blocks/verdict/{targetUserId}

Returns the social-hide verdict for a single user from the caller's perspective.

Responses: 200 Public or optional auth

User Transactions

1 operations

GET /v2/transactions

Get my transactions

Get all user transactions — event tickets, cloud image purchases, training plans, refunds, challenge entry fees (RC coin or money), challenge RC rewards, RC wallet movements (steps/referral/promotion/adjustment), and RC Store redemptions — merged into one feed, with pagination.

Responses: 200 Public or optional auth

User: Adaptive Training (B21/B23)

10 operations

POST /v2/user/adaptive-training/plans

POST /v2/user/adaptive-training/plans

Responses: 201 Public or optional auth
DELETE /v2/user/adaptive-training/plans/{id}

DELETE /v2/user/adaptive-training/plans/{id}

Responses: 200 Public or optional auth
GET /v2/user/adaptive-training/plans/{id}

GET /v2/user/adaptive-training/plans/{id}

Responses: 200 Public or optional auth
POST /v2/user/adaptive-training/plans/{id}/activate

POST /v2/user/adaptive-training/plans/{id}/activate

Responses: 201 Public or optional auth
POST /v2/user/adaptive-training/plans/{id}/realign

POST /v2/user/adaptive-training/plans/{id}/realign

Responses: 201 Public or optional auth
GET /v2/user/adaptive-training/plans/active

GET /v2/user/adaptive-training/plans/active

Responses: 200 Public or optional auth
POST /v2/user/adaptive-training/sessions/{id}/abandon

POST /v2/user/adaptive-training/sessions/{id}/abandon

Responses: 201 Public or optional auth
POST /v2/user/adaptive-training/sessions/{id}/complete

POST /v2/user/adaptive-training/sessions/{id}/complete

Responses: 201 Public or optional auth
POST /v2/user/adaptive-training/sessions/{id}/launch

POST /v2/user/adaptive-training/sessions/{id}/launch

Responses: 201 Public or optional auth
GET /v2/user/adaptive-training/today

GET /v2/user/adaptive-training/today

Responses: 200 Public or optional auth

User: Ambassador deliverables

3 operations

POST /v2/user/me/ambassador-offers/{offerId}/deliverable-image

Upload a screenshot to attach as proof.

Responses: 201 Auth required
GET /v2/user/me/ambassador-offers/{offerId}/deliverables

What I have submitted on this deal, oldest first.

Responses: 200 Auth required
POST /v2/user/me/ambassador-offers/{offerId}/deliverables

Submit proof for one deliverable. Replaces a rejected attempt; refused once approved.

Responses: 201 Auth required

User: Ambassador messages

5 operations

POST /v2/user/me/ambassador-offers/{offerId}/message-attachment

POST /v2/user/me/ambassador-offers/{offerId}/message-attachment

Responses: 201 Auth required
GET /v2/user/me/ambassador-offers/{offerId}/messages

The conversation on this deal, oldest first.

Responses: 200 Auth required
POST /v2/user/me/ambassador-offers/{offerId}/messages

Send a message to the brand.

Responses: 201 Auth required
DELETE /v2/user/me/ambassador-offers/{offerId}/messages/{messageId}

DELETE /v2/user/me/ambassador-offers/{offerId}/messages/{messageId}

Responses: 200 Auth required
POST /v2/user/me/ambassador-offers/{offerId}/messages/read

Mark everything from the brand as read.

Responses: 201 Auth required

User: Ambassador offers

9 operations

GET /v2/user/me/ambassador-offers

Ambassador offers sent to me.

Responses: 200 Auth required
POST /v2/user/me/ambassador-offers/{offerId}/accept

Accept an offer — joins the brand’s roster.

Responses: 201 Auth required
POST /v2/user/me/ambassador-offers/{offerId}/accept-agreement

Accept the frozen ambassador agreement.

Responses: 201 Auth required
POST /v2/user/me/ambassador-offers/{offerId}/confirm-delivery

Confirm I received the products.

Responses: 201 Auth required
POST /v2/user/me/ambassador-offers/{offerId}/counter

Counter with a different amount.

Responses: 201 Auth required
POST /v2/user/me/ambassador-offers/{offerId}/decline

Decline an offer.

Responses: 201 Auth required
POST /v2/user/me/ambassador-offers/{offerId}/shipping-address

Save where my products should ship. Athlete-written only — the brand never types this.

Responses: 201 Auth required
POST /v2/user/me/ambassador-offers/{offerId}/termination-response

Accept or decline a brand termination request.

Responses: 201 Auth required
GET /v2/user/me/ambassador-offers/{offerId}/timeline

This deal’s history, oldest first.

Responses: 200 Auth required

User: Athlete Dashboard

5 operations

GET /v2/user/me/dashboard

GET /v2/user/me/dashboard

Responses: 200 Public or optional auth
GET /v2/user/me/metrics/dashboard

Athlete-facing performance metrics dashboard. Owner-only. 18 fixed-order tiles + recent activities ≤5 + trend/paceSeries/sportSplit time-series; per-tile sourceStatus AVAILABLE / NOT_TRACKED_YET.

Responses: 200 Public or optional auth
GET /v2/user/me/race-history

GET /v2/user/me/race-history

Responses: 200 Public or optional auth
GET /v2/user/me/training-programs

GET /v2/user/me/training-programs

Responses: 200 Public or optional auth
GET /v2/user/me/training-programs/by-id/{id}

GET /v2/user/me/training-programs/by-id/{id}

Responses: 200 Public or optional auth

User: Athlete Premium

2 operations

POST /v2/user/premium/purchase/initiate

POST /v2/user/premium/purchase/initiate

Responses: 201 Public or optional auth
GET /v2/user/premium/status

GET /v2/user/premium/status

Responses: 200 Public or optional auth

User: Brand Follow + Prep Programs

3 operations

POST /v2/user/brand/{organizerId}/follow

POST /v2/user/brand/{organizerId}/follow

Responses: 201 Public or optional auth
POST /v2/user/brand/{organizerId}/unfollow

POST /v2/user/brand/{organizerId}/unfollow

Responses: 201 Public or optional auth
GET /v2/user/brand/prep-programs/my

GET /v2/user/brand/prep-programs/my

Responses: 200 Public or optional auth

User: Brand Page (slug actions)

3 operations

POST /v2/user/org/{slug}/follow

POST /v2/user/org/{slug}/follow

Responses: 201 Public or optional auth
GET /v2/user/org/{slug}/following

GET /v2/user/org/{slug}/following

Responses: 200 Public or optional auth
POST /v2/user/org/{slug}/unfollow

POST /v2/user/org/{slug}/unfollow

Responses: 201 Public or optional auth

User: Check-in QR

1 operations

GET /v2/users/{userId}/event-participations/{participationId}/qr

GET /v2/users/{userId}/event-participations/{participationId}/qr

Responses: 200 Public or optional auth

User: Club Admin

96 operations

PATCH /v2/clubs/{clubId}

PATCH /v2/clubs/{clubId}

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/active-members-roster

GET /v2/clubs/{clubId}/active-members-roster

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/activity

GET /v2/clubs/{clubId}/activity

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin

GET /v2/clubs/{clubId}/admin

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/active-members-roster

GET /v2/clubs/{clubId}/admin/active-members-roster

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/activity

GET /v2/clubs/{clubId}/admin/activity

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/admins

GET /v2/clubs/{clubId}/admin/admins

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/analytics/dashboard

GET /v2/clubs/{clubId}/admin/analytics/dashboard

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/banner

POST /v2/clubs/{clubId}/admin/banner

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/deactivate

POST /v2/clubs/{clubId}/admin/deactivate

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/admin/featured-members

GET /v2/clubs/{clubId}/admin/featured-members

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/featured-members

POST /v2/clubs/{clubId}/admin/featured-members

Responses: 201 Public or optional auth
PATCH /v2/clubs/{clubId}/admin/featured-members/{id}

PATCH /v2/clubs/{clubId}/admin/featured-members/{id}

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/featured-members/{id}/activate

POST /v2/clubs/{clubId}/admin/featured-members/{id}/activate

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/featured-members/{id}/deactivate

POST /v2/clubs/{clubId}/admin/featured-members/{id}/deactivate

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/featured-members/reorder

POST /v2/clubs/{clubId}/admin/featured-members/reorder

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/admin/invites

GET /v2/clubs/{clubId}/admin/invites

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/invites

POST /v2/clubs/{clubId}/admin/invites

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/admin/invites/{inviteId}

DELETE /v2/clubs/{clubId}/admin/invites/{inviteId}

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/logo

POST /v2/clubs/{clubId}/admin/logo

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/admin/members

GET /v2/clubs/{clubId}/admin/members

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/members/{membershipId}/approve

POST /v2/clubs/{clubId}/admin/members/{membershipId}/approve

Responses: 201 Public or optional auth
PATCH /v2/clubs/{clubId}/admin/members/{membershipId}/notes

PATCH /v2/clubs/{clubId}/admin/members/{membershipId}/notes

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/members/{membershipId}/reject

POST /v2/clubs/{clubId}/admin/members/{membershipId}/reject

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/members/{membershipId}/transfer-ownership

POST /v2/clubs/{clubId}/admin/members/{membershipId}/transfer-ownership

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/admin/members/{targetUserId}

DELETE /v2/clubs/{clubId}/admin/members/{targetUserId}

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/members/{targetUserId}

GET /v2/clubs/{clubId}/admin/members/{targetUserId}

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/members/roles

GET /v2/clubs/{clubId}/admin/members/roles

Responses: 200 Public or optional auth
PATCH /v2/clubs/{clubId}/admin/memberships/{membershipId}/notes

PATCH /v2/clubs/{clubId}/admin/memberships/{membershipId}/notes

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/memberships/{membershipId}/transfer-ownership

POST /v2/clubs/{clubId}/admin/memberships/{membershipId}/transfer-ownership

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/admin/metrics

GET /v2/clubs/{clubId}/admin/metrics

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/moderation/posts

GET /v2/clubs/{clubId}/admin/moderation/posts

Responses: 200 Public or optional auth
DELETE /v2/clubs/{clubId}/admin/moderation/posts/{postId}

DELETE /v2/clubs/{clubId}/admin/moderation/posts/{postId}

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/moderation/posts/{postId}/comments

GET /v2/clubs/{clubId}/admin/moderation/posts/{postId}/comments

Responses: 200 Public or optional auth
DELETE /v2/clubs/{clubId}/admin/moderation/posts/{postId}/comments/{commentId}

DELETE /v2/clubs/{clubId}/admin/moderation/posts/{postId}/comments/{commentId}

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/moderation/posts/{postId}/comments/{commentId}/hide

POST /v2/clubs/{clubId}/admin/moderation/posts/{postId}/comments/{commentId}/hide

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/moderation/posts/{postId}/comments/{commentId}/unhide

POST /v2/clubs/{clubId}/admin/moderation/posts/{postId}/comments/{commentId}/unhide

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/moderation/posts/{postId}/hide

POST /v2/clubs/{clubId}/admin/moderation/posts/{postId}/hide

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/moderation/posts/{postId}/unhide

POST /v2/clubs/{clubId}/admin/moderation/posts/{postId}/unhide

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/admin/monetization/payments

GET /v2/clubs/{clubId}/admin/monetization/payments

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/monetization/summary

GET /v2/clubs/{clubId}/admin/monetization/summary

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/my-role

GET /v2/clubs/{clubId}/admin/my-role

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/ownership-transfer

GET /v2/clubs/{clubId}/admin/ownership-transfer

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/ownership-transfer/{requestId}/cancel

POST /v2/clubs/{clubId}/admin/ownership-transfer/{requestId}/cancel

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/reactivate

POST /v2/clubs/{clubId}/admin/reactivate

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/admin/settings

GET /v2/clubs/{clubId}/admin/settings

Responses: 200 Public or optional auth
PATCH /v2/clubs/{clubId}/admin/settings

PATCH /v2/clubs/{clubId}/admin/settings

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/shipping/pickup-address

GET /v2/clubs/{clubId}/admin/shipping/pickup-address

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/shipping/pickup-address

POST /v2/clubs/{clubId}/admin/shipping/pickup-address

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/admin/status

GET /v2/clubs/{clubId}/admin/status

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/tiers

GET /v2/clubs/{clubId}/admin/tiers

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/tiers

POST /v2/clubs/{clubId}/admin/tiers

Responses: 201 Public or optional auth
PATCH /v2/clubs/{clubId}/admin/tiers/{tierId}

PATCH /v2/clubs/{clubId}/admin/tiers/{tierId}

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/tiers/{tierId}/breakdown

GET /v2/clubs/{clubId}/admin/tiers/{tierId}/breakdown

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/tiers/preview-breakdown

POST /v2/clubs/{clubId}/admin/tiers/preview-breakdown

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/admin/verification/eligibility

GET /v2/clubs/{clubId}/admin/verification/eligibility

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/verification/request

POST /v2/clubs/{clubId}/admin/verification/request

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/admins

GET /v2/clubs/{clubId}/admins

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/analytics/dashboard

GET /v2/clubs/{clubId}/analytics/dashboard

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/featured-members

POST /v2/clubs/{clubId}/featured-members

Responses: 201 Public or optional auth
PATCH /v2/clubs/{clubId}/featured-members/{id}

PATCH /v2/clubs/{clubId}/featured-members/{id}

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/featured-members/{id}/activate

POST /v2/clubs/{clubId}/featured-members/{id}/activate

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/featured-members/{id}/deactivate

POST /v2/clubs/{clubId}/featured-members/{id}/deactivate

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/featured-members/reorder

POST /v2/clubs/{clubId}/featured-members/reorder

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/members-by-status

GET /v2/clubs/{clubId}/members-by-status

Responses: 200 Public or optional auth
DELETE /v2/clubs/{clubId}/members/{targetUserId}

DELETE /v2/clubs/{clubId}/members/{targetUserId}

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/members/{targetUserId}

GET /v2/clubs/{clubId}/members/{targetUserId}

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/members/invite

POST /v2/clubs/{clubId}/members/invite

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/members/invites

GET /v2/clubs/{clubId}/members/invites

Responses: 200 Public or optional auth
DELETE /v2/clubs/{clubId}/members/invites/{inviteId}

DELETE /v2/clubs/{clubId}/members/invites/{inviteId}

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/memberships/{membershipId}/approve

POST /v2/clubs/{clubId}/memberships/{membershipId}/approve

Responses: 201 Public or optional auth
PATCH /v2/clubs/{clubId}/memberships/{membershipId}/notes

PATCH /v2/clubs/{clubId}/memberships/{membershipId}/notes

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/memberships/{membershipId}/reject

POST /v2/clubs/{clubId}/memberships/{membershipId}/reject

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/memberships/{membershipId}/transfer-ownership

POST /v2/clubs/{clubId}/memberships/{membershipId}/transfer-ownership

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/metrics

GET /v2/clubs/{clubId}/metrics

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/moderation/posts

GET /v2/clubs/{clubId}/moderation/posts

Responses: 200 Public or optional auth
DELETE /v2/clubs/{clubId}/moderation/posts/{postId}

DELETE /v2/clubs/{clubId}/moderation/posts/{postId}

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/moderation/posts/{postId}/comments

GET /v2/clubs/{clubId}/moderation/posts/{postId}/comments

Responses: 200 Public or optional auth
DELETE /v2/clubs/{clubId}/moderation/posts/{postId}/comments/{commentId}

DELETE /v2/clubs/{clubId}/moderation/posts/{postId}/comments/{commentId}

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/moderation/posts/{postId}/comments/{commentId}/hide

POST /v2/clubs/{clubId}/moderation/posts/{postId}/comments/{commentId}/hide

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/moderation/posts/{postId}/comments/{commentId}/unhide

POST /v2/clubs/{clubId}/moderation/posts/{postId}/comments/{commentId}/unhide

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/moderation/posts/{postId}/hide

POST /v2/clubs/{clubId}/moderation/posts/{postId}/hide

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/moderation/posts/{postId}/unhide

POST /v2/clubs/{clubId}/moderation/posts/{postId}/unhide

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/monetization/payments

GET /v2/clubs/{clubId}/monetization/payments

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/monetization/summary

GET /v2/clubs/{clubId}/monetization/summary

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/my-role

GET /v2/clubs/{clubId}/my-role

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/tiers

GET /v2/clubs/{clubId}/tiers

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/tiers

POST /v2/clubs/{clubId}/tiers

Responses: 201 Public or optional auth
PATCH /v2/clubs/{clubId}/tiers/{tierId}

PATCH /v2/clubs/{clubId}/tiers/{tierId}

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/tiers/{tierId}/breakdown

GET /v2/clubs/{clubId}/tiers/{tierId}/breakdown

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/tiers/preview-breakdown

POST /v2/clubs/{clubId}/tiers/preview-breakdown

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/verification-eligibility

GET /v2/clubs/{clubId}/verification-eligibility

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/verify-request

POST /v2/clubs/{clubId}/verify-request

Responses: 201 Public or optional auth
POST /v2/clubs/ownership-transfers/{requestId}/accept

POST /v2/clubs/ownership-transfers/{requestId}/accept

Responses: 201 Public or optional auth
POST /v2/clubs/ownership-transfers/{requestId}/decline

POST /v2/clubs/ownership-transfers/{requestId}/decline

Responses: 201 Public or optional auth
GET /v2/clubs/ownership-transfers/incoming

GET /v2/clubs/ownership-transfers/incoming

Responses: 200 Public or optional auth

User: Club Admin — Announcements

9 operations

GET /v2/clubs/{clubId}/admin/announcements

GET /v2/clubs/{clubId}/admin/announcements

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/announcements

POST /v2/clubs/{clubId}/admin/announcements

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/admin/announcements/{announcementId}

DELETE /v2/clubs/{clubId}/admin/announcements/{announcementId}

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/announcements/{announcementId}/metrics

GET /v2/clubs/{clubId}/admin/announcements/{announcementId}/metrics

Responses: 200 Public or optional auth
DELETE /v2/clubs/{clubId}/admin/announcements/{announcementId}/pin

DELETE /v2/clubs/{clubId}/admin/announcements/{announcementId}/pin

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/announcements/{announcementId}/pin

POST /v2/clubs/{clubId}/admin/announcements/{announcementId}/pin

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/admin/announcements/scheduled

GET /v2/clubs/{clubId}/admin/announcements/scheduled

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/announcements/scheduled

POST /v2/clubs/{clubId}/admin/announcements/scheduled

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/admin/announcements/scheduled/{announcementId}

DELETE /v2/clubs/{clubId}/admin/announcements/scheduled/{announcementId}

Responses: 200 Public or optional auth

User: Club Admin — Award Nominations

4 operations

GET /v2/clubs/{clubId}/admin/awards/nominations

GET /v2/clubs/{clubId}/admin/awards/nominations

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/awards/nominations

POST /v2/clubs/{clubId}/admin/awards/nominations

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/awards/nominations/{nominationId}/approve

POST /v2/clubs/{clubId}/admin/awards/nominations/{nominationId}/approve

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/awards/nominations/{nominationId}/reject

POST /v2/clubs/{clubId}/admin/awards/nominations/{nominationId}/reject

Responses: 201 Public or optional auth

User: Club Admin — Invites

3 operations

POST /v2/organizer/clubs/{clubId}/members/invite

Create an admin-issued club invite by email OR phone (or neither, for a shareable link). Optionally grants ADMIN or MODERATOR on acceptance — ADMIN requires the caller to be OWNER, mirroring the promote endpoint, and a link invite may never carry a role.

Responses: 201 Auth required
GET /v2/organizer/clubs/{clubId}/members/invites

List club invites (PENDING by default; filter by status).

Responses: 200 Auth required
DELETE /v2/organizer/clubs/{clubId}/members/invites/{inviteId}

Revoke a pending invite. Cross-club returns same-shape 404.

Responses: 200 Auth required

User: Club Admin — Member Management

13 operations

DELETE /v2/clubs/{clubId}/admin/members/{userId}/ban

DELETE /v2/clubs/{clubId}/admin/members/{userId}/ban

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/members/{userId}/ban

POST /v2/clubs/{clubId}/admin/members/{userId}/ban

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/admin/members/{userId}/mute

DELETE /v2/clubs/{clubId}/admin/members/{userId}/mute

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/members/{userId}/mute

POST /v2/clubs/{clubId}/admin/members/{userId}/mute

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/admin/members/{userId}/promote

DELETE /v2/clubs/{clubId}/admin/members/{userId}/promote

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/members/{userId}/promote

POST /v2/clubs/{clubId}/admin/members/{userId}/promote

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/members/{userId}/remove

POST /v2/clubs/{clubId}/admin/members/{userId}/remove

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/members/{userId}/restore

POST /v2/clubs/{clubId}/admin/members/{userId}/restore

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/members/{userId}/suspend

POST /v2/clubs/{clubId}/admin/members/{userId}/suspend

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/members/{userId}/warn

POST /v2/clubs/{clubId}/admin/members/{userId}/warn

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/members/bulk-approve

POST /v2/clubs/{clubId}/admin/members/bulk-approve

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/members/bulk-message

POST /v2/clubs/{clubId}/admin/members/bulk-message

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/admin/members/export.csv

GET /v2/clubs/{clubId}/admin/members/export.csv

Responses: 200 Public or optional auth

User: Club Admin — Post Reports

7 operations

GET /v2/clubs/{clubId}/admin/post-reports

GET /v2/clubs/{clubId}/admin/post-reports

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/post-reports/{reportId}

GET /v2/clubs/{clubId}/admin/post-reports/{reportId}

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/post-reports/{reportId}/archive

POST /v2/clubs/{clubId}/admin/post-reports/{reportId}/archive

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/post-reports/{reportId}/escalate

POST /v2/clubs/{clubId}/admin/post-reports/{reportId}/escalate

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/post-reports/{reportId}/reject

POST /v2/clubs/{clubId}/admin/post-reports/{reportId}/reject

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/post-reports/{reportId}/resolve

POST /v2/clubs/{clubId}/admin/post-reports/{reportId}/resolve

Responses: 201 Public or optional auth
POST /v2/clubs/{clubId}/admin/post-reports/{reportId}/restore

POST /v2/clubs/{clubId}/admin/post-reports/{reportId}/restore

Responses: 201 Public or optional auth

User: Club Admin — Run Templates

5 operations

GET /v2/clubs/{clubId}/admin/run-templates

GET /v2/clubs/{clubId}/admin/run-templates

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/run-templates

POST /v2/clubs/{clubId}/admin/run-templates

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/admin/run-templates/{templateId}

DELETE /v2/clubs/{clubId}/admin/run-templates/{templateId}

Responses: 200 Public or optional auth
PATCH /v2/clubs/{clubId}/admin/run-templates/{templateId}

PATCH /v2/clubs/{clubId}/admin/run-templates/{templateId}

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/run-templates/{templateId}/apply

POST /v2/clubs/{clubId}/admin/run-templates/{templateId}/apply

Responses: 201 Public or optional auth

User: Club Admin — Runs

7 operations

POST /v2/clubs/{clubId}/admin/runs

POST /v2/clubs/{clubId}/admin/runs

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/admin/runs/{runId}

DELETE /v2/clubs/{clubId}/admin/runs/{runId}

Responses: 200 Public or optional auth
PATCH /v2/clubs/{clubId}/admin/runs/{runId}

PATCH /v2/clubs/{clubId}/admin/runs/{runId}

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/runs/{runId}/attendance

GET /v2/clubs/{clubId}/admin/runs/{runId}/attendance

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/admin/runs/{runId}/attendance/manual

POST /v2/clubs/{clubId}/admin/runs/{runId}/attendance/manual

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/admin/runs/{runId}/occurrence-cohorts

GET /v2/clubs/{clubId}/admin/runs/{runId}/occurrence-cohorts

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/admin/runs/{runId}/rsvps

GET /v2/clubs/{clubId}/admin/runs/{runId}/rsvps

Responses: 200 Public or optional auth

User: Club Admin — Setup Wizard

1 operations

POST /v2/clubs/{clubId}/admin/setup-wizard

POST /v2/clubs/{clubId}/admin/setup-wizard

Responses: 201 Public or optional auth

User: Club Direct Messages

16 operations

GET /v2/clubs/{clubId}/dms

GET /v2/clubs/{clubId}/dms

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/dms

POST /v2/clubs/{clubId}/dms

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/dms/{messageId}

DELETE /v2/clubs/{clubId}/dms/{messageId}

Responses: 200 Public or optional auth
DELETE /v2/clubs/{clubId}/dms/{messageId}/me

DELETE /v2/clubs/{clubId}/dms/{messageId}/me

Responses: 200 Public or optional auth
PATCH /v2/clubs/{clubId}/dms/{messageId}/read

PATCH /v2/clubs/{clubId}/dms/{messageId}/read

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/dms/{peerUserId}

GET /v2/clubs/{clubId}/dms/{peerUserId}

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/dms/{peerUserId}/messages/{messageId}/report

POST /v2/clubs/{clubId}/dms/{peerUserId}/messages/{messageId}/report

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/dms/{peerUserId}/preferences

GET /v2/clubs/{clubId}/dms/{peerUserId}/preferences

Responses: 200 Public or optional auth
PATCH /v2/clubs/{clubId}/dms/{peerUserId}/preferences

PATCH /v2/clubs/{clubId}/dms/{peerUserId}/preferences

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/dms/{peerUserId}/read

POST /v2/clubs/{clubId}/dms/{peerUserId}/read

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/dms/{peerUserId}/thread

DELETE /v2/clubs/{clubId}/dms/{peerUserId}/thread

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/dms/{peerUserId}/typing

POST /v2/clubs/{clubId}/dms/{peerUserId}/typing

Responses: 204 Public or optional auth
GET /v2/clubs/{clubId}/dms/{peerUserId}/typing-status

GET /v2/clubs/{clubId}/dms/{peerUserId}/typing-status

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/dms/messages/{messageId}/reactions

GET /v2/clubs/{clubId}/dms/messages/{messageId}/reactions

Responses: 200 Public or optional auth
DELETE /v2/clubs/{clubId}/dms/messages/{messageId}/reactions/{emoji}

DELETE /v2/clubs/{clubId}/dms/messages/{messageId}/reactions/{emoji}

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/dms/messages/{messageId}/reactions/{emoji}

POST /v2/clubs/{clubId}/dms/messages/{messageId}/reactions/{emoji}

Responses: 201 Public or optional auth

User: Clubs Depth

13 operations

GET /v2/clubs/{clubId}/chat

GET /v2/clubs/{clubId}/chat

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/chat

POST /v2/clubs/{clubId}/chat

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/chat/{messageId}

DELETE /v2/clubs/{clubId}/chat/{messageId}

Responses: 200 Public or optional auth
DELETE /v2/clubs/{clubId}/chat/{messageId}/me

DELETE /v2/clubs/{clubId}/chat/{messageId}/me

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/chat/upload-media

POST /v2/clubs/{clubId}/chat/upload-media

Responses: 201 Public or optional auth
GET /v2/clubs/{clubId}/posts

GET /v2/clubs/{clubId}/posts

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/posts

POST /v2/clubs/{clubId}/posts

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/posts/{postId}

DELETE /v2/clubs/{clubId}/posts/{postId}

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/posts/{postId}/comments

GET /v2/clubs/{clubId}/posts/{postId}/comments

Responses: 200 Public or optional auth
POST /v2/clubs/{clubId}/posts/{postId}/comments

POST /v2/clubs/{clubId}/posts/{postId}/comments

Responses: 201 Public or optional auth
DELETE /v2/clubs/{clubId}/posts/{postId}/comments/{commentId}

DELETE /v2/clubs/{clubId}/posts/{postId}/comments/{commentId}

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/runs/{runId}/attendance

GET /v2/clubs/{clubId}/runs/{runId}/attendance

Responses: 200 Public or optional auth
GET /v2/clubs/{clubId}/streak/me

GET /v2/clubs/{clubId}/streak/me

Responses: 200 Public or optional auth

User: Direct Messages

18 operations

GET /v2/users/dms

Unified chat inbox — user DMs + club entries (one per club, all channels grouped)

Responses: 200 Public or optional auth
POST /v2/users/dms

Send a direct message to any user

Responses: 201 Public or optional auth
DELETE /v2/users/dms/{messageId}

Delete your own sent message for everyone (sender only)

Responses: 200 Public or optional auth
PATCH /v2/users/dms/{messageId}

Edit your own sent message body (sender only)

Responses: 200 Public or optional auth
DELETE /v2/users/dms/{messageId}/me

Delete a message for me only — other user still sees it

Responses: 200 Public or optional auth
PATCH /v2/users/dms/{messageId}/read

Mark a single message as read

Responses: 200 Public or optional auth
GET /v2/users/dms/{peerUserId}

Get full conversation thread with a user

Responses: 200 Public or optional auth
GET /v2/users/dms/{peerUserId}/preferences

Get mute preference for a thread

Responses: 200 Public or optional auth
PATCH /v2/users/dms/{peerUserId}/preferences

Set mute preference for a thread

Responses: 200 Public or optional auth
POST /v2/users/dms/{peerUserId}/read

Bulk mark entire thread as read

Responses: 201 Public or optional auth
DELETE /v2/users/dms/{peerUserId}/thread

Delete the DM conversation from the caller's inbox — hides the thread tile and clears its messages for the caller; reappears if a new message arrives. The peer is unaffected.

Responses: 200 Public or optional auth
POST /v2/users/dms/{peerUserId}/typing

Signal typing — stores Redis key with 5s TTL

Responses: 201 Public or optional auth
GET /v2/users/dms/{peerUserId}/typing-status

Check if peer is currently typing

Responses: 200 Public or optional auth
GET /v2/users/dms/messages/{messageId}/reactions

Get all reaction counts for a DM message

Responses: 200 Public or optional auth
DELETE /v2/users/dms/messages/{messageId}/reactions/{emoji}

Remove an emoji reaction from a DM message

Responses: 200 Public or optional auth
POST /v2/users/dms/messages/{messageId}/reactions/{emoji}

Add an emoji reaction to a DM message

Responses: 201 Public or optional auth
GET /v2/users/dms/unread-count

Total unread DM count (badge indicator)

Responses: 200 Public or optional auth
POST /v2/users/dms/upload-media

Upload media file for a DM — returns GCS URL

Responses: 201 Public or optional auth

User: DMs

20 operations

GET /v2/dm/inbox/sse

GET /v2/dm/inbox/sse

Responses: 200 Public or optional auth
POST /v2/dm/media

POST /v2/dm/media

Responses: 201 Public or optional auth
GET /v2/dm/requests

GET /v2/dm/requests

Responses: 200 Public or optional auth
POST /v2/dm/requests/{threadId}/accept

POST /v2/dm/requests/{threadId}/accept

Responses: 201 Public or optional auth
POST /v2/dm/requests/{threadId}/decline

POST /v2/dm/requests/{threadId}/decline

Responses: 201 Public or optional auth
GET /v2/dm/threads

GET /v2/dm/threads

Responses: 200 Public or optional auth
POST /v2/dm/threads

POST /v2/dm/threads

Responses: 201 Public or optional auth
POST /v2/dm/threads/{id}/archive

POST /v2/dm/threads/{id}/archive

Responses: 201 Public or optional auth
GET /v2/dm/threads/{id}/messages

GET /v2/dm/threads/{id}/messages

Responses: 200 Public or optional auth
POST /v2/dm/threads/{id}/messages

POST /v2/dm/threads/{id}/messages

Responses: 201 Public or optional auth
PATCH /v2/dm/threads/{id}/messages/{msgId}

PATCH /v2/dm/threads/{id}/messages/{msgId}

Responses: 200 Public or optional auth
DELETE /v2/dm/threads/{id}/messages/{msgId}/me

DELETE /v2/dm/threads/{id}/messages/{msgId}/me

Responses: 200 Public or optional auth
DELETE /v2/dm/threads/{id}/messages/{msgId}/reactions/{emoji}

DELETE /v2/dm/threads/{id}/messages/{msgId}/reactions/{emoji}

Responses: 200 Public or optional auth
POST /v2/dm/threads/{id}/messages/{msgId}/reactions/{emoji}

POST /v2/dm/threads/{id}/messages/{msgId}/reactions/{emoji}

Responses: 201 Public or optional auth
PATCH /v2/dm/threads/{id}/mute

PATCH /v2/dm/threads/{id}/mute

Responses: 200 Public or optional auth
POST /v2/dm/threads/{id}/read

POST /v2/dm/threads/{id}/read

Responses: 201 Public or optional auth
GET /v2/dm/threads/{id}/search

GET /v2/dm/threads/{id}/search

Responses: 200 Public or optional auth
GET /v2/dm/threads/{id}/sse

GET /v2/dm/threads/{id}/sse

Responses: 200 Public or optional auth
POST /v2/dm/threads/{id}/typing

POST /v2/dm/threads/{id}/typing

Responses: 201 Public or optional auth
GET /v2/dm/unread-count

GET /v2/dm/unread-count

Responses: 200 Public or optional auth

User: Dual Recording

3 operations

POST /v2/anti-cheat/dual-recording/{activityId}/evaluate

Run DTW on the uploaded secondary samples.

Responses: 200 Public or optional auth
GET /v2/anti-cheat/dual-recording/{activityId}/status

Read the DTW verdict + score for the activity.

Responses: 200 Public or optional auth
POST /v2/anti-cheat/dual-recording/{activityId}/submit

Upload the secondary-device samples that back the DTW match for a RANKED-policy activity.

Responses: 200 Public or optional auth

User: Feature Flags

1 operations

POST /v2/me/feature-flags/evaluate

POST /v2/me/feature-flags/evaluate

Responses: 201 Public or optional auth

User: Feed

24 operations

GET /v2/feed

GET /v2/feed

Responses: 200 Public or optional auth
GET /v2/feed/{id}

GET /v2/feed/{id}

Responses: 200 Public or optional auth
POST /v2/feed/{id}/bookmark

POST /v2/feed/{id}/bookmark

Responses: 201 Public or optional auth
GET /v2/feed/{id}/comments

GET /v2/feed/{id}/comments

Responses: 200 Public or optional auth
POST /v2/feed/{id}/comments

POST /v2/feed/{id}/comments

Responses: 201 Public or optional auth
DELETE /v2/feed/{id}/comments/{commentId}

DELETE /v2/feed/{id}/comments/{commentId}

Responses: 200 Public or optional auth
GET /v2/feed/{id}/kudos

GET /v2/feed/{id}/kudos

Responses: 200 Public or optional auth
POST /v2/feed/{id}/kudos

POST /v2/feed/{id}/kudos

Responses: 201 Public or optional auth
POST /v2/feed/{id}/repost

POST /v2/feed/{id}/repost

Responses: 201 Public or optional auth
GET /v2/feed/activities/{activityId}/comments

GET /v2/feed/activities/{activityId}/comments

Responses: 200 Public or optional auth
GET /v2/feed/bookmarks/me

GET /v2/feed/bookmarks/me

Responses: 200 Public or optional auth
GET /v2/feed/me/insights

GET /v2/feed/me/insights

Responses: 200 Public or optional auth
GET /v2/feed/me/posts

GET /v2/feed/me/posts

Responses: 200 Public or optional auth
POST /v2/feed/posts

POST /v2/feed/posts

Responses: 201 Public or optional auth
DELETE /v2/feed/posts/{id}

DELETE /v2/feed/posts/{id}

Responses: 200 Public or optional auth
GET /v2/feed/posts/{id}

GET /v2/feed/posts/{id}

Responses: 200 Public or optional auth
PATCH /v2/feed/posts/{id}

PATCH /v2/feed/posts/{id}

Responses: 200 Public or optional auth
DELETE /v2/feed/posts/{id}/hide-from/{targetUserId}

DELETE /v2/feed/posts/{id}/hide-from/{targetUserId}

Responses: 200 Public or optional auth
POST /v2/feed/posts/{id}/hide-from/{targetUserId}

POST /v2/feed/posts/{id}/hide-from/{targetUserId}

Responses: 201 Public or optional auth
GET /v2/feed/posts/{id}/insights

GET /v2/feed/posts/{id}/insights

Responses: 200 Public or optional auth
GET /v2/feed/posts/{id}/public

GET /v2/feed/posts/{id}/public

Responses: 200 Public or optional auth
POST /v2/feed/posts/upload-image

POST /v2/feed/posts/upload-image

Responses: 201 Public or optional auth
GET /v2/feed/tags/trending

GET /v2/feed/tags/trending

Responses: 200 Public or optional auth
GET /v2/feed/users/{userId}/posts

GET /v2/feed/users/{userId}/posts

Responses: 200 Public or optional auth

User: Form Score + Strictness Floor (B25)

3 operations

GET /v2/user/form-score

GET /v2/user/form-score

Responses: 200 Public or optional auth
POST /v2/user/form-score/recompute

POST /v2/user/form-score/recompute

Responses: 201 Public or optional auth
GET /v2/user/strictness-floor

GET /v2/user/strictness-floor

Responses: 200 Public or optional auth

User: Goodies

4 operations

GET /v2/users/me/goodies

GET /v2/users/me/goodies

Responses: 200 Public or optional auth
GET /v2/users/me/goodies/{goodieId}

GET /v2/users/me/goodies/{goodieId}

Responses: 200 Public or optional auth
PATCH /v2/users/me/goodies/{goodieId}/address

PATCH /v2/users/me/goodies/{goodieId}/address

Responses: 200 Public or optional auth
GET /v2/users/me/goodies/summary

GET /v2/users/me/goodies/summary

Responses: 200 Public or optional auth

User: Integrations

8 operations

GET /v2/integrations

GET /v2/integrations

Responses: 200 Public or optional auth
DELETE /v2/integrations/{provider}

DELETE /v2/integrations/{provider}

Responses: 200 Public or optional auth
POST /v2/integrations/apple-health/upload

POST /v2/integrations/apple-health/upload

Responses: 201 Public or optional auth
GET /v2/integrations/available

GET /v2/integrations/available

Responses: 200 Public or optional auth
POST /v2/integrations/google-fit/upload

POST /v2/integrations/google-fit/upload

Responses: 201 Public or optional auth
POST /v2/integrations/health/activities

POST /v2/integrations/health/activities

Responses: 201 Public or optional auth
POST /v2/integrations/health/deletions

POST /v2/integrations/health/deletions

Responses: 201 Public or optional auth
GET /v2/integrations/status

GET /v2/integrations/status

Responses: 200 Public or optional auth

User: Locale preference

2 operations

GET /v2/me/locale

GET /v2/me/locale

Responses: 200 Public or optional auth
PATCH /v2/me/locale

PATCH /v2/me/locale

Responses: 200 Public or optional auth

User: Moderated media

5 operations

POST /v2/media/assets/{assetId}/appeals

POST /v2/media/assets/{assetId}/appeals

Responses: 201 Public or optional auth
GET /v2/media/assets/{assetId}/moderation-status

GET /v2/media/assets/{assetId}/moderation-status

Responses: 200 Public or optional auth
GET /v2/media/assets/{assetId}/preview

GET /v2/media/assets/{assetId}/preview

Responses: 200 Public or optional auth
POST /v2/media/assets/{assetId}/upload-complete

POST /v2/media/assets/{assetId}/upload-complete

Responses: 201 Public or optional auth
POST /v2/media/video/uploads

POST /v2/media/video/uploads

Responses: 201 Public or optional auth

User: Muted keywords

3 operations

GET /v2/me/muted-keywords

List all muted keywords for the caller.

Responses: 200 Public or optional auth
POST /v2/me/muted-keywords

Add a keyword to the muted list.

Responses: 201 Public or optional auth
DELETE /v2/me/muted-keywords/{keyword}

Remove a keyword from the muted list.

Responses: 200 Public or optional auth

User: My Sponsors

2 operations

GET /v2/users/me/organizations/following

Organizations the athlete explicitly follows. Powers the "Organizations I Follow" section on the athlete profile.

Responses: 200 Public or optional auth
GET /v2/users/me/sponsors

§16.2 / §47 — brands the athlete has received goodies from OR follows; powers the Repeak ID brand-card

Responses: 200 Public or optional auth

User: Native Tracking

7 operations

POST /v2/tracking/sessions

POST /v2/tracking/sessions

Responses: 201 Public or optional auth
GET /v2/tracking/sessions/{id}

GET /v2/tracking/sessions/{id}

Responses: 200 Public or optional auth
POST /v2/tracking/sessions/{id}/abandon

POST /v2/tracking/sessions/{id}/abandon

Responses: 201 Public or optional auth
POST /v2/tracking/sessions/{id}/finish

POST /v2/tracking/sessions/{id}/finish

Responses: 201 Public or optional auth
GET /v2/tracking/sessions/{id}/live-activity

GET /v2/tracking/sessions/{id}/live-activity

Responses: 200 Public or optional auth
GET /v2/tracking/sessions/{id}/points

GET /v2/tracking/sessions/{id}/points

Responses: 200 Public or optional auth
POST /v2/tracking/sessions/{id}/points

POST /v2/tracking/sessions/{id}/points

Responses: 201 Public or optional auth

User: Nutrition

19 operations

GET /v2/nutrition/fueling-context

GET /v2/nutrition/fueling-context

Responses: 200 Public or optional auth
GET /v2/nutrition/profile/me

GET /v2/nutrition/profile/me

Responses: 200 Public or optional auth
PUT /v2/nutrition/profile/me

PUT /v2/nutrition/profile/me

Responses: 200 Public or optional auth
GET /v2/nutrition/quick-add-items

GET /v2/nutrition/quick-add-items

Responses: 200 Public or optional auth
POST /v2/nutrition/scan

POST /v2/nutrition/scan

Responses: 200 Public or optional auth
POST /v2/nutrition/scan/voice

POST /v2/nutrition/scan/voice

Responses: 200 Public or optional auth
GET /v2/users/{userId}/health-stats

GET /v2/users/{userId}/health-stats

Responses: 200 Public or optional auth
PUT /v2/users/{userId}/health-stats

PUT /v2/users/{userId}/health-stats

Responses: 200 Public or optional auth
GET /v2/users/{userId}/hydration-logs

GET /v2/users/{userId}/hydration-logs

Responses: 200 Public or optional auth
POST /v2/users/{userId}/hydration-logs

POST /v2/users/{userId}/hydration-logs

Responses: 201 Public or optional auth
DELETE /v2/users/{userId}/hydration-logs/{logId}

DELETE /v2/users/{userId}/hydration-logs/{logId}

Responses: 200 Public or optional auth
GET /v2/users/{userId}/hydration-logs/daily

GET /v2/users/{userId}/hydration-logs/daily

Responses: 200 Public or optional auth
GET /v2/users/{userId}/hydration-logs/range

GET /v2/users/{userId}/hydration-logs/range

Responses: 200 Public or optional auth
GET /v2/users/{userId}/nutrition-logs

GET /v2/users/{userId}/nutrition-logs

Responses: 200 Public or optional auth
POST /v2/users/{userId}/nutrition-logs

POST /v2/users/{userId}/nutrition-logs

Responses: 201 Public or optional auth
DELETE /v2/users/{userId}/nutrition-logs/{logId}

DELETE /v2/users/{userId}/nutrition-logs/{logId}

Responses: 200 Public or optional auth
POST /v2/users/{userId}/nutrition-logs/daily-report

POST /v2/users/{userId}/nutrition-logs/daily-report

Responses: 201 Public or optional auth
POST /v2/users/{userId}/nutrition-logs/quick-add

POST /v2/users/{userId}/nutrition-logs/quick-add

Responses: 201 Public or optional auth
GET /v2/users/{userId}/nutrition/tdee

GET /v2/users/{userId}/nutrition/tdee

Responses: 200 Public or optional auth

User: Payments

1 operations

GET /v2/users/me/payments/{paymentId}/receipt

Get a receipt for the caller's own payment

Responses: 200 Public or optional auth

User: Payout account

3 operations

GET /v2/users/me/payout-account

My payout account. The account number is never returned — only its last four digits.

Responses: 200 Auth required
PUT /v2/users/me/payout-account

Save my payout account. Changing the number or IFSC resets verification.

Responses: 200 Auth required
POST /v2/users/me/payout-account/verify

Verify it with a penny drop. Capped at 5 attempts — each one costs a real transfer.

Responses: 201 Auth required

User: Photo face profile

4 operations

DELETE /v2/user/photos/face-profile

Revoke the active face profile.

Responses: 200 Public or optional auth
GET /v2/user/photos/face-profile

Get the caller's current face profile.

Responses: 200 Public or optional auth
POST /v2/user/photos/face-profile

Upload a selfie for face-match indexing.

Responses: 201 Public or optional auth
GET /v2/user/photos/face-profile/engine

Report whether the face-match engine is wired in this environment.

Responses: 200 Public or optional auth

User: Photos

9 operations

GET /v2/user/photos

GET /v2/user/photos

Responses: 200 Public or optional auth
GET /v2/user/photos/{photoId}

GET /v2/user/photos/{photoId}

Responses: 200 Public or optional auth
POST /v2/user/photos/{photoId}/purchase/initiate

POST /v2/user/photos/{photoId}/purchase/initiate

Responses: 201 Public or optional auth
POST /v2/user/photos/face-consent/grant

POST /v2/user/photos/face-consent/grant

Responses: 201 Public or optional auth
DELETE /v2/user/photos/face-consent/revoke

DELETE /v2/user/photos/face-consent/revoke

Responses: 200 Public or optional auth
GET /v2/user/photos/face-consent/status

GET /v2/user/photos/face-consent/status

Responses: 200 Public or optional auth
GET /v2/user/photos/matches

GET /v2/user/photos/matches

Responses: 200 Public or optional auth
POST /v2/user/photos/matches/{matchId}/confirm

POST /v2/user/photos/matches/{matchId}/confirm

Responses: 201 Public or optional auth
POST /v2/user/photos/matches/{matchId}/withdraw

POST /v2/user/photos/matches/{matchId}/withdraw

Responses: 201 Public or optional auth

User: Privacy settings

2 operations

GET /v2/me/privacy

Get the athlete privacy settings + supported values.

Responses: 200 Public or optional auth
PATCH /v2/me/privacy

Update the athlete privacy settings (partial).

Responses: 200 Public or optional auth

User: RC Store

7 operations

GET /v2/rc/daily-cap-state

GET /v2/rc/daily-cap-state

Responses: 200 Public or optional auth
POST /v2/rc/redeem/{sku}

POST /v2/rc/redeem/{sku}

Responses: 201 Public or optional auth
GET /v2/rc/redemptions

GET /v2/rc/redemptions

Responses: 200 Public or optional auth
PUT /v2/rc/redemptions/{id}/address

PUT /v2/rc/redemptions/{id}/address

Responses: 200 Public or optional auth
GET /v2/rc/rules

GET /v2/rc/rules

Responses: 200 Public or optional auth
GET /v2/rc/store

GET /v2/rc/store

Responses: 200 Public or optional auth
GET /v2/rc/transactions

GET /v2/rc/transactions

Responses: 200 Public or optional auth

User: Referrals

7 operations

POST /v2/user/referrals/claim

POST /v2/user/referrals/claim

Responses: 201 Public or optional auth
GET /v2/user/referrals/me

GET /v2/user/referrals/me

Responses: 200 Public or optional auth
GET /v2/user/referrals/me/attribution

GET /v2/user/referrals/me/attribution

Responses: 200 Public or optional auth
GET /v2/user/referrals/me/claim

GET /v2/user/referrals/me/claim

Responses: 200 Public or optional auth
GET /v2/user/referrals/me/referrals

GET /v2/user/referrals/me/referrals

Responses: 200 Public or optional auth
POST /v2/user/referrals/me/rotate-code

POST /v2/user/referrals/me/rotate-code

Responses: 201 Public or optional auth
GET /v2/user/referrals/me/summary

GET /v2/user/referrals/me/summary

Responses: 200 Public or optional auth

User: Report + Dispute + Flags

18 operations

GET /v2/ops/ab-tests/{key}/assign

GET /v2/ops/ab-tests/{key}/assign

Responses: 200 Public or optional auth
POST /v2/ops/disputes

POST /v2/ops/disputes

Responses: 201 Public or optional auth
GET /v2/ops/disputes/{id}/evidence

GET /v2/ops/disputes/{id}/evidence

Responses: 200 Public or optional auth
POST /v2/ops/disputes/{id}/evidence

POST /v2/ops/disputes/{id}/evidence

Responses: 201 Public or optional auth
GET /v2/ops/disputes/{id}/messages

GET /v2/ops/disputes/{id}/messages

Responses: 200 Public or optional auth
POST /v2/ops/disputes/{id}/messages

POST /v2/ops/disputes/{id}/messages

Responses: 201 Public or optional auth
GET /v2/ops/feature-flags/{key}/evaluate

GET /v2/ops/feature-flags/{key}/evaluate

Responses: 200 Public or optional auth
POST /v2/ops/reports

POST /v2/ops/reports

Responses: 201 Public or optional auth
GET /v2/ops/reports/{reportId}

GET /v2/ops/reports/{reportId}

Responses: 200 Public or optional auth
POST /v2/ops/reports/{reportId}/appeal

POST /v2/ops/reports/{reportId}/appeal

Responses: 201 Public or optional auth
POST /v2/ops/reports/{reportId}/appeals/second-instance

POST /v2/ops/reports/{reportId}/appeals/second-instance

Responses: 201 Public or optional auth
GET /v2/ops/reports/against-me

GET /v2/ops/reports/against-me

Responses: 200 Public or optional auth
GET /v2/ops/reports/against-me/{reportId}/timeline

GET /v2/ops/reports/against-me/{reportId}/timeline

Responses: 200 Public or optional auth
GET /v2/ops/reports/appeals/{appealId}

GET /v2/ops/reports/appeals/{appealId}

Responses: 200 Public or optional auth
GET /v2/ops/reports/appeals/mine

GET /v2/ops/reports/appeals/mine

Responses: 200 Public or optional auth
GET /v2/ops/reports/mine

GET /v2/ops/reports/mine

Responses: 200 Public or optional auth
GET /v2/ops/reports/mine/{reportId}/timeline

GET /v2/ops/reports/mine/{reportId}/timeline

Responses: 200 Public or optional auth
GET /v2/ops/reports/mine/check

GET /v2/ops/reports/mine/check

Responses: 200 Public or optional auth

User: Social

13 operations

POST /v2/social/contact-matches

POST /v2/social/contact-matches

Responses: 201 Public or optional auth
POST /v2/social/follow-requests/{edgeId}/approve

POST /v2/social/follow-requests/{edgeId}/approve

Responses: 201 Public or optional auth
POST /v2/social/follow-requests/{edgeId}/reject

POST /v2/social/follow-requests/{edgeId}/reject

Responses: 201 Public or optional auth
GET /v2/social/me/follow-requests

GET /v2/social/me/follow-requests

Responses: 200 Public or optional auth
GET /v2/social/me/follow-requests/sent

GET /v2/social/me/follow-requests/sent

Responses: 200 Public or optional auth
DELETE /v2/social/me/followers/{followerId}

DELETE /v2/social/me/followers/{followerId}

Responses: 200 Public or optional auth
GET /v2/social/suggestions

GET /v2/social/suggestions

Responses: 200 Public or optional auth
GET /v2/social/users/{userId}/counts

GET /v2/social/users/{userId}/counts

Responses: 200 Public or optional auth
DELETE /v2/social/users/{userId}/follow

DELETE /v2/social/users/{userId}/follow

Responses: 200 Public or optional auth
POST /v2/social/users/{userId}/follow

POST /v2/social/users/{userId}/follow

Responses: 201 Public or optional auth
GET /v2/social/users/{userId}/followers

GET /v2/social/users/{userId}/followers

Responses: 200 Public or optional auth
GET /v2/social/users/{userId}/following

GET /v2/social/users/{userId}/following

Responses: 200 Public or optional auth
GET /v2/social/users/{userId}/followings

GET /v2/social/users/{userId}/followings

Responses: 200 Public or optional auth

User: Stories

13 operations

GET /v2/feed/stories

GET /v2/feed/stories

Responses: 200 Public or optional auth
POST /v2/feed/stories

POST /v2/feed/stories

Responses: 201 Public or optional auth
DELETE /v2/feed/stories/{id}

DELETE /v2/feed/stories/{id}

Responses: 200 Public or optional auth
GET /v2/feed/stories/{id}/insights

GET /v2/feed/stories/{id}/insights

Responses: 200 Public or optional auth
GET /v2/feed/stories/{id}/public

GET /v2/feed/stories/{id}/public

Responses: 200 Public or optional auth
POST /v2/feed/stories/{id}/react

POST /v2/feed/stories/{id}/react

Responses: 201 Public or optional auth
POST /v2/feed/stories/{id}/reply

POST /v2/feed/stories/{id}/reply

Responses: 201 Public or optional auth
GET /v2/feed/stories/{id}/status

GET /v2/feed/stories/{id}/status

Responses: 200 Public or optional auth
POST /v2/feed/stories/{id}/sticker/{stickerId}/respond

POST /v2/feed/stories/{id}/sticker/{stickerId}/respond

Responses: 201 Public or optional auth
POST /v2/feed/stories/{id}/view

POST /v2/feed/stories/{id}/view

Responses: 201 Public or optional auth
GET /v2/feed/stories/{id}/viewers

GET /v2/feed/stories/{id}/viewers

Responses: 200 Public or optional auth
POST /v2/feed/stories/text

POST /v2/feed/stories/text

Responses: 201 Public or optional auth
POST /v2/feed/stories/video

POST /v2/feed/stories/video

Responses: 201 Public or optional auth

User: Story settings

9 operations

GET /v2/feed/stories/close-friends

GET /v2/feed/stories/close-friends

Responses: 200 Public or optional auth
POST /v2/feed/stories/close-friends

POST /v2/feed/stories/close-friends

Responses: 201 Public or optional auth
DELETE /v2/feed/stories/close-friends/{userId}

DELETE /v2/feed/stories/close-friends/{userId}

Responses: 200 Public or optional auth
GET /v2/feed/stories/close-friends/picker

GET /v2/feed/stories/close-friends/picker

Responses: 200 Public or optional auth
GET /v2/feed/stories/highlights

GET /v2/feed/stories/highlights

Responses: 200 Public or optional auth
POST /v2/feed/stories/highlights

POST /v2/feed/stories/highlights

Responses: 201 Public or optional auth
DELETE /v2/feed/stories/highlights/{id}

DELETE /v2/feed/stories/highlights/{id}

Responses: 200 Public or optional auth
GET /v2/feed/stories/highlights/{id}/stories

GET /v2/feed/stories/highlights/{id}/stories

Responses: 200 Public or optional auth
GET /v2/feed/stories/highlights/by-user/{userId}

GET /v2/feed/stories/highlights/by-user/{userId}

Responses: 200 Public or optional auth

User: Tag approvals

4 operations

PATCH /v2/me/tag-approval-required

Toggle whether new tags require your approval.

Responses: 200 Public or optional auth
POST /v2/me/tag-approvals/{id}/approve

Approve a pending tag.

Responses: 201 Public or optional auth
POST /v2/me/tag-approvals/{id}/deny

Deny a pending tag.

Responses: 201 Public or optional auth
GET /v2/me/tag-approvals/pending

List pending tag / mention approvals.

Responses: 200 Public or optional auth

User: Unit-system preference

2 operations

GET /v2/me/units

GET /v2/me/units

Responses: 200 Public or optional auth
PATCH /v2/me/units

PATCH /v2/me/units

Responses: 200 Public or optional auth

User: Wearables

4 operations

GET /v2/integrations/wearables

GET /v2/integrations/wearables

Responses: 200 Public or optional auth
GET /v2/integrations/wearables/{provider}/authorize

GET /v2/integrations/wearables/{provider}/authorize

Responses: 200 Public or optional auth
GET /v2/integrations/wearables/{provider}/callback

GET /v2/integrations/wearables/{provider}/callback

Responses: 200 Public or optional auth
POST /v2/integrations/wearables/{provider}/sync

POST /v2/integrations/wearables/{provider}/sync

Responses: 201 Public or optional auth

Users

64 operations

GET /v2/users

Retrieve multiple Users

Responses: 200 Public or optional auth
POST /v2/users

POST /v2/users

Responses: 201 Public or optional auth
DELETE /v2/users/{id}

Delete a single User

Responses: 200 Public or optional auth
GET /v2/users/{id}

Retrieve a single User

Responses: 200 Public or optional auth
PATCH /v2/users/{id}

PATCH /v2/users/{id}

Responses: 200 Public or optional auth
DELETE /v2/users/{id}/account

DELETE /v2/users/{id}/account

Responses: 200 Public or optional auth
GET /v2/users/{id}/activities

GET /v2/users/{id}/activities

Responses: 200 Public or optional auth
POST /v2/users/{id}/activities

POST /v2/users/{id}/activities

Responses: 201 Public or optional auth
DELETE /v2/users/{id}/activities/{activityId}

DELETE /v2/users/{id}/activities/{activityId}

Responses: 200 Public or optional auth
GET /v2/users/{id}/activities/{activityId}

GET /v2/users/{id}/activities/{activityId}

Responses: 200 Public or optional auth
PATCH /v2/users/{id}/activities/{activityId}

PATCH /v2/users/{id}/activities/{activityId}

Responses: 200 Public or optional auth
GET /v2/users/{id}/activities/{activityId}/track-metadata

GET /v2/users/{id}/activities/{activityId}/track-metadata

Responses: 200 Public or optional auth
POST /v2/users/{id}/activities/manual

POST /v2/users/{id}/activities/manual

Responses: 201 Public or optional auth
GET /v2/users/{id}/activities/tracking-preferences

GET /v2/users/{id}/activities/tracking-preferences

Responses: 200 Public or optional auth
PATCH /v2/users/{id}/admin

PATCH /v2/users/{id}/admin

Responses: 200 Public or optional auth
GET /v2/users/{id}/badges

GET /v2/users/{id}/badges

Responses: 200 Public or optional auth
GET /v2/users/{id}/challenges

GET /v2/users/{id}/challenges

Responses: 200 Public or optional auth
DELETE /v2/users/{id}/challenges/{challengeId}

DELETE /v2/users/{id}/challenges/{challengeId}

Responses: 200 Public or optional auth
GET /v2/users/{id}/challenges/{challengeId}

GET /v2/users/{id}/challenges/{challengeId}

Responses: 200 Public or optional auth
PATCH /v2/users/{id}/challenges/{challengeId}

PATCH /v2/users/{id}/challenges/{challengeId}

Responses: 200 Public or optional auth
POST /v2/users/{id}/challenges/{challengeId}

POST /v2/users/{id}/challenges/{challengeId}

Responses: 201 Public or optional auth
GET /v2/users/{id}/completed-activities

Get another user's completed activities

Responses: 200 Public or optional auth
POST /v2/users/{id}/data-export

POST /v2/users/{id}/data-export

Responses: 201 Public or optional auth
PATCH /v2/users/{id}/email

PATCH /v2/users/{id}/email

Responses: 200 Public or optional auth
GET /v2/users/{id}/gears

GET /v2/users/{id}/gears

Responses: 200 Public or optional auth
POST /v2/users/{id}/gears

POST /v2/users/{id}/gears

Responses: 201 Public or optional auth
DELETE /v2/users/{id}/gears/{gearId}

DELETE /v2/users/{id}/gears/{gearId}

Responses: 200 Public or optional auth
GET /v2/users/{id}/gears/{gearId}

GET /v2/users/{id}/gears/{gearId}

Responses: 200 Public or optional auth
PATCH /v2/users/{id}/gears/{gearId}

PATCH /v2/users/{id}/gears/{gearId}

Responses: 200 Public or optional auth
GET /v2/users/{id}/notifications

Get push notifications of a single user

Use this api in notifications screen

Responses: 200 Public or optional auth
POST /v2/users/{id}/notifications

Send push notification to a single user

Responses: 201 Public or optional auth
PATCH /v2/users/{id}/notifications/disable

Disable sending notification to a device.

Responses: 200 Public or optional auth
POST /v2/users/{id}/notifications/enable

Enable sending notification to a device.

Use only first time when creating FCM token.

Responses: 201 Public or optional auth
GET /v2/users/{id}/notifications/preferences

Get a user's notifications preferences

Returns notification preferences grouped by category (challenges, events, activity). Other notifications are always enabled.

Responses: 200 Public or optional auth
PATCH /v2/users/{id}/notifications/preferences

Update a user's notifications preferences

Enable or disable notification categories (challenges, events, activity). Other notifications cannot be disabled.

Responses: 200 Public or optional auth
PATCH /v2/users/{id}/phone

PATCH /v2/users/{id}/phone

Responses: 200 Public or optional auth
GET /v2/users/{id}/posts

Get another user's posts (privacy + block gated)

Responses: 200 Public or optional auth
GET /v2/users/{id}/profile-view

GET /v2/users/{id}/profile-view

Responses: 200 Public or optional auth
GET /v2/users/{id}/public

GET /v2/users/{id}/public

Responses: 200 Public or optional auth
GET /v2/users/{id}/schedules

GET /v2/users/{id}/schedules

Responses: 200 Public or optional auth
POST /v2/users/{id}/schedules

POST /v2/users/{id}/schedules

Responses: 201 Public or optional auth
DELETE /v2/users/{id}/schedules/{scheduleId}

DELETE /v2/users/{id}/schedules/{scheduleId}

Responses: 200 Public or optional auth
GET /v2/users/{id}/schedules/{scheduleId}

GET /v2/users/{id}/schedules/{scheduleId}

Responses: 200 Public or optional auth
PATCH /v2/users/{id}/schedules/{scheduleId}

PATCH /v2/users/{id}/schedules/{scheduleId}

Responses: 200 Public or optional auth
GET /v2/users/{id}/steps

GET /v2/users/{id}/steps

Responses: 200 Public or optional auth
PATCH /v2/users/{id}/steps

PATCH /v2/users/{id}/steps

Responses: 200 Public or optional auth
GET /v2/users/{id}/steps/summary

GET /v2/users/{id}/steps/summary

Responses: 200 Public or optional auth
PATCH /v2/users/{id}/toggle

PATCH /v2/users/{id}/toggle

Responses: 200 Public or optional auth
PATCH /v2/users/{id}/upload-profile-photo

Upload the user selfie

Responses: 200 Public or optional auth
POST /v2/users/{id}/username

POST /v2/users/{id}/username

Responses: 201 Public or optional auth
GET /v2/users/{id}/wallet

GET /v2/users/{id}/wallet

Responses: 200 Public or optional auth
GET /v2/users/{id}/wallets/{walletId}

GET /v2/users/{id}/wallets/{walletId}

Responses: 200 Public or optional auth
POST /v2/users/bots

Create a fully populated bot athlete account

Admin-only multipart endpoint. Every profile field and at least one sport are required. Use GET /v2/users/username-available for the debounced username check.

Responses: 201 Public or optional auth
GET /v2/users/by-username/{username}

GET /v2/users/by-username/{username}

Responses: 200 Public or optional auth
GET /v2/users/check-email

Check if an email already exists

Responses: 200 Public or optional auth
GET /v2/users/me

GET /v2/users/me

Responses: 200 Public or optional auth
GET /v2/users/me/activities

Get the authenticated user's activities

Responses: 200 Public or optional auth
GET /v2/users/me/activity-summary

GET /v2/users/me/activity-summary

Responses: 200 Public or optional auth
GET /v2/users/me/activity-trends

GET /v2/users/me/activity-trends

Responses: 200 Public or optional auth
POST /v2/users/me/bot-onboarding

Complete the current bot athlete onboarding profile

Bot-only authenticated multipart endpoint. Call after POST /v2/auth/verify-otp returns the new bot access token.

Responses: 201 Public or optional auth
GET /v2/users/me/clubs

List the calling athlete's club memberships

Returns every ACTIVE membership for the bearer token user. Each item includes club workspace/card fields (id, name, slug, logo/banner, location, status, visibility, memberCount, verified, deactivated, deactivatedAt) and the caller's role (OWNER | ADMIN | MODERATOR | MEMBER) so the client can gate admin UI on first paint without a separate members fetch. Deactivated clubs are returned with deactivated=true rather than omitted, so a member sees a badge instead of the club vanishing.

Responses: 200 Public or optional auth
PATCH /v2/users/me/fcm-token

Register or update the mobile FCM token for the current user.

Called by the mobile app on every launch. Deactivates all previous tokens for the user and saves the new one (one user → one active token). Send platform as "android" or "ios".

Responses: 200 Public or optional auth
GET /v2/users/me/pending-activity-targets

GET /v2/users/me/pending-activity-targets

Responses: 200 Public or optional auth
GET /v2/users/username-available

Check whether a username (Repeak ID) is available

Responses: 200 Public or optional auth

v2/discover/map

1 operations

GET /v2/discover/map

§28 — geo-pinned event pins for the Discover Map surface

Responses: 200 Public or optional auth

v2/users/albums

10 operations

GET /v2/users/{userId}/albums

§26.6 — list user albums (paginated)

Responses: 200 Public or optional auth
POST /v2/users/{userId}/albums

§26.6 — create user album

Responses: 201 Public or optional auth
DELETE /v2/users/{userId}/albums/{albumId}

§26.6 — delete album (photos move to unfiled, not deleted)

Responses: 200 Public or optional auth
GET /v2/users/{userId}/albums/{albumId}

§26.6 — get one album

Responses: 200 Public or optional auth
PATCH /v2/users/{userId}/albums/{albumId}

§26.6 — update album (rename / cover)

Responses: 200 Public or optional auth
GET /v2/users/{userId}/photos

§26.2 — list user photos (paginated)

Responses: 200 Public or optional auth
POST /v2/users/{userId}/photos

§26.2 — create user photo (post-upload)

Responses: 201 Public or optional auth
DELETE /v2/users/{userId}/photos/{photoId}

§26.2 — delete photo (soft-removal)

Responses: 200 Public or optional auth
GET /v2/users/{userId}/photos/{photoId}

§26.2 — get one photo

Responses: 200 Public or optional auth
PATCH /v2/users/{userId}/photos/{photoId}

§26.2 — update photo (caption / album / privacy)

Responses: 200 Public or optional auth

v2/users/onboarding

10 operations

GET /v2/users/{id}/onboarding

§14 — onboarding wizard state for the given user (self-only access).

Responses: 200 Public or optional auth
PATCH /v2/users/{id}/onboarding/optional

§14.4 — record a skippable onboarding step visit/adoption signal.

Responses: 200 Public or optional auth
PUT /v2/users/{id}/onboarding/sports

§14.1 Screen 7 — set the user's active multi-sport preferences (self-only).

Responses: 200 Public or optional auth
POST /v2/users/me/onboarding/athlete-follows

Persist the initial onboarding sports and athlete-follow selection.

Responses: 201 Public or optional auth
PUT /v2/users/me/onboarding/athlete-follows

Replace all onboarding sports and athlete-follow selections before completion.

Responses: 200 Public or optional auth
POST /v2/users/me/onboarding/athlete-follows/suggestions

Preview athlete follow suggestions from unsaved sport interests.

Responses: 201 Public or optional auth
GET /v2/users/me/onboarding/find-community

§14 — clubs near the athlete for the onboarding find-community screen.

Responses: 200 Public or optional auth
GET /v2/users/me/onboarding/first-event-suggestion

§14 — events near the athlete for the onboarding first-event screen.

Responses: 200 Public or optional auth
PUT /v2/users/me/onboarding/interests

Persist selected sports, topics and sub-topics before follow suggestions.

Responses: 200 Public or optional auth
POST /v2/users/me/onboarding/sport-topics/catalog

List active admin-managed topics grouped by selected sports.

Responses: 201 Public or optional auth

v2/users/repeak-id

1 operations

GET /v2/users/{id}/repeak-id

§16 — Repeak ID aggregate (header + stats + PRs + recent + race + badges + clubs + challenges)

Responses: 200 Public or optional auth

v2/users/temp-assign-username

5 operations

DELETE /v2/users/temp-assign-username/{id}

TEMP — remove a user's username (not the user)

Responses: 200 Public or optional auth
POST /v2/users/temp-assign-username/{id}

TEMP — assign a username to one old user

Responses: 201 Public or optional auth
DELETE /v2/users/temp-assign-username/bulk

TEMP — remove username from all users

Responses: 200 Public or optional auth
POST /v2/users/temp-assign-username/bulk

TEMP — bulk-assign usernames to old users

Responses: 201 Public or optional auth
GET /v2/users/temp-assign-username/missing

TEMP — list users missing a username

Responses: 200 Public or optional auth

V3-P1-FINAL: Consolidated launch-grade closures

12 operations

GET /v2/p1-final/campaigns

V3-P1-009 list campaigns

Responses: 200 Public or optional auth
POST /v2/p1-final/campaigns

V3-P1-009 + V3-P1-018 engagement campaign create

Responses: 201 Public or optional auth
POST /v2/p1-final/cheers

V3-P1-011 / V3-P1-029 live cheer send

Responses: 201 Public or optional auth
GET /v2/p1-final/cheers/me

V3-P1-011 list cheers I received

Responses: 200 Public or optional auth
GET /v2/p1-final/churn-risk/bucket/{bucket}

GET /v2/p1-final/churn-risk/bucket/{bucket}

Responses: 200 Public or optional auth
POST /v2/p1-final/churn-risk/compute

V3-P1-038 rules-based churn risk compute

Responses: 201 Public or optional auth
GET /v2/p1-final/churn-risk/me

GET /v2/p1-final/churn-risk/me

Responses: 200 Public or optional auth
POST /v2/p1-final/fundraising-teams

V3-P1-035 group fundraising team

Responses: 201 Public or optional auth
POST /v2/p1-final/self-service-requests

V3-P1-034 self-service bib transfer / distance / defer

Responses: 201 Public or optional auth
GET /v2/p1-final/series-leaderboard/{seriesKey}

V3-P1-021 series leaderboard top entries

Responses: 200 Public or optional auth
POST /v2/p1-final/training-programs

V3-P1-022 custom training program create

Responses: 201 Public or optional auth
GET /v2/p1-final/training-programs/me

GET /v2/p1-final/training-programs/me

Responses: 200 Public or optional auth

V3-P2-FINAL: Consolidated P2 launch-grade closures

27 operations

GET /v2/p2-final/clubs/{clubId}/awards

GET /v2/p2-final/clubs/{clubId}/awards

Responses: 200 Public or optional auth
POST /v2/p2-final/clubs/{clubId}/awards

V3-P2-040 grant club award

Responses: 201 Public or optional auth
GET /v2/p2-final/clubs/{clubId}/sports

GET /v2/p2-final/clubs/{clubId}/sports

Responses: 200 Public or optional auth
POST /v2/p2-final/clubs/{clubId}/sports

V3-P2-012 set club sports

Responses: 201 Public or optional auth
GET /v2/p2-final/compromised-accounts

V3-P2-007 list compromised account reports

Responses: 200 Public or optional auth
POST /v2/p2-final/compromised-accounts

V3-P2-007 compromised account intake

Responses: 201 Public or optional auth
POST /v2/p2-final/dashboards

V3-P2-037 create custom dashboard

Responses: 201 Public or optional auth
GET /v2/p2-final/dashboards/me

GET /v2/p2-final/dashboards/me

Responses: 200 Public or optional auth
POST /v2/p2-final/events/{eventId}/version-snapshot

V3-P2-028 capture event version snapshot

Responses: 201 Public or optional auth
GET /v2/p2-final/events/{eventId}/versions

GET /v2/p2-final/events/{eventId}/versions

Responses: 200 Public or optional auth
POST /v2/p2-final/experiments

V3-P2-049/050 upsert experiment variant

Responses: 201 Public or optional auth
GET /v2/p2-final/experiments/{experimentKey}

GET /v2/p2-final/experiments/{experimentKey}

Responses: 200 Public or optional auth
POST /v2/p2-final/experiments/event

V3-P2-049/050 record exposure / conversion

Responses: 201 Public or optional auth
GET /v2/p2-final/kb-metrics

GET /v2/p2-final/kb-metrics

Responses: 200 Public or optional auth
POST /v2/p2-final/kb-metrics/event

V3-P2-042 record KB article metric

Responses: 201 Public or optional auth
POST /v2/p2-final/memories

V3-P2-019 generate athlete memory (system)

Responses: 201 Public or optional auth
GET /v2/p2-final/memories/me

GET /v2/p2-final/memories/me

Responses: 200 Public or optional auth
GET /v2/p2-final/photographer-listings

GET /v2/p2-final/photographer-listings

Responses: 200 Public or optional auth
POST /v2/p2-final/photographer-listings

V3-P2-020 create photographer listing

Responses: 201 Public or optional auth
POST /v2/p2-final/referrals/code

V3-P2-034 generate referral code

Responses: 201 Public or optional auth
GET /v2/p2-final/referrals/me

GET /v2/p2-final/referrals/me

Responses: 200 Public or optional auth
POST /v2/p2-final/referrals/redeem

V3-P2-034 redeem referral code

Responses: 201 Public or optional auth
POST /v2/p2-final/retention/hook

V3-P2-057/058 record retention hook execution

Responses: 201 Public or optional auth
GET /v2/p2-final/retention/me

GET /v2/p2-final/retention/me

Responses: 200 Public or optional auth
POST /v2/p2-final/tags

V3-P2-021 tag athlete in photo/activity

Responses: 201 Public or optional auth
GET /v2/p2-final/tags/{subjectType}/{subjectId}

GET /v2/p2-final/tags/{subjectType}/{subjectId}

Responses: 200 Public or optional auth
POST /v2/p2-final/tags/{tagId}/remove

V3-P2-021 remove tag (tagged user only)

Responses: 201 Public or optional auth

Viewer: Notification Inbox

4 operations

GET /v2/user/notifications/inbox

List the viewer inbox (unread first, then chronological)

Responses: 200 Public or optional auth
POST /v2/user/notifications/inbox/{id}/read

Mark a single notification read

Responses: 201 Public or optional auth
POST /v2/user/notifications/inbox/read-all

Mark every unread notification read

Responses: 201 Public or optional auth
GET /v2/user/notifications/inbox/unread-count

Unread count badge (bell icon)

Responses: 200 Public or optional auth

Virtual Run

5 operations

GET /v2/virtual-run/{eventId}/leaderboard

Public leaderboard — ASC by durationSeconds.

Responses: 200 Public or optional auth
GET /v2/virtual-run/{eventId}/me

GET /v2/virtual-run/{eventId}/me

Responses: 200 Public or optional auth
POST /v2/virtual-run/{eventId}/submit

Submit an Activity against a virtual event. PB-replace: only a faster submission overwrites.

Responses: 201 Public or optional auth
GET /v2/virtual-run/{eventId}/window

Window-state snapshot for an event. Public so mobile can show "opens in 3d" shell before sign-in.

Responses: 200 Public or optional auth
GET /v2/virtual-run/open

Open-window virtual-run catalogue — every event currently accepting virtual submissions. Public.

Responses: 200 Public or optional auth

Wallets

4 operations

POST /v2/wallets/admin/sync

Trigger manual wallet sync

Manually triggers the wallet sync process. This includes syncing all wallet balances, reprocessing unprocessed activities, and completing pending transactions.

Responses: 201 Auth required
GET /v2/wallets/me

Get the authenticated user's primary wallet + recent txns.

Responses: 200 Auth required
GET /v2/wallets/me/summary

Get the authenticated user's primary wallet summary (no transactions array).

Responses: 200 Auth required
GET /v2/wallets/me/transactions

Get the authenticated user's wallet transactions (paginated, owner-only).

Responses: 200 Auth required

Webhooks: Notification DLR

3 operations

POST /v2/webhooks/gupshup/dlr

POST /v2/webhooks/gupshup/dlr

Responses: 200 Public or optional auth
POST /v2/webhooks/msg91/dlr

POST /v2/webhooks/msg91/dlr

Responses: 200 Public or optional auth
POST /v2/webhooks/msg91/email/dlr

POST /v2/webhooks/msg91/email/dlr

Responses: 200 Public or optional auth