API Reference¶
Complete REST API reference for Changemaker Lite V2. This section documents all API endpoints, request/response formats, authentication, and error handling.
Overview¶
Changemaker Lite V2 provides two REST APIs:
- Express API (Port 4000) - Main application API
- Fastify Media API (Port 4100) - Media library operations
Both APIs use JSON for request/response bodies and follow RESTful conventions.
API Documentation¶
API reference documentation will be added as the API stabilizes. Planned documentation includes:
Authentication Endpoints¶
POST /api/auth/register- User registrationPOST /api/auth/login- User loginPOST /api/auth/refresh- Refresh access tokenPOST /api/auth/logout- User logoutGET /api/auth/me- Get current user
User Endpoints¶
GET /api/users- List usersPOST /api/users- Create userGET /api/users/:id- Get userPATCH /api/users/:id- Update userDELETE /api/users/:id- Delete user
Campaign Endpoints¶
GET /api/campaigns- List campaignsPOST /api/campaigns- Create campaignGET /api/campaigns/:id- Get campaignPATCH /api/campaigns/:id- Update campaignDELETE /api/campaigns/:id- Delete campaignGET /api/campaigns/public- List public campaignsPOST /api/campaigns/:id/send-email- Send campaign email
Location Endpoints¶
GET /api/locations- List locationsPOST /api/locations- Create locationGET /api/locations/:id- Get locationPATCH /api/locations/:id- Update locationDELETE /api/locations/:id- Delete locationPOST /api/locations/import- CSV importGET /api/locations/export- CSV exportPOST /api/locations/geocode- Bulk geocode
Map Endpoints¶
GET /api/cuts- List cutsPOST /api/cuts- Create cutGET /api/shifts- List shiftsPOST /api/shifts- Create shiftGET /api/canvass/session- Get active sessionPOST /api/canvass/session/start- Start sessionPOST /api/canvass/visit- Record visit
Content Endpoints¶
GET /api/pages- List pagesPOST /api/pages- Create pageGET /api/pages/public/:slug- Get published pageGET /api/email-templates- List templatesPOST /api/email-templates- Create template
Media Endpoints (Port 4100)¶
GET /media-api/videos- List videosPOST /media-api/upload- Upload videoGET /media-api/public/videos- List public videosPOST /media-api/reactions- Add reaction
Authentication¶
All authenticated endpoints require a valid JWT access token in the Authorization header:
Token Lifecycle¶
- Login - POST
/api/auth/login -
Returns:
accessToken(15min) +refreshToken(7 days) -
Access Protected Resource - Include token in header
-
Token verified by
authenticatemiddleware -
Refresh Token - POST
/api/auth/refresh - Provide:
refreshToken -
Returns: New
accessToken+refreshToken -
Logout - POST
/api/auth/logout - Invalidates refresh token
Role-Based Access¶
Endpoints are protected by role requirements:
- Public - No authentication required
- Authenticated - Any logged-in user
- Admin - SUPER_ADMIN, INFLUENCE_ADMIN, or MAP_ADMIN
- Role-Specific - Specific role required
Request Format¶
JSON Body¶
POST /api/campaigns
Content-Type: application/json
Authorization: Bearer <token>
{
"name": "Save the Parks",
"description": "Campaign description",
"published": true
}
Query Parameters¶
Path Parameters¶
Response Format¶
Success Response¶
{
"id": 1,
"name": "Save the Parks",
"description": "Campaign description",
"published": true,
"createdAt": "2026-01-01T00:00:00.000Z",
"updatedAt": "2026-01-01T00:00:00.000Z"
}
Paginated Response¶
Error Response¶
Status Codes¶
- 200 OK - Success
- 201 Created - Resource created
- 204 No Content - Success with no body
- 400 Bad Request - Validation error
- 401 Unauthorized - Authentication required
- 403 Forbidden - Insufficient permissions
- 404 Not Found - Resource not found
- 429 Too Many Requests - Rate limit exceeded
- 500 Internal Server Error - Server error
Rate Limiting¶
Rate limits vary by endpoint:
- Auth endpoints - 10 requests/minute per IP
- Canvass visits - 30 requests/minute per IP
- Public endpoints - 60 requests/minute per IP
- Authenticated endpoints - 120 requests/minute per user
Rate limit headers:
CORS¶
CORS is enabled for all origins in development:
Production should restrict to known domains.
Validation¶
Request bodies are validated using Zod schemas. Validation errors return 400 with details:
{
"error": "Validation error",
"details": {
"email": "Invalid email format",
"password": "Password must be at least 12 characters"
},
"statusCode": 400
}
Pagination¶
List endpoints support pagination:
- page - Page number (default: 1)
- limit - Items per page (default: 20, max: 100)
Example:
Search & Filtering¶
List endpoints support search and filtering:
- search - Text search (varies by endpoint)
- filter - Field-specific filters
Example:
Sorting¶
List endpoints support sorting:
- sort - Field to sort by
- order - Sort direction (asc/desc)
Example:
API Endpoints by Module¶
Authentication¶
- Login, register, refresh, logout, current user
Users¶
- CRUD operations, pagination, search, role management
Settings¶
- Site settings singleton
Campaigns¶
- CRUD, public listing, email sending
Representatives¶
- Postal code lookup, cache management
Responses¶
- CRUD, verification, upvoting, moderation
Postal Codes¶
- Cache service
Campaign Emails¶
- Email tracking, statistics
Email Queue¶
- Queue monitoring, pause/resume, cleanup
Locations¶
- CRUD, CSV import/export, geocoding, NAR import
Cuts¶
- CRUD, spatial queries, location assignment
Shifts¶
- CRUD, signups, email notifications
Canvass¶
- Sessions, visits, routes, dashboard
Tracking¶
- GPS tracking (future)
Map Settings¶
- Map configuration
Pages¶
- CRUD, block library, MkDocs export, public rendering
Email Templates¶
- CRUD, versioning (future)
Media (Port 4100)¶
- Videos, upload, shared media, reactions, jobs
Listmonk¶
- Status, sync, test connection
Pangolin¶
- Tunnel management, setup, configuration
Docs¶
- MkDocs/Code Server status
QR¶
- QR code generation
Observability¶
- Prometheus/Grafana/Alertmanager integration
Services¶
- Health checks
OpenAPI Specification¶
OpenAPI/Swagger documentation is planned for future releases. This will provide:
- Interactive API explorer
- Auto-generated client libraries
- Comprehensive endpoint documentation
- Request/response examples
Testing¶
Test API endpoints using:
- curl - Command-line HTTP client
- Postman - GUI API client
- HTTPie - User-friendly CLI
- Insomnia - API design/testing tool
Example with curl:
# Login
curl -X POST http://localhost:4000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@example.com","password":"Admin123!"}'
# Get campaigns (with token)
curl http://localhost:4000/api/campaigns \
-H "Authorization: Bearer <token>"