Skip to content

Public entry points

This page documents the first-touch API surfaces: public auth flows, landing-page conversion endpoints, and lightweight self-service auth operations.

Public auth flows

These routes do not require an access token.

EndpointPurposeCurrent response shape
POST /api/v1/auth/loginEmail/password loginraw AuthResponse
POST /api/v1/auth/registerAccount creationraw AuthResponse
POST /api/v1/auth/refreshRefresh access token using refresh tokenraw AuthResponse
POST /api/v1/auth/googleGoogle sign-inraw AuthResponse
POST /api/v1/auth/logoutRevoke refresh tokenempty 200 response
POST /api/v1/auth/reset-password-requestRequest reset email with JSON bodyraw success string
POST /api/v1/auth/forgot-password?email=...Request reset email with query paramraw success string
POST /api/v1/auth/reset-passwordReset password from tokenraw success string
GET /api/v1/auth/reset-password/validate?token=...Validate reset tokenraw boolean
POST /api/v1/auth/verify-emailVerify email with JSON bodyraw success string
GET /api/v1/auth/verify-email?token=...Verify email with query paramraw success string
GET /api/v1/auth/verify-email/validate?token=...Validate verification tokenraw boolean
POST /api/v1/auth/resend-verification?email=...Re-send verification emailraw success string

Notable contract details:

  • logout is driven by the refresh token in the request body, not by the access token alone.
  • Password reset and email verification currently expose both JSON-body and query-param variants.
  • These auth routes do not consistently use the backend ApiResponse<T> envelope.

Public landing and conversion endpoints

These routes are public but are not part of the auth domain.

EndpointPurposeCurrent response shape
POST /api/v1/screenerLightweight SR&ED quick pre-check from the marketing siteApiResponse<QuickPrecheckResponse>
POST /api/v1/contact/submitContact form submission and email notificationplain { success, message } object
GET /api/v1/subscription-plansPublic pricing catalog and expert review offerApiResponse<SubscriptionPlansResponse>

Screener-specific behavior:

  • the request body is a minimal { "input": "..." }
  • the backend creates synthetic project/session IDs for the Python envelope
  • the request is intentionally not persisted into the main project/session model

Contact-form-specific behavior:

  • the endpoint is IP-rate-limited
  • application failures return 400 with success: false
  • the response is a plain map, not the shared envelope

Authenticated self-service auth endpoints

These routes require a bearer token, but they still behave like entrypoint APIs because they manage the user session itself.

EndpointPurposeCurrent response shape
GET /api/v1/auth/meRead current user profileraw UserDTO
PATCH /api/v1/auth/meUpdate current user profileraw UserDTO
POST /api/v1/auth/email-verificationSend verification email for current userraw success string
POST /api/v1/auth/change-passwordChange password for current userraw success string

For these routes, missing auth usually results in a plain 401 response rather than an ApiResponse<T> error envelope.

Response-shape caveat

The public edge of the system is not perfectly uniform today:

  • some routes return raw DTOs such as AuthResponse or UserDTO
  • some return raw booleans or strings
  • some return the shared ApiResponse<T> envelope
  • the contact form returns a plain success/error map

Treat this as the real contract for current integrations. If you are building a new caller, do not assume every first-touch endpoint can be handled by one generic envelope parser.