GET/api/adminAdmin session
Admin overview
Simple authenticated admin status.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "OK",
"data": {
"status": "ok",
"role": "admin",
"timestamp": "2026-10-26T12:00:00.000Z"
}
}
GET/api/admin/healthAdmin session
Admin health
Checks authenticated admin access.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "OK",
"data": {
"status": "ok",
"role": "admin",
"timestamp": "2026-10-26T12:00:00.000Z"
}
}
GET/api/admin/checkAdmin session
Configuration diagnostics
Checks required environment variables and verifies that the service account can obtain an OAuth token. No secret values are returned.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "OK",
"data": {
"checks": {
"FIREBASE_PROJECT_ID": true,
"FIREBASE_WEB_API_KEY": true,
"FIREBASE_SERVICE_ACCOUNT_JSON": true,
"SMTP_ENCRYPTION_KEY": true,
"DEFAULT_SMTP_HOST": true
},
"firebaseServiceAccount": "ok",
"complete": true
}
}
NOTESAliases: GET /api/check and GET /api/admin/diagnostics.
GET/api/admin/usersAdmin session
List/search users
Paginates users; query params: limit (1-100), q (search current page by name/email/role), pageToken.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "OK",
"data": {
"users": [
{
"uid": "USER_UID",
"name": "Boris Example",
"email": "user@example.com",
"role": "free",
"status": "active",
"settings": {
"developerMode": false
}
}
],
"nextPageToken": null
}
}
NOTESExample: /api/admin/users?limit=50&q=boris
GET/api/admin/user/:uidAdmin session
Get user details
Returns profile, domain metadata, SMTP metadata and key counts/statuses. It excludes SMTP ciphertext and API-key hashes.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "OK",
"data": {
"user": {
"uid": "USER_UID",
"name": "Boris Example",
"email": "user@example.com",
"role": "paid",
"status": "active",
"settings": {
"developerMode": false
}
},
"domains": [],
"smtp": [],
"keys": []
}
}
PATCH/api/admin/user/:uidAdmin session
Update user account
Updates name and/or email in Firebase Authentication and Firestore. Email is marked unverified after change.
Request payload
{
"name": "Updated Name",
"email": "new-email@example.com"
}
Example response
{
"success": true,
"message": "User account updated.",
"data": {
"user": {
"uid": "USER_UID",
"name": "Updated Name",
"email": "new-email@example.com",
"role": "free",
"status": "active",
"settings": {
"developerMode": false
}
}
}
}
NOTESOnly name/email are accepted here. Use the role route for role changes.
PATCH/api/admin/user/:uid/roleAdmin session
Change user role
Sets the role to free, paid or admin. Prevents self-role changes and protects the last active admin. A role transition away from Free revokes Free-domain keys; Paid users must have no more than five active SMTP accounts.
Request payload
{
"role": "paid"
}
Example response
{
"success": true,
"message": "User role updated.",
"data": {
"user": {
"uid": "USER_UID",
"role": "paid",
"status": "active",
"revokedFreeKeys": 1
}
}
}
NOTESAllowed roles: free, paid, admin.
POST/api/admin/user/:uid/banAdmin session
Ban user
Marks the user banned, revokes their active sessions and tries to disable the Firebase Auth account. API sends are denied based on Firestore status immediately.
Request payload
{
"reason": "Suspicious sending activity"
}
Example response
{
"success": true,
"message": "User banned.",
"data": {
"uid": "USER_UID",
"status": "banned",
"firebaseDisabled": true
}
}
NOTESDoes not allow self-ban or banning the last active admin.
POST/api/admin/user/:uid/unbanAdmin session
Unban user
Re-enables the Firebase Auth account then marks the Firestore user active. Old sessions are not restored.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "User unbanned.",
"data": {
"uid": "USER_UID",
"status": "active"
}
}
DELETE/api/admin/user/:uidAdmin session
Delete user
Deletes Firebase Auth user and supported Firestore subcollections and domain claims. Protects the last active admin and writes an admin audit event.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "User and associated account data deleted.",
"data": {
"uid": "USER_UID",
"deleted": true,
"cleanup": {
"domainsDeleted": 1,
"smtpDeleted": 0,
"keysDeleted": 1,
"sessionsDeleted": 0,
"settingsDeleted": 1
}
}
}
NOTESDestructive. Large cleanup jobs that exceed the pagination safety limit are rejected rather than partially deleting records.
GET/api/admin/user/:uid/keysAdmin session
List user keys
Lists API key records and usage without hashes or full secrets.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "OK",
"data": {
"keys": [
{
"id": "KEY_ID",
"type": "smtp",
"status": "active",
"sendCount": 125,
"successfulSends": 120,
"failedSends": 5
}
]
}
}
GET/api/admin/user/:uid/key/:keyIdAdmin session
Get user key
Returns one key metadata record without key hash/secret.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "OK",
"data": {
"key": {
"id": "KEY_ID",
"status": "active",
"sendCount": 125,
"successfulSends": 120,
"failedSends": 5
}
}
}
POST/api/admin/user/:uid/key/:keyId/blockAdmin session
Block API key
Blocks a key immediately. Existing usage counters remain.
Request payload
{
"reason": "Suspicious sending activity"
}
Example response
{
"success": true,
"message": "API key blocked.",
"data": {
"id": "KEY_ID",
"status": "blocked",
"sendCount": 125
}
}
POST/api/admin/user/:uid/key/:keyId/unblockAdmin session
Unblock API key
Restores a blocked key only if the key owner has an active account. Revoked keys cannot be unblocked.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "API key unblocked.",
"data": {
"id": "KEY_ID",
"status": "active",
"sendCount": 125
}
}
POST/api/admin/user/:uid/key/:keyId/regenerateAdmin session
Regenerate user key
Admin replacement key secret, same key ID, preserved counters. The full secret is returned only in this response.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "API key regenerated.",
"data": {
"apiKey": "sk_live.UID.KEY_ID.NEW_SECRET",
"key": {
"id": "KEY_ID",
"status": "active",
"sendCount": 125
},
"warning": "The full API key is shown only in this response. Save it securely now."
}
}
GET/api/admin/smtpAdmin session
List SMTP metadata
Returns SMTP metadata across users without encrypted passwords. Current endpoint scans a bounded set of users for dashboard overview use.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "OK",
"data": {
"smtp": [
{
"uid": "USER_UID",
"smtpId": "SMTP_ID",
"host": "mail.example.com",
"username": "sales@example.com",
"fromEmail": "sales@example.com",
"passwordConfigured": true
}
]
}
}
NOTESNever logs/decrypts credentials as part of inventory.
GET/api/admin/usageAdmin session
Aggregate usage
Summarizes users, keys, SMTP accounts, verified domains and send counters. Response includes `truncated` when the bounded scan does not cover all users.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "OK",
"data": {
"userCount": 12,
"keyCount": 20,
"smtpCount": 8,
"verifiedDomainCount": 15,
"sendCount": 450,
"successfulSends": 420,
"failedSends": 30,
"truncated": false
}
}
GET/api/admin/logsAdmin session
Admin audit logs
Returns recent administrative audit entries. Do not place credentials, full API keys or SMTP passwords into reason fields.
Request payload
No JSON body required.
Example response
{
"success": true,
"message": "OK",
"data": {
"logs": [
{
"actorUid": "ADMIN_UID",
"action": "user.role_change",
"targetUid": "USER_UID",
"newRole": "paid",
"createdAt": "2026-10-26T12:00:00.000Z"
}
]
}
}
POST/api/admin/testAdmin session
Test/send admin email
With `testConnection:true`, test the default SMTP or a selected user SMTP without sending. Otherwise send a real test message through the default SMTP or the requested user SMTP.
Request payload
// Test default SMTP without sending
{ "testConnection": true }
// Test a user's saved SMTP without sending
{ "testConnection": true, "userId": "USER_UID", "smtpId": "SMTP_ID" }
// Send a real test message through default SMTP
{ "to": "admin@example.com", "subject": "SMTP test", "message": "Test message." }
Example response
{
"success": true,
"message": "Test email accepted by SMTP.",
"data": {
"status": "accepted_by_smtp",
"acceptedRecipients": 1,
"messageId": "<message@example.com>"
}
}
NOTESAdmin-only. Sending a real test message may incur provider charges or recipient impact; prefer testConnection:true first.