Skip to main content

API Architecture

Concordia uses Astro API routes for server-side endpoints. All API routes are located in /src/pages/api/ and follow RESTful conventions.

Base URL Structure

All API endpoints are prefixed with /api/:

Endpoint Categories

  • Authentication: /api/auth/* - Better Auth endpoints (login, register, session)
  • Admin Blog: /api/admin/blog/* - Blog management (articles, authors, categories, comments, media)
  • Admin Services: /api/admin/services/* - Services management (services, categories, availability, bookings, media)
  • Admin Organizations: /api/admin/organizations/* - Organization and member management
  • Client Auth: /api/auth-client/* - Client-side auth helpers (verification, password reset)
  • Profile: /api/profile/* - User profile management

Request/Response Patterns

Request Format

All API endpoints accept JSON payloads:

Response Format

Successful responses return JSON with HTTP 200/201:
Error responses include descriptive error codes:

HTTP Status Codes


Authentication Requirements

Admin Endpoints

All /api/admin/* endpoints require:
  1. Active session (cookie or Bearer token)
  2. Admin role (checked via guardAdmin helper)

Public Endpoints

  • /api/auth/* - Open for authentication flows
  • /api/auth-client/* - Open for email verification and password reset

Session Management

Sessions are managed by Better Auth with:
  • Cookie-based sessions (default)
  • Bearer token support (for API clients)
  • Session duration: 7 days
  • Session refresh: Every 24 hours
  • Absolute timeout: 7 days

Rate Limiting

Concordia implements database-backed rate limiting through Better Auth.

Configuration

From /src/lib/auth/auth.ts:105-127:

Rate Limits

Rate Limit Headers

When rate limited, responses include:
  • HTTP 429 Too Many Requests
  • Error message: "Too many login attempts" or similar

Error Handling

Common Error Codes

Error Response Example


Security Headers

All API responses include security headers:

Pagination

List endpoints support pagination via query parameters:

Parameters

integer
default:"1"
Page number (1-indexed)
integer
default:"20"
Items per page (max: 100)

Response Format


Most list endpoints support filtering:
  • q - Text search (slug, title, email, etc.)
  • status - Filter by status (draft, published, etc.)
  • featured - Filter featured items (true/false)
  • category - Filter by category ID
  • organizationId - Filter by organization

Example


Audit Logging

All admin actions are logged to the audit_log table:

Logged Actions

  • All CRUD operations (create, update, delete)
  • Authentication events (login, logout, signup)
  • Member management (invite, remove, role changes)
  • Content publication (publish, unpublish)

API Endpoints by Category

Authentication & Users

Content Management

  • Blog API - Articles, authors, categories, comments, media

Services & Bookings

Organizations


Next Steps

Authentication API

Login, register, and session management

Profile API

User profile CRUD operations

Blog API

Manage articles, authors, and categories

Services API

Service listings, bookings, and availability

Organizations API

Organization and member management

Users API

Admin user management and moderation