Skip to content

Admin APIs

Admin APIs live under /api/v1/admin/** and are intended for operational tooling and admin-only product surfaces.

Access model

All documented admin routes currently require:

  • a valid bearer token
  • a principal with ADMIN role

In practice:

  • missing or invalid auth returns 401
  • authenticated non-admin users should expect 403
  • write-heavy admin routes are also subject to normal API rate limiting

Invitations

Invitation management routes live under /api/v1/admin/invitations.

EndpointPurposeCurrent response shape
POST /api/v1/admin/invitations?createdBy=...Generate one invitation coderaw string
POST /api/v1/admin/invitations/batch?createdBy=...&count=...Generate multiple invitation codesraw string array
GET /api/v1/admin/invitations?page=...&size=...&status=...List invitation codesraw Page<InvitationCode>
GET /api/v1/admin/invitations/{code}Read one invitationraw InvitationCode
DELETE /api/v1/admin/invitations/{code}Revoke invitation204 No Content

Notable contract details:

  • createdBy is passed as a query parameter, not JSON body content
  • invitation routes currently return raw entities and strings, not ApiResponse<T>
  • the list route supports optional filtering by invitation status

User administration

User management routes live under /api/v1/admin/users.

EndpointPurposeCurrent response shape
GET /api/v1/admin/usersPaginated user list with filtersraw Page<UserAdminDto>
GET /api/v1/admin/users/{userId}Read one userraw UserAdminDto
PATCH /api/v1/admin/users/{userId}Update username, email, full name, status, role, or tierraw UserAdminDto
POST /api/v1/admin/users/{userId}/suspendSuspend accountraw UserAdminDto
POST /api/v1/admin/users/{userId}/activateActivate accountraw UserAdminDto
GET /api/v1/admin/users/statsAggregate user statsraw stats object

Supported list filters:

  • page
  • size
  • role
  • status
  • membershipTier
  • search

Notable behavior:

  • list size defaults to 20
  • list size is capped at 200
  • attempts to suspend or demote the last remaining admin are rejected with 400
  • that guardrail currently returns the unchanged user DTO body, not a dedicated error object

Billing and quota configuration

Admin configuration routes use the shared response envelope more consistently.

Billing config

Routes under /api/v1/admin/billing:

EndpointPurposeCurrent response shape
GET /api/v1/admin/billing/configRead billing and expert review configApiResponse<AdminBillingConfigResponse>
PUT /api/v1/admin/billing/plans/{tier}Update one membership tier planApiResponse<SubscriptionPlanDto>
PUT /api/v1/admin/billing/expert-reviewUpdate one-time expert review pricingApiResponse<ExpertReviewOfferingDto>

Quota config

Routes under /api/v1/admin/quotas:

EndpointPurposeCurrent response shape
GET /api/v1/admin/quotas/configRead full quota configApiResponse<AdminQuotaConfigResponse>
PUT /api/v1/admin/quotas/tiers/{tier}Update one tier quota policyApiResponse<TierQuotaDto>
PUT /api/v1/admin/quotas/globalUpdate global quota policyApiResponse<GlobalQuotaDto>

Both config groups key off the existing membership tiers:

  • FREE
  • STARTER
  • PROFESSIONAL
  • ENTERPRISE

Expert review operations

Manual expert review operations live under /api/v1/admin/expert-reviews.

EndpointPurposeCurrent response shape
GET /api/v1/admin/expert-reviews/ordersPaginated order listApiResponse<Page<...>>
GET /api/v1/admin/expert-reviews/orders/{orderId}Order detailsApiResponse<...>
PATCH /api/v1/admin/expert-reviews/orders/{orderId}/statusUpdate order statusApiResponse<...>
GET /api/v1/admin/expert-reviews/orders/{orderId}/files/downloadDownload project files as ZIPstreaming application/zip
GET /api/v1/admin/expert-reviews/orders/{orderId}/t661/latestLatest T661 payload for the order projectApiResponse<...>

Operational caveats:

  • the file download endpoint is not JSON and should be treated as a binary stream
  • order filtering currently supports optional status
  • status updates are rate-limited like other admin mutations

Contract caveats

The admin surface is not fully normalized yet:

  • invitation and user-management routes mostly return raw DTOs or entities
  • billing, quota, and most expert-review routes return ApiResponse<T>
  • expert-review file export returns a ZIP stream

If you build admin clients or scripts, handle response shapes per endpoint group instead of assuming one uniform parser.