Skip to main content

Overview

Sports Index uses JWT-based authentication with HttpOnly cookies. Tokens are issued on login/signup and sent automatically via cookies or manually via Authorization: Bearer {token} headers.

Authentication Methods

MethodHeader/CookieUse Case
Bearer tokenAuthorization: Bearer {token}API clients, mobile apps
HttpOnly cookieaccess_token (set automatically)Browser sessions
Logged-in flaglogged_in cookie (non-HttpOnly)Frontend JS auth state checks

Rate Limits

EndpointLimit
/api/auth/signup3/minute
/api/auth/login5/minute
/api/auth/forgot-password3/minute
/api/auth/reset-password5/minute
/api/auth/resend-verification2/minute

Endpoints

Create Account

POST /api/auth/signup
Body:
FieldTypeRequiredDescription
emailstringYesUser email address
usernamestringYesUnique username
passwordstringYesAccount password
Response:
{
  "id": "uuid",
  "email": "user@example.com",
  "username": "johndoe"
}

Login

POST /api/auth/login
Body:
FieldTypeRequiredDescription
emailstringYesUser email
passwordstringYesAccount password
remember_mebooleanNoExtend token expiry
Response:
{
  "access_token": "eyJ...",
  "token_type": "bearer",
  "user": {
    "id": "uuid",
    "email": "user@example.com",
    "username": "johndoe"
  }
}
Sets access_token (HttpOnly) and logged_in cookies automatically.

Logout

POST /api/auth/logout
Requires authentication.
Clears the access_token and logged_in cookies.

Get Current User

GET /api/auth/me
Requires authentication.
Response:
{
  "id": "uuid",
  "email": "user@example.com",
  "username": "johndoe",
  "is_verified": true,
  "is_admin": false,
  "avatar_url": "https://...",
  "primary_topic_name": "pickleball"
}

Verify Email

GET /api/auth/verify-email?token={token}
Verifies the user’s email address using the token sent via email.

Resend Verification Email

POST /api/auth/resend-verification
Body:
FieldTypeRequired
emailstringYes

Forgot Password

POST /api/auth/forgot-password
Body:
FieldTypeRequired
emailstringYes
Sends a password reset email if the account exists. Always returns success to prevent email enumeration.

Reset Password

POST /api/auth/reset-password
Body:
FieldTypeRequired
tokenstringYes
passwordstringYes

Claim Seed Account

POST /api/auth/claim
Claims a pre-created seed account (used for onboarding creators). Body:
FieldTypeRequired
claim_tokenstringYes
emailstringYes
passwordstringYes
Response:
{
  "access_token": "eyJ...",
  "user": {
    "id": "uuid",
    "username": "creator_name"
  }
}