User Management API
The User Management API provides comprehensive functionality for managing users, organizations, user groups, and teams within your application. This service handles organizational structure, user profiles, permissions, and team collaboration features.Base URL
All endpoints are prefixed with/api/v1
Authentication
Most endpoints require authentication via Bearer token:USER_LOOKUP- For internal user lookups and email existence checksFETCH_CONFIG- For configuration updates
userAdminCheck middleware that validates user group membership.
Architecture Overview
The User Management Service is built on Node.js with MongoDB for data persistence. It uses Inversify for dependency injection and integrates with several external services:- Authentication Service - Validates user credentials and authentication methods
- Mail Service - Sends invitations and notifications via SMTP
- Configuration Manager - Manages application settings and SMTP configuration
- Event Service - Publishes entity lifecycle events via Kafka
- AI Connector Backend - Handles teams and graph-based user operations
- Prometheus Service - Records metrics and activities
Data Models
Organizations
Top-level entities containing users and configuration:- Organization metadata and settings
- Account types (individual/business)
- Onboarding status tracking
- Logo management with automatic compression
Users
Individual accounts within organizations:- Profile information and contact details
- Authentication status and login history
- Organization membership and roles
- Display picture management with automatic compression
User Groups
Role-based access control within organizations:- Predefined types: admin, standard, everyone, custom
- User membership management
- Permission inheritance
- System-managed groups cannot be deleted
Teams
Collaborative workspaces managed through connector backend:- Team metadata and descriptions
- User membership with permissions
- External system integration via AI connector service
API Endpoints
Organization Management
Organization Management
GET /org/exists - Check Organization Existence
GET /org/exists - Check Organization Existence
- Request
- Response
GET /api/v1/org/existsAuthentication: None requiredMiddleware Chain:attachContainerMiddleware- Provides Inversify container access
POST /org - Create Organization
POST /org - Create Organization
- Request
- Response
POST /api/v1/orgAuthentication: None required (initial setup only)Middleware Chain:attachContainerMiddlewareValidationMiddleware.validate(OrgCreationValidationSchema)
| Parameter | Type | Required | Description |
|---|---|---|---|
| accountType | string | Yes | ’individual’ or ‘business’ |
| contactEmail | string | Yes | Primary contact email (becomes admin email) |
| registeredName | string | Yes* | Official name (*required for business accounts) |
| shortName | string | No | Display name for the organization |
| adminFullName | string | Yes | Full name of the admin user (min 1 char) |
| password | string | Yes | Admin password (min 8 chars with complexity) |
| sendEmail | boolean | No | Whether to send welcome email |
| phoneNumber | string | No | Organization phone number |
| permanentAddress | object | No | Organization address details |
- Business accounts must provide
registeredName - Password must contain: uppercase, lowercase, number, special character
- Email domain becomes organization domain
- Only one organization can exist per system
GET /org - Get Organization
GET /org - Get Organization
- Request
- Response
GET /api/v1/orgHeaders:Authorization: Bearer YOUR_TOKEN
attachContainerMiddlewareauthMiddleware.authenticatemetricsMiddleware
PATCH /org - Update Organization
PATCH /org - Update Organization
- Request
- Response
PATCH /api/v1/orgHeaders:Authorization: Bearer YOUR_TOKEN
attachContainerMiddlewareauthMiddleware.authenticatemetricsMiddlewareuserAdminCheck- Admin access required
| Parameter | Type | Required | Description |
|---|---|---|---|
| contactEmail | string | No | Primary contact email |
| registeredName | string | No | Official registered name |
| shortName | string | No | Display name |
| permanentAddress | object | No | Address details |
DELETE /org - Delete Organization
DELETE /org - Delete Organization
- Request
- Response
DELETE /api/v1/orgHeaders:Authorization: Bearer YOUR_TOKEN
attachContainerMiddlewareauthMiddleware.authenticatemetricsMiddlewareuserAdminCheck- Admin access required
PUT /org/logo - Upload Organization Logo
PUT /org/logo - Upload Organization Logo
- Request
- Response
PUT /api/v1/org/logoHeaders:Authorization: Bearer YOUR_TOKENContent-Type: multipart/form-data
attachContainerMiddlewareauthMiddleware.authenticateFileProcessorFactory.createBufferUploadProcessor()with:- Field name: ‘file’
- Allowed types: PNG, JPEG, JPG, WebP, GIF
- Max files: 1
- Max size: 1MB
- Processing type: BUFFER
- Strict upload: true
metricsMiddlewareuserAdminCheck- Admin access required
file: Image file
- Automatically compressed using Sharp library
- Converted to JPEG format
- Quality reduced until under 100KB (minimum quality: 10%)
- Stored as base64 string in database
DELETE /org/logo - Remove Organization Logo
DELETE /org/logo - Remove Organization Logo
- Request
- Response
DELETE /api/v1/org/logoHeaders:Authorization: Bearer YOUR_TOKEN
attachContainerMiddlewareauthMiddleware.authenticatemetricsMiddlewareuserAdminCheck- Admin access required
GET /org/logo - Get Organization Logo
GET /org/logo - Get Organization Logo
- Request
- Response
GET /api/v1/org/logoHeaders:Authorization: Bearer YOUR_TOKEN
attachContainerMiddlewareauthMiddleware.authenticatemetricsMiddleware
GET /org/onboarding-status - Get Onboarding Status
GET /org/onboarding-status - Get Onboarding Status
- Request
- Response
GET /api/v1/org/onboarding-statusHeaders:Authorization: Bearer YOUR_TOKEN
attachContainerMiddlewareauthMiddleware.authenticate
PUT /org/onboarding-status - Update Onboarding Status
PUT /org/onboarding-status - Update Onboarding Status
- Request
- Response
PUT /api/v1/org/onboarding-statusHeaders:Authorization: Bearer YOUR_TOKEN
attachContainerMiddlewareauthMiddleware.authenticateuserAdminCheck- Admin access requiredValidationMiddleware.validate(OnboardingStatusUpdateValidationSchema)
| Parameter | Type | Required | Description |
|---|---|---|---|
| status | string | Yes | ’configured’, ‘notConfigured’, or ‘skipped’ |
GET /org/health - Health Check
GET /org/health - Health Check
- Request
- Response
GET /api/v1/org/healthAuthentication: None requiredMiddleware Chain:attachContainerMiddleware
User Management
User Management
GET /users - Get All Users
GET /users - Get All Users
- Request
- Response
GET /api/v1/usersHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddleware
GET /users/fetch/with-groups - Get Users With Groups
GET /users/fetch/with-groups - Get Users With Groups
- Request
- Response
GET /api/v1/users/fetch/with-groupsHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticate
GET /users/:id - Get User By ID
GET /users/:id - Get User By ID
- Request
- Response
GET /api/v1/users/:idHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticateValidationMiddleware.validate(UserIdValidationSchema)metricsMiddlewareuserExists- Validates user exists and is not deleted
id: User ID (24-character MongoDB ObjectId matching/^[a-fA-F0-9]{24}$/)
POST /users/by-ids - Get Users By IDs
POST /users/by-ids - Get Users By IDs
- Request
- Response
POST /api/v1/users/by-idsHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticateValidationMiddleware.validate(MultipleUserValidationSchema)metricsMiddleware
| Parameter | Type | Required | Description |
|---|---|---|---|
| userIds | string[] | Yes | Array of user IDs (MongoDB ObjectIds, min 1 item) |
- Each userIds element must match
/^[a-fA-F0-9]{24}$/ - Array must contain at least one userId
GET /users/email/exists - Check User Exists By Email
GET /users/email/exists - Check User Exists By Email
- Request
- Response
GET /api/v1/users/email/existsHeaders:Authorization: Bearer SCOPED_TOKEN(USER_LOOKUP scope required)
metricsMiddlewareauthMiddleware.scopedTokenValidator(TokenScopes.USER_LOOKUP)ValidationMiddleware.validate(emailIdValidationSchema)
| Parameter | Type | Required | Description |
|---|---|---|---|
| string | Yes | Valid email address |
GET /users/internal/:id - Internal Get User
GET /users/internal/:id - Internal Get User
- Request
- Response
GET /api/v1/users/internal/:idHeaders:Authorization: Bearer SCOPED_TOKEN(USER_LOOKUP scope required)
authMiddleware.scopedTokenValidator(TokenScopes.USER_LOOKUP)ValidationMiddleware.validate(UserIdValidationSchema)metricsMiddleware
id: User ID (24-character MongoDB ObjectId)
POST /users - Create User
POST /users - Create User
- Request
- Response
POST /api/v1/usersHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(createUserValidationSchema)userAdminCheck- Admin access required
| Parameter | Type | Required | Description |
|---|---|---|---|
| fullName | string | Yes | Full name (min 1 character) |
| string | Yes | Valid email address | |
| mobile | string | No | Mobile number (10-15 digits, optional +) |
| designation | string | No | Job title or role |
- Mobile must match
/^\+?[0-9]{10,15}$/if provided - Email must be valid email format
PATCH /users/:id/fullname - Update Full Name
PATCH /users/:id/fullname - Update Full Name
- Request
- Response
PATCH /api/v1/users/:id/fullnameHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(updateUserFullNameValidationSchema)userAdminOrSelfCheck- Admin or self access requireduserExists- Validates user exists
id: User ID (24-character MongoDB ObjectId)
| Parameter | Type | Required | Description |
|---|---|---|---|
| fullName | string | Yes | Full name (minimum 1 character) |
PATCH /users/:id/firstName - Update First Name
PATCH /users/:id/firstName - Update First Name
- Request
- Response
PATCH /api/v1/users/:id/firstNameHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(updateUserFirstNameValidationSchema)userAdminOrSelfCheck- Admin or self access requireduserExists- Validates user exists
id: User ID (24-character MongoDB ObjectId)
| Parameter | Type | Required | Description |
|---|---|---|---|
| firstName | string | Yes | First name |
PATCH /users/:id/lastName - Update Last Name
PATCH /users/:id/lastName - Update Last Name
- Request
- Response
PATCH /api/v1/users/:id/lastNameHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(updateUserLastNameValidationSchema)userAdminOrSelfCheck- Admin or self access requireduserExists- Validates user exists
id: User ID (24-character MongoDB ObjectId)
| Parameter | Type | Required | Description |
|---|---|---|---|
| lastName | string | Yes | Last name |
PUT /users/dp - Upload User Display Picture
PUT /users/dp - Upload User Display Picture
- Request
- Response
PUT /api/v1/users/dpHeaders:Authorization: Bearer YOUR_TOKENContent-Type: multipart/form-data
authMiddleware.authenticateFileProcessorFactory.createBufferUploadProcessor()(spread as array) with:- Field name: ‘file’
- Allowed types: PNG, JPEG, JPG, WebP, GIF
- Max files: 1
- Max size: 1MB
- Processing type: BUFFER
- Strict upload: true
metricsMiddleware
file: Image file
- Compressed using Sharp library with dynamic quality adjustment
- Converted to JPEG format
- Quality reduced from 100% to minimum 10% until under 100KB
- Stored as base64 with MIME type
- Uses upsert operation for user display picture record
DELETE /users/dp - Remove User Display Picture
DELETE /users/dp - Remove User Display Picture
- Request
- Response
DELETE /api/v1/users/dpHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddleware
pic and mimeType fields to null but preserves the record.GET /users/dp - Get User Display Picture
GET /users/dp - Get User Display Picture
- Request
- Response
GET /api/v1/users/dpHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddleware
PATCH /users/:id/designation - Update Designation
PATCH /users/:id/designation - Update Designation
- Request
- Response
PATCH /api/v1/users/:id/designationHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(updateUserDesignationValidationSchema)userAdminOrSelfCheck- Admin or self access requireduserExists- Validates user exists
id: User ID (24-character MongoDB ObjectId)
| Parameter | Type | Required | Description |
|---|---|---|---|
| designation | string | Yes | Job title or role |
PATCH /users/:id/email - Update Email
PATCH /users/:id/email - Update Email
- Request
- Response
PATCH /api/v1/users/:id/emailHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(updateUserEmailValidationSchema)userAdminOrSelfCheck- Admin or self access requireduserExists- Validates user exists
id: User ID (24-character MongoDB ObjectId)
| Parameter | Type | Required | Description |
|---|---|---|---|
| string | Yes | Valid email address |
PUT /users/:id - Update User
PUT /users/:id - Update User
- Request
- Response
PUT /api/v1/users/:idHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(updateUserValidationSchema)userAdminOrSelfCheck- Admin or self access requireduserExists- Validates user exists
id: User ID (24-character MongoDB ObjectId)
| Parameter | Type | Required | Description |
|---|---|---|---|
| fullName | string | No | Full name |
| string | Yes | Valid email address | |
| mobile | string | No | Mobile number |
| designation | string | No | Job title or role |
| firstName | string | No | First name |
| lastName | string | No | Last name |
| middleName | string | No | Middle name |
| address | object | No | Address details |
| hasLoggedIn | boolean | No | Login status |
orgId, _id, slug are excluded from updates.DELETE /users/:id - Delete User
DELETE /users/:id - Delete User
- Request
- Response
DELETE /api/v1/users/:idHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(UserIdValidationSchema)userAdminCheck- Admin access requireduserExists- Validates user exists
id: User ID (24-character MongoDB ObjectId)
- Cannot delete admin users (checked via group membership)
- User must exist and not already be deleted
GET /users/:id/adminCheck - Check Admin Access
GET /users/:id/adminCheck - Check Admin Access
- Request
- Response
GET /api/v1/users/:id/adminCheckHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(UserIdValidationSchema)userAdminCheck- Admin access required (the actual check)
id: User ID (24-character MongoDB ObjectId)
POST /users/bulk/invite - Bulk Invite Users
POST /users/bulk/invite - Bulk Invite Users
- Request
- Response
POST /api/v1/users/bulk/inviteHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewaresmtpConfigCheck(config.cmBackend)- SMTP configuration requireduserAdminCheck- Admin access requiredaccountTypeCheck- Business accounts only
| Parameter | Type | Required | Description |
|---|---|---|---|
| emails | string[] | Yes | Array of email addresses to invite |
| groupIds | string[] | No | Array of group IDs to add users to |
- Creates new accounts for emails not in system
- Restores deleted accounts if they exist with same email and orgId
- Validates all emails before processing any
- Adds all users (new and restored) to specified groups and “everyone” group
- Sends different email templates for new vs restored users
- Handles both password and non-password authentication methods
POST /users/:id/resend-invite - Resend User Invite
POST /users/:id/resend-invite - Resend User Invite
- Request
- Response
POST /api/v1/users/:id/resend-inviteHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(UserIdValidationSchema)smtpConfigCheck(config.cmBackend)- SMTP configuration requireduserAdminCheck- Admin access requiredaccountTypeCheck- Business accounts only
id: User ID (24-character MongoDB ObjectId)
- User must not have logged in yet (
hasLoggedIn: false) - User must exist and not be deleted
- Adapts email content based on authentication method (password vs non-password)
GET /users/health - Health Check
GET /users/health - Health Check
- Request
- Response
GET /api/v1/users/healthAuthentication: None requiredPOST /users/updateAppConfig - Update App Configuration
POST /users/updateAppConfig - Update App Configuration
- Request
- Response
POST /api/v1/users/updateAppConfigHeaders:Authorization: Bearer SCOPED_TOKEN(FETCH_CONFIG scope required)
authMiddleware.scopedTokenValidator(TokenScopes.FETCH_CONFIG)
- Reloads application configuration
- Rebinds Inversify container services with updated config
- Recreates MailService, AuthService, and controllers with new configuration
GET /users/graph/list - List Users (Graph)
GET /users/graph/list - List Users (Graph)
- Request
- Response
GET /api/v1/users/graph/listHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddleware
page: Page number for paginationlimit: Number of users per pagesearch: Search term for filtering users
${config.connectorBackend}/api/v1/entity/user/listGET /users/teams/list - Get User Teams (Users Endpoint)
GET /users/teams/list - Get User Teams (Users Endpoint)
- Request
- Response
GET /api/v1/users/teams/listHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddleware
page: Page number for paginationlimit: Number of teams per pagesearch: Search term for filtering teams
${config.connectorBackend}/api/v1/entity/user/teamsNote: This is different from the teams endpoint /user/teams. This endpoint is managed by the UserController and has different query parameter handling.User Groups Management
User Groups Management
POST /userGroups - Create User Group
POST /userGroups - Create User Group
- Request
- Response
POST /api/v1/userGroupsHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticateValidationMiddleware.validate(groupValidationSchema)userAdminCheck- Admin access required
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Name of the group (min 1 character) |
| type | string | Yes | Group type: ‘standard’ or ‘custom’ |
- Cannot create ‘admin’ type groups (throws BadRequestError)
- Group names must be unique within organization
- Available types from
groupTypes: [‘admin’, ‘standard’, ‘everyone’, ‘custom’] - ‘admin’ and ‘everyone’ are system-managed
GET /userGroups - Get All User Groups
GET /userGroups - Get All User Groups
- Request
- Response
GET /api/v1/userGroupsHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticateuserAdminCheck- Admin access required
GET /userGroups/:groupId - Get User Group By ID
GET /userGroups/:groupId - Get User Group By ID
- Request
- Response
GET /api/v1/userGroups/:groupIdHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticateValidationMiddleware.validate(UserGroupIdValidationSchema)
groupId: Group ID (24-character MongoDB ObjectId matching/^[0-9a-fA-F]{24}$/)
PUT /userGroups/:groupId - Update User Group
PUT /userGroups/:groupId - Update User Group
- Request
- Response
PUT /api/v1/userGroups/:groupIdHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticateuserAdminCheck- Admin access requiredValidationMiddleware.validate(UserGroupIdValidationSchema)
groupId: Group ID (24-character MongoDB ObjectId)
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | New name for the group |
- Cannot update ‘admin’ or ‘everyone’ groups (throws ForbiddenError)
- Only custom and standard groups can be modified
DELETE /userGroups/:groupId - Delete User Group
DELETE /userGroups/:groupId - Delete User Group
- Request
- Response
DELETE /api/v1/userGroups/:groupIdHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticateuserAdminCheck- Admin access requiredValidationMiddleware.validate(UserGroupIdValidationSchema)
groupId: Group ID (24-character MongoDB ObjectId)
- Only ‘custom’ groups can be deleted (throws ForbiddenError for others)
- System groups (admin, everyone, standard) are protected
POST /userGroups/add-users - Add Users to Groups
POST /userGroups/add-users - Add Users to Groups
- Request
- Response
POST /api/v1/userGroups/add-usersHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticateuserAdminCheck- Admin access required
| Parameter | Type | Required | Description |
|---|---|---|---|
| userIds | string[] | Yes | Array of user IDs (MongoDB ObjectIds, min 1 item) |
| groupIds | string[] | Yes | Array of group IDs (MongoDB ObjectIds, min 1 item) |
- Uses
$addToSetwith$eachto add users to multiple groups - Atomic operation - either all additions succeed or none
- Prevents duplicate memberships automatically
- Only operates on non-deleted groups
POST /userGroups/remove-users - Remove Users from Groups
POST /userGroups/remove-users - Remove Users from Groups
- Request
- Response
POST /api/v1/userGroups/remove-usersHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticateuserAdminCheck- Admin access required
| Parameter | Type | Required | Description |
|---|---|---|---|
| userIds | string[] | Yes | Array of user IDs to remove |
| groupIds | string[] | Yes | Array of group IDs to remove from |
- Uses
$pullAllto remove users from multiple groups - Atomic operation across all specified groups
- Gracefully handles users not in groups
GET /userGroups/:groupId/users - Get Users in Group
GET /userGroups/:groupId/users - Get Users in Group
- Request
- Response
GET /api/v1/userGroups/:groupId/usersHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticateValidationMiddleware.validate(UserGroupIdValidationSchema)
groupId: Group ID (24-character MongoDB ObjectId)
GET /userGroups/users/:userId - Get Groups for User
GET /userGroups/users/:userId - Get Groups for User
- Request
- Response
GET /api/v1/userGroups/users/:userIdHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticate
userId: User ID (MongoDB ObjectId)
$in query to find groups containing the user, selecting only name and type fields.GET /userGroups/stats/list - Get Group Statistics
GET /userGroups/stats/list - Get Group Statistics
- Request
- Response
GET /api/v1/userGroups/stats/listHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticate
GET /userGroups/health - Health Check
GET /userGroups/health - Health Check
- Request
- Response
GET /api/v1/userGroups/healthAuthentication: None requiredTeams Management
Teams Management
POST /teams - Create Team
POST /teams - Create Team
- Request
- Response
POST /api/v1/teamsHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(createTeamValidationSchema)
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Team name (min 1 character) |
| description | string | No | Team description |
| userIds | string[] | No | Array of user IDs to add to team |
| role | string | No | Default role for team members |
${config.connectorBackend}/api/v1/entity/teamGET /teams - List Teams
GET /teams - List Teams
- Request
- Response
GET /api/v1/teamsHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(listTeamsValidationSchema)
page: Page number (number, min 1, default 1, preprocessed from string)limit: Items per page (number, min 1, max 100, default 10, preprocessed from string)search: Search term for team names/descriptions (string, optional)
${config.connectorBackend}/api/v1/entity/team/listGET /teams/:teamId - Get Team
GET /teams/:teamId - Get Team
- Request
- Response
GET /api/v1/teams/:teamIdHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(getTeamValidationSchema)
teamId: Team ID (string, min 1 character, required)
${config.connectorBackend}/api/v1/entity/team/${teamId}PUT /teams/:teamId - Update Team
PUT /teams/:teamId - Update Team
- Request
- Response
PUT /api/v1/teams/:teamIdHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(updateTeamValidationSchema)
teamId: Team ID (string, min 1 character, required)
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | No | Updated team name |
| description | string | No | Updated team description |
${config.connectorBackend}/api/v1/entity/team/${teamId}DELETE /teams/:teamId - Delete Team
DELETE /teams/:teamId - Delete Team
- Request
- Response
DELETE /api/v1/teams/:teamIdHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(deleteTeamValidationSchema)
teamId: Team ID (string, min 1 character, required)
${config.connectorBackend}/api/v1/entity/team/${teamId}GET /teams/:teamId/users - Get Team Users
GET /teams/:teamId/users - Get Team Users
- Request
- Response
GET /api/v1/teams/:teamId/usersHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(getTeamUsersValidationSchema)
teamId: Team ID (string, min 1 character, required)
${config.connectorBackend}/api/v1/entity/team/${teamId}/usersPOST /teams/:teamId/users - Add Users to Team
POST /teams/:teamId/users - Add Users to Team
- Request
- Response
POST /api/v1/teams/:teamId/usersHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(addUsersToTeamValidationSchema)
teamId: Team ID (string, min 1 character, required)
| Parameter | Type | Required | Description |
|---|---|---|---|
| userIds | string[] | Yes | Array of user IDs to add (min 1 item) |
${config.connectorBackend}/api/v1/entity/team/${teamId}/usersDELETE /teams/:teamId/users - Remove Users from Team
DELETE /teams/:teamId/users - Remove Users from Team
- Request
- Response
DELETE /api/v1/teams/:teamId/usersHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(removeUsersFromTeamValidationSchema)
teamId: Team ID (string, min 1 character, required)
| Parameter | Type | Required | Description |
|---|---|---|---|
| userIds | string[] | Yes | Array of user IDs to remove (min 1 item) |
${config.connectorBackend}/api/v1/entity/team/${teamId}/usersPUT /teams/:teamId/users/permissions - Update Team User Permissions
PUT /teams/:teamId/users/permissions - Update Team User Permissions
- Request
- Response
PUT /api/v1/teams/:teamId/users/permissionsHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddlewareValidationMiddleware.validate(updateTeamUsersPermissionsValidationSchema)
teamId: Team ID (string, min 1 character, required)
| Parameter | Type | Required | Description |
|---|---|---|---|
| userIds | string[] | Yes | Array of user IDs to update (min 1 item) |
| role | string | No | New role for the users |
${config.connectorBackend}/api/v1/entity/team/${teamId}/users/permissionsGET /teams/user/teams - Get User Teams (Teams Endpoint)
GET /teams/user/teams - Get User Teams (Teams Endpoint)
- Request
- Response
GET /api/v1/teams/user/teamsHeaders:Authorization: Bearer YOUR_TOKEN
authMiddleware.authenticatemetricsMiddleware
${config.connectorBackend}/api/v1/entity/user/teamsError Handling: If connector backend returns non-200 status, returns empty array [] instead of throwing an error.Schema Definitions
- Organization Schema
- User Schema
- User Group Schema
- User Display Picture Schema
- Organization Logo Schema
- Counter Schema
Validation Schemas
- User Validation
- Organization Validation
- User Group Validation
- Teams Validation
- File Upload Validation
Error Handling
All endpoints return structured error responses:VALIDATION_ERROR- Invalid request parametersNOT_FOUND- Resource not foundUNAUTHORIZED- Authentication requiredFORBIDDEN- Insufficient privilegesBAD_REQUEST- Invalid operationINTERNAL_ERROR- Server error
200- Success201- Created400- Bad Request (validation errors)401- Unauthorized403- Forbidden (insufficient privileges)404- Not Found500- Internal Server Error
Important Notes
- Route Paths: All route paths shown are relative to how the routers are mounted in the main application
-
MongoDB ObjectIds: All ID fields use 24-character hexadecimal strings matching
/^[a-fA-F0-9]{24}$/ -
Soft Deletes: Users, organizations, and groups use soft deletion (
isDeleted: true) rather than physical removal -
Admin Restrictions:
- Admin users cannot be deleted (checked via group membership)
- Only custom user groups can be deleted (admin, everyone, standard are protected)
- SMTP Dependencies: Email features require valid SMTP configuration checked via Configuration Manager service
-
Account Type Restrictions:
- Bulk user invitations limited to business accounts
- Individual accounts have restricted functionality
-
Automatic Group Memberships:
- All users automatically added to “everyone” group
- Admin users added to “admin” group during organization creation
-
Image Processing:
- Uploaded images automatically compressed using Sharp library
- Converted to JPEG format with dynamic quality adjustment
- Target size: under 100KB after compression
-
Event Publishing:
- All entity changes publish events via Kafka for system integration
- Events include organization and user lifecycle changes
-
Transaction Support:
- Uses MongoDB transactions when replica sets available
- Falls back to individual operations for single-node deployments
-
Teams Functionality:
- All teams operations are proxied to AI connector backend
- Routes forward requests to
${config.connectorBackend}/api/v1/entity/team/* - Error handling returns appropriate responses for failed backend calls
- Response formats depend entirely on connector backend implementation
-
Unique Constraints:
- Email addresses must be unique across the system
- Group names must be unique within organization
- Slugs auto-generated with counter-based uniqueness
-
Middleware Processing:
- FileProcessorFactory methods return arrays that are spread into middleware chains
- Validation schemas include complete request structure (body, query, params, headers)
-
Service Integration:
- Configuration updates dynamically rebind services in dependency injection container
- Health endpoints available on all router modules
- Metrics recorded via Prometheus service for monitoring
-
Access Control:
- Scoped tokens for service-to-service communication (USER_LOOKUP, FETCH_CONFIG)
- Role-based access through user group membership
- Admin-only operations clearly enforced through middleware
-
Duplicate User Teams Endpoints:
/teams/user/teams(managed by TeamsController) - Returns empty array on backend errors/users/teams/list(managed by UserController) - Throws BadRequestError on backend errors- Both proxy to connector backend but have different error handling strategies
-
File Upload Middleware:
FileProcessorFactory.createBufferUploadProcessor()returns an object withgetMiddlewarearray- Middleware is spread using the spread operator (
...middleware.getMiddleware) - All uploaded images undergo automatic compression regardless of original format
-
Validation Preprocessing:
- Query parameters for pagination are preprocessed from strings to numbers using
z.preprocess() - Default values are applied during validation for optional pagination parameters
- Query parameters for pagination are preprocessed from strings to numbers using
-
Container Integration:
- Inversify container provides dependency injection throughout the application
- Services are dynamically rebound when configuration updates occur
- Container disposal handles cleanup of connections and resources
-
Email Behavior Variations:
- Different email templates sent for new vs restored user invitations
- Authentication method (password vs non-password) affects email content
- SMTP configuration validation occurs before any email sending operations













