Organizations API
Base paths: /api/orgs, /api/public/orgs
All endpoints require Authorization: Bearer <token> unless marked public.
Core Organization
Create Organisation (admin only)
POST /api/orgs
Authorization: Bearer <systemAdminToken>
{
"name": "My Association",
"slug": "my-association",
"subdomain": "my-association",
"email": "[email protected]",
"orgType": "ASSOCIATION"
}
List Organisations (admin only)
GET /api/orgs
Authorization: Bearer <systemAdminToken>
Get Organisation by ID
GET /api/orgs/{id}
Authorization: Bearer <token>
Get by Slug (public)
GET /api/orgs/slug/{slug}
Get by Subdomain (public)
GET /api/orgs/subdomain/{subdomain}
Update Organisation
PUT /api/orgs/{id}
Authorization: Bearer <adminToken>
{
"name": "Updated Name",
"description": "About us...",
"website_url": "https://example.org",
"allow_join_requests": true
}
Delete Organisation
DELETE /api/orgs/{id}
Authorization: Bearer <ownerToken>
List Roles
GET /api/orgs/{id}/roles
Authorization: Bearer <adminToken>
Health
GET /api/orgs/health
Branding & Assets
Get Branding
GET /api/orgs/{orgId}/branding
Authorization: Bearer <token>
Also available publicly:
GET /api/public/orgs/{slug}/branding
Update Branding
PUT /api/orgs/{orgId}/branding
Authorization: Bearer <adminToken>
{
"primaryColor": "#2563eb",
"secondaryColor": "#1e40af",
"fontFamily": "Inter",
"logoUrl": "https://..."
}
Upload Asset
POST /api/orgs/{orgId}/assets
Authorization: Bearer <adminToken>
Content-Type: multipart/form-data
file=<binary>
assetType=LOGO
Update Asset
PUT /api/orgs/{orgId}/assets/{assetId}
Authorization: Bearer <adminToken>
Delete Asset
DELETE /api/orgs/{orgId}/assets/{assetId}
Authorization: Bearer <adminToken>
Invitations
Send Invitation
POST /api/orgs/{organizationId}/invitations
Authorization: Bearer <adminToken>
{
"email": "[email protected]",
"roleId": "role-uuid",
"message": "We'd love for you to join!"
}
List Invitations
GET /api/orgs/{organizationId}/invitations
Authorization: Bearer <adminToken>
Cancel Invitation
DELETE /api/orgs/{organizationId}/invitations/{invitationId}
Authorization: Bearer <adminToken>
Accept Invitation (public)
POST /api/orgs/{organizationId}/invitations/{token}/accept
Join Requests
Submit Join Request (public)
POST /api/public/orgs/{slug}/join-requests
{
"firstName": "Jane",
"lastName": "Doe",
"email": "[email protected]",
"message": "I'd like to join your association."
}
List Join Requests
GET /api/orgs/{organizationId}/join-requests
Authorization: Bearer <adminToken>
Pending Count
GET /api/orgs/{organizationId}/join-requests/pending-count
Authorization: Bearer <adminToken>
Approve
POST /api/orgs/{organizationId}/join-requests/{requestId}/approve
Authorization: Bearer <adminToken>
Reject
POST /api/orgs/{organizationId}/join-requests/{requestId}/reject
Authorization: Bearer <adminToken>
Member Directory
Get Directory
GET /api/orgs/{organizationId}/directory
Authorization: Bearer <token>
Get Directory Config
GET /api/orgs/{organizationId}/directory/config
Authorization: Bearer <adminToken>
Update Directory Config
PUT /api/orgs/{organizationId}/directory/config
Authorization: Bearer <adminToken>
{
"visibility": "MEMBERS_ONLY",
"showEmail": false,
"showPhone": false,
"allowMemberSearch": true
}
Email Templates
List Templates
GET /api/orgs/{organizationId}/email-templates
Authorization: Bearer <adminToken>
Get Template by Type
GET /api/orgs/{organizationId}/email-templates/type/{type}
Authorization: Bearer <adminToken>
Types: WELCOME, INVITATION, PASSWORD_RESET, EVENT_CONFIRMATION, etc.
Update Template
PUT /api/orgs/{organizationId}/email-templates/{templateId}
Authorization: Bearer <adminToken>
{
"subject": "Welcome to {{org.name}}!",
"body": "<h1>Hello {{user.firstName}}</h1>..."
}
Preview Template
POST /api/orgs/{organizationId}/email-templates/{templateId}/preview
Authorization: Bearer <adminToken>
Reset to Default
POST /api/orgs/{organizationId}/email-templates/reset/{type}
Authorization: Bearer <adminToken>
SMTP Configuration
Get Config
GET /api/orgs/{organizationId}/smtp
Authorization: Bearer <adminToken>
Update Config
PUT /api/orgs/{organizationId}/smtp
Authorization: Bearer <adminToken>
{
"host": "smtp.gmail.com",
"port": 587,
"username": "[email protected]",
"password": "app-password",
"fromAddress": "[email protected]",
"fromName": "My Association"
}
Test Connection
POST /api/orgs/{organizationId}/smtp/test
Authorization: Bearer <adminToken>
Send Test Email
POST /api/orgs/{organizationId}/smtp/test-email
Authorization: Bearer <adminToken>
{ "to": "[email protected]" }
Legal Pages
Get Legal Pages
GET /api/orgs/{id}/legal-pages
Authorization: Bearer <token>
Also public:
GET /api/public/orgs/{slug}/legal-pages
Update Legal Pages
PUT /api/orgs/{id}/legal-pages
Authorization: Bearer <adminToken>
{
"termsOfService": "<html>...",
"privacyPolicy": "<html>...",
"cookiePolicy": "<html>..."
}
Creation via Invitation
Validate Creation Token (public)
GET /api/orgs/creation-invitations/validate/{token}
Create Org with Invitation (public)
POST /api/orgs/create-with-invitation
{
"token": "invitation-token",
"orgName": "New Association",
"adminEmail": "[email protected]",
"adminPassword": "secure-password"
}