Overview ​
Admin APIs provide Super Admin users with full control over platform configuration, companies, users, and system health. All endpoints require authentication with a Super Admin account.
Base URL: https://api.tendsocial.com/api/admin
Authentication: Bearer token with isSuperAdmin: true
Authentication ​
All admin endpoints require:
- Valid JWT token in
Authorizationheader - User account with
isSuperAdmin: true
Authorization: Bearer YOUR_JWT_TOKEN403 Response if user is not a Super Admin:
{
"error": "Super admin access required"
}Configuration Endpoints ​
System Settings ​
Get System Settings ​
GET /api/admin/config/systemResponse:
{
"id": "default",
"appName": "TendSocial",
"appUrl": "https://app.tendsocial.com",
"supportEmail": "support@tendsocial.com",
"alertEmail": "alerts@tendsocial.com",
"allowSignups": true,
"requireEmailVerification": true,
"defaultTrialDays": 14,
"maxTeamMembersDefault": 10,
"maxSocialAccountsDefault": 5,
"dailyAIBudgetUSD": "50.00",
"monthlyAIBudgetUSD": "1000.00",
"updatedAt": "2025-12-03T10:30:00Z"
}Update System Settings ​
PUT /api/admin/config/systemRequest Body:
{
"appName": "Your Brand",
"appUrl": "https://yourbrand.com",
"supportEmail": "support@yourbrand.com",
"defaultTrialDays": 30,
"dailyAIBudgetUSD": 100.00
}All fields are optional. Only provided fields will be updated.
Response: Updated settings object
Billing Configuration ​
Get Billing Config ​
GET /api/admin/config/billingResponse:
{
"id": "default",
"provider": "lemonsqueezy",
"apiKey": "ls_***",
"storeId": "12345",
"webhookSecret": "whsec_***",
"testMode": false,
"variantMapping": {
"variant_123": "starter",
"variant_456": "professional",
"variant_789": "agency"
},
"currency": "USD",
"taxEnabled": false,
"updatedAt": "2025-12-03T10:30:00Z"
}Update Billing Config ​
PUT /api/admin/config/billingRequest Body:
{
"apiKey": "ls_new_key",
"storeId": "12345",
"webhookSecret": "whsec_secret",
"variantMapping": {
"variant_123": "starter",
"variant_456": "professional"
},
"testMode": true
}Auto-Sync: If GSM_SYNC_ENABLED=true, updates automatically sync to Google Secret Manager.
Email Templates ​
List Email Templates ​
GET /api/admin/config/email-templatesResponse:
[
{
"id": "uuid-1",
"name": "team_invite",
"description": "Team invitation email",
"subject": "You're invited to join {{companyName}} on {{appName}}",
"htmlBody": "<!DOCTYPE html>...",
"textBody": "Plain text version...",
"variables": ["companyName", "inviterName", "inviteUrl", "appName"],
"category": "team",
"isActive": true,
"createdAt": "2025-12-01T00:00:00Z",
"updatedAt": "2025-12-03T10:30:00Z"
}
]Get Email Template ​
GET /api/admin/config/email-templates/:idResponse: Single template object
Update Email Template ​
PUT /api/admin/config/email-templates/:idRequest Body:
{
"subject": "Updated subject with {{variable}}",
"htmlBody": "<!DOCTYPE html><html>...</html>",
"textBody": "Plain text version",
"isActive": true,
"description": "Updated description"
}Response: Updated template object
Feature Flags ​
List Feature Flags ​
GET /api/admin/config/featuresResponse:
[
{
"id": "uuid-1",
"name": "ai_content_generation",
"description": "Enable AI-powered content generation features",
"isEnabled": true,
"enabledForTiers": ["starter", "professional", "agency", "enterprise"],
"enabledForCompanyIds": [],
"metadata": null,
"createdAt": "2025-12-01T00:00:00Z",
"updatedAt": "2025-12-03T10:30:00Z"
},
{
"id": "uuid-2",
"name": "multi_agent_system",
"description": "Enable multi-agent research system",
"isEnabled": false,
"enabledForTiers": ["professional", "agency", "enterprise"],
"enabledForCompanyIds": ["company-id-1"],
"metadata": { "maxAgents": 5 },
"createdAt": "2025-12-01T00:00:00Z",
"updatedAt": "2025-12-03T10:30:00Z"
}
]Update Feature Flag ​
PUT /api/admin/config/features/:idRequest Body:
{
"isEnabled": true,
"enabledForTiers": ["professional", "enterprise"],
"enabledForCompanyIds": ["company-123", "company-456"],
"metadata": { "maxAgents": 10 },
"description": "Updated description"
}Response: Updated feature flag object
Integration Configs ​
List Integrations ​
GET /api/admin/config/integrationsResponse:
[
{
"id": "uuid-1",
"service": "resend",
"displayName": "Resend (Email)",
"isEnabled": true,
"apiKey": "re_***",
"apiSecret": null,
"webhookUrl": null,
"settings": { "fromEmail": "noreply@tendsocial.com" },
"rateLimit": 100,
"updatedAt": "2025-12-03T10:30:00Z"
},
{
"id": "uuid-2",
"service": "slack",
"displayName": "Slack",
"isEnabled": true,
"apiKey": null,
"apiSecret": null,
"webhookUrl": "https://hooks.slack.com/services/***",
"settings": {},
"rateLimit": null,
"updatedAt": "2025-12-03T10:30:00Z"
}
]Update Integration ​
PUT /api/admin/config/integrations/:idRequest Body:
{
"isEnabled": true,
"apiKey": "new_api_key",
"webhookUrl": "https://hooks.slack.com/services/new-webhook",
"settings": { "fromEmail": "support@yourbrand.com" },
"rateLimit": 200
}Auto-Sync: Updates automatically sync to Google Secret Manager if enabled.
Response: Updated integration object
Cache Management ​
Clear Config Cache ​
POST /api/admin/config/cache/clearClears all cached configuration. Useful after bulk updates.
Response:
{
"success": true,
"message": "Cache cleared"
}GSM Sync Status ​
Get GSM Sync Status ​
GET /api/admin/config/gsm/statusCheck if Google Secret Manager sync is enabled and working.
Response:
{
"enabled": true,
"connection": {
"success": true,
"error": ""
}
}Response when disabled:
{
"enabled": false,
"connection": {
"success": false,
"error": "GSM sync is disabled"
}
}AI Configuration Endpoints ​
AI Gateway Config ​
List Gateway Configs ​
GET /api/admin/gatewayManage AI gateway routing and fallback configuration.
Update Gateway Config ​
PUT /api/admin/gateway/:idAI Model Config ​
List AI Models ​
GET /api/admin/ai-configConfigure available AI models, pricing, and capabilities.
Update AI Model ​
PUT /api/admin/ai-config/:idCompany AI Config ​
Get Company AI Settings ​
GET /api/admin/companies/:companyId/ai-configView per-company AI configuration and usage.
Update Company AI Settings ​
PUT /api/admin/companies/:companyId/ai-configAdmin Settings Endpoints ​
Global Settings ​
Get Admin Settings ​
GET /api/admin/settingsResponse:
{
"id": "default",
"defaultTrialDays": 14
}Update Admin Settings ​
PUT /api/admin/settingsRequest Body:
{
"defaultTrialDays": 30
}Error Responses ​
401 Unauthorized ​
{
"error": "Unauthorized"
}403 Forbidden ​
{
"error": "Super admin access required"
}404 Not Found ​
{
"error": "Template not found"
}400 Bad Request ​
{
"error": "Validation failed",
"details": {
"apiKey": "API key is required"
}
}500 Internal Server Error ​
{
"error": "Internal server error",
"message": "Failed to update configuration"
}Rate Limiting ​
Admin endpoints are subject to rate limiting:
- Limit: 100 requests per minute per IP
- Header:
X-RateLimit-Remaining
429 Response:
{
"error": "Too many requests",
"retryAfter": 60
}Webhooks ​
Admin actions can trigger webhooks (future feature):
- Configuration changed
- Feature flag toggled
- Company created/suspended
- User role changed
SDKs & Examples ​
cURL Examples ​
Update System Settings:
curl -X PUT https://api.tendsocial.com/api/admin/config/system \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"appName": "Your Brand", "defaultTrialDays": 30}'Enable Feature Flag:
curl -X PUT https://api.tendsocial.com/api/admin/config/features/uuid \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"isEnabled": true, "enabledForTiers": ["professional", "enterprise"]}'Update Integration:
curl -X PUT https://api.tendsocial.com/api/admin/config/integrations/uuid \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"apiKey": "new_key", "isEnabled": true}'JavaScript/TypeScript ​
const API_URL = 'https://api.tendsocial.com';
const token = 'YOUR_JWT_TOKEN';
// Get system settings
const settings = await fetch(`${API_URL}/api/admin/config/system`, {
headers: { 'Authorization': `Bearer ${token}` }
}).then(r => r.json());
// Update feature flag
await fetch(`${API_URL}/api/admin/config/features/${flagId}`, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
isEnabled: true,
enabledForTiers: ['professional', 'enterprise']
})
});