Download OpenAPI specification:
Calendar microservice — events, availability, holidays, calendar integrations (Google, Microsoft, Apple)
Returns events for a specific date pulled in real-time from every connected calendar (Google, Microsoft, Apple) and merged with internal session records. Public route — kept un-authenticated for legacy callers and debugging. Source: src/routes/calendarRoutes.ts
| date required | string <date> Example: date=2026-12-25 Holiday date (no time component) |
| userId | string <uuid> Example: userId=550e8400-e29b-41d4-a716-446655440000 Owning user UUID |
| timezone | string Example: timezone=Asia/Kolkata IANA timezone identifier |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Creates a calendar event (1:1 or group coaching session) and fans it out across every connected calendar provider for the participants. Sends external-provider notifications to attendees per the connected calendar (Google / Microsoft / Apple) and updates the linked session record in the database. Owner can be ADMIN, COACH, or COACHEE; participant arrays are conditionally required based on owner. Source: src/routes/calendarRoutes.ts
| sessionId required | string Linked session UUID (coaching or group session) |
| title required | string Human-readable event title (shown in calendar UI) |
| sessionLink | string <uri> Virtual meeting URL embedded in the event invite |
| startTime required | string <date-time> ISO 8601 timestamp in UTC |
| endTime required | string <date-time> ISO 8601 timestamp in UTC |
| timezone | string Default: "UTC" IANA timezone identifier |
| location | string Free-text location (physical address or virtual meeting link description) |
| owner required | string Enum: "ADMIN" "COACH" "COACHEE" Role that owns / created the event |
| coachId | Array of integers[ items >= 1 ] Coach user ID (string for query params; numeric in create-event arrays) |
| learnerId | Array of integers[ items >= 1 ] Learner user ID (string for query params; numeric in create-event arrays) |
| adminId | integer >= 1 Admin user ID |
| autoApproval | boolean When true, skip the manager-approval flow and schedule immediately |
{- "sessionId": "550e8400-e29b-41d4-a716-446655440000",
- "title": "Coaching Session — Sprint Planning",
- "startTime": "2026-05-13T10:00:00.000Z",
- "endTime": "2026-05-13T11:00:00.000Z",
- "timezone": "Asia/Kolkata",
- "location": "Virtual",
- "owner": "COACH",
- "coachId": "12345",
- "learnerId": "67890",
- "adminId": 1,
- "autoApproval": true
}{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Updates an existing event's metadata (title, time, attendees, location). If the event has external-provider IDs stored, syncs the change back to every connected calendar so the change is reflected in attendees' native calendar apps. Owner + participants are required when scheduling fields change. Source: src/routes/calendarRoutes.ts
| sessionId required | string Linked session UUID (coaching or group session) |
| title | string Human-readable event title (shown in calendar UI) |
| sessionLink | string <uri> Virtual meeting URL embedded in the event invite |
| startTime | string <date-time> ISO 8601 timestamp in UTC |
| endTime | string <date-time> ISO 8601 timestamp in UTC |
| timezone | string IANA timezone identifier |
| location | string Free-text location (physical address or virtual meeting link description) |
| owner | string Enum: "ADMIN" "COACH" "COACHEE" Role that owns / created the event |
| coachId | Array of integers[ items >= 1 ] Coach user ID (string for query params; numeric in create-event arrays) |
| learnerId | Array of integers[ items >= 1 ] Learner user ID (string for query params; numeric in create-event arrays) |
| adminId | integer >= 1 Admin user ID |
{- "sessionId": "550e8400-e29b-41d4-a716-446655440000",
- "title": "Coaching Session — Sprint Planning",
- "startTime": "2026-05-13T10:00:00.000Z",
- "endTime": "2026-05-13T11:00:00.000Z",
- "timezone": "Asia/Kolkata",
- "location": "Virtual",
- "owner": "COACH",
- "coachId": "12345",
- "learnerId": "67890",
- "adminId": 1
}{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Cancels an event and propagates the cancellation to every external calendar provider where it was created. Triggers cancellation notifications to attendees through each provider. Source: src/routes/calendarRoutes.ts
| sessionId required | string Linked session UUID (coaching or group session) |
{- "sessionId": "550e8400-e29b-41d4-a716-446655440000"
}{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Approves a pending (manager-approval-required) session and pushes it out to all connected calendars. Used by the admin / manager approval flow when auto-approval is disabled. Source: src/routes/calendarRoutes.ts
| sessionId required | string Linked session UUID (coaching or group session) |
{- "sessionId": "550e8400-e29b-41d4-a716-446655440000"
}{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Returns per-recipient invite delivery status (sent / bounced / complaint / delivered) for an event. Powered by SES delivery webhooks captured at /api/v1/ses/notifications. Source: src/routes/calendarRoutes.ts
| eventId required | string Example: 550e8400-e29b-41d4-a716-446655440000 Calendar event identifier |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Manually re-sends ICS invites for an event. By default re-targets only recipients whose previous delivery failed (bounced / complaint). Useful for recovering from transient SES failures. Source: src/routes/calendarRoutes.ts
| eventId required | string Example: 550e8400-e29b-41d4-a716-446655440000 Calendar event identifier |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Returns ad-hoc external email attendees attached to a session — guests that are not registered uExcelerate users. Source: src/routes/calendarRoutes.ts
| sessionId required | string Example: 550e8400-e29b-41d4-a716-446655440000 Linked session UUID (coaching or group session) |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Replaces the entire set of ad-hoc external attendees for a session and sends an ICS invite email to each new attendee. sessionType distinguishes coaching vs group session storage. Source: src/routes/calendarRoutes.ts
| sessionId required | string Example: 550e8400-e29b-41d4-a716-446655440000 Linked session UUID (coaching or group session) |
| sessionType required | string Enum: "coaching" "group" Example: sessionType=coaching Session category |
required | Array of objects Array of attendee email addresses |
{- "attendees": [
- "coach@uexcelerate.com",
- "learner@uexcelerate.com"
]
}{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Returns the role list assigned to the authenticated user (some combination of Coach / Learner / Admin). Drives role-switching in the frontend. Source: src/routes/availabilityRoutes.ts
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Retrieves the requesting user's weekly availability windows across all assigned roles. Used by the coach scheduling UI and the slot-finder algorithm. Source: src/routes/availabilityRoutes.ts
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Replaces the authenticated user's weekly availability windows for a given role. Optional useDefaultAvailability=true falls back to organization defaults. Source: src/routes/availabilityRoutes.ts
| role required | string Role context for the request (Coach / Learner / Admin) |
| timezone required | string IANA timezone identifier |
| useDefaultAvailability | boolean When true, fall back to the organization default availability windows |
required | object |
{- "role": "Coach",
- "timezone": "Asia/Kolkata",
- "useDefaultAvailability": false,
- "availability": {
- "sunday": [
- {
- "dayOfWeek": 1,
- "startTime": "09:00",
- "endTime": "17:00",
- "timezone": "Asia/Kolkata"
}
], - "monday": [
- {
- "dayOfWeek": 1,
- "startTime": "09:00",
- "endTime": "17:00",
- "timezone": "Asia/Kolkata"
}
], - "tuesday": [
- {
- "dayOfWeek": 1,
- "startTime": "09:00",
- "endTime": "17:00",
- "timezone": "Asia/Kolkata"
}
], - "wednesday": [
- {
- "dayOfWeek": 1,
- "startTime": "09:00",
- "endTime": "17:00",
- "timezone": "Asia/Kolkata"
}
], - "thursday": [
- {
- "dayOfWeek": 1,
- "startTime": "09:00",
- "endTime": "17:00",
- "timezone": "Asia/Kolkata"
}
], - "friday": [
- {
- "dayOfWeek": 1,
- "startTime": "09:00",
- "endTime": "17:00",
- "timezone": "Asia/Kolkata"
}
], - "saturday": [
- {
- "dayOfWeek": 1,
- "startTime": "09:00",
- "endTime": "17:00",
- "timezone": "Asia/Kolkata"
}
]
}
}{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Updates the authenticated user's preferred IANA timezone for a given role. Affects slot rendering and external-calendar event times. Source: src/routes/availabilityRoutes.ts
| role required | string Role context for the request (Coach / Learner / Admin) |
| timezone required | string IANA timezone identifier |
{- "role": "Coach",
- "timezone": "Asia/Kolkata"
}{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Returns bookable slots for a one-on-one session on a given date. Both coachId and learnerId are required; the intersection of their availability + free/busy + holiday calendars drives the slot color/availability. Source: src/routes/availabilityRoutes.ts
| date required | string <date> Example: date=2026-12-25 Holiday date (no time component) |
| role required | string Example: role=Coach Role context for the request (Coach / Learner / Admin) |
| timezone | string Example: timezone=Asia/Kolkata IANA timezone identifier |
| coachId required | string Example: coachId=12345 Coach user ID (string for query params; numeric in create-event arrays) |
| learnerId required | string Example: learnerId=67890 Learner user ID (string for query params; numeric in create-event arrays) |
| sessionId | string Example: sessionId=550e8400-e29b-41d4-a716-446655440000 Linked session UUID (coaching or group session) |
| reschedule | string Enum: "true" "false" Example: reschedule=false When "true", exclude the given sessionId from busy lookups so its current slot stays available |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Array-based slot lookup used by the admin scheduling flow. Selection logic — 1 coach + 1 learner = intersection of both; 1 coach + many learners = coach availability only; many coaches + 1 learner = learner availability only; many + many = default availability windows. Source: src/routes/availabilityRoutes.ts
| date required | string <date> Example: date=2026-12-25 Holiday date (no time component) |
| role required | string Example: role=Coach Role context for the request (Coach / Learner / Admin) |
| timezone | string Example: timezone=Asia/Kolkata IANA timezone identifier |
| coachId | string Example: coachId=12345 Coach user ID (string for query params; numeric in create-event arrays) |
| learnerId | string Example: learnerId=67890 Learner user ID (string for query params; numeric in create-event arrays) |
string or Array of strings Comma-separated list or repeated query param of coach user IDs | |
string or Array of strings Comma-separated list or repeated query param of learner user IDs | |
| sessionId | string Example: sessionId=550e8400-e29b-41d4-a716-446655440000 Linked session UUID (coaching or group session) |
| reschedule | string Enum: "true" "false" Example: reschedule=false When "true", exclude the given sessionId from busy lookups so its current slot stays available |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Returns a month view color-coded by availability, holidays, and existing events for a single coach/learner pairing. coachId is required when role=Coach; learnerId is required when role=Learner. Source: src/routes/availabilityRoutes.ts
| year required | string Example: year=2026 Four-digit year |
| month required | string Example: month=5 Month number (1–12) |
| role required | string Example: role=Coach Role context for the request (Coach / Learner / Admin) |
| timezone | string Example: timezone=Asia/Kolkata IANA timezone identifier |
| coachId | string Example: coachId=12345 Coach user ID (string for query params; numeric in create-event arrays) |
| learnerId | string Example: learnerId=67890 Learner user ID (string for query params; numeric in create-event arrays) |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Array-based month calendar for admin flows. Same coach/learner selection logic as /available-slots-admin. Source: src/routes/availabilityRoutes.ts
| year required | string Example: year=2026 Four-digit year |
| month required | string Example: month=5 Month number (1–12) |
| role required | string Example: role=Coach Role context for the request (Coach / Learner / Admin) |
| timezone | string Example: timezone=Asia/Kolkata IANA timezone identifier |
| coachId | string Example: coachId=12345 Coach user ID (string for query params; numeric in create-event arrays) |
| learnerId | string Example: learnerId=67890 Learner user ID (string for query params; numeric in create-event arrays) |
string or Array of strings Comma-separated list or repeated query param of coach user IDs | |
string or Array of strings Comma-separated list or repeated query param of learner user IDs |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Public legacy endpoint used by the legacy uex-server to check whether a user is free at a specific dateTime. Bypasses bearer auth for service-to-service calls. Source: src/routes/legacyRoutes.ts
| userId required | string <uuid> Example: userId=550e8400-e29b-41d4-a716-446655440000 Owning user UUID |
| role required | string Example: role=Coach Role context for the request (Coach / Learner / Admin) |
| dateTime required | string <date-time> Example: dateTime=2026-05-13T10:00:00.000Z ISO 8601 timestamp to check |
| timezone | string Example: timezone=Asia/Kolkata IANA timezone identifier |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Public legacy endpoint used by the legacy uex-server to check whether a user has completed calendar setup (any connection + any availability window). Source: src/routes/legacyRoutes.ts
| userId required | string <uuid> Example: userId=550e8400-e29b-41d4-a716-446655440000 Owning user UUID |
| role required | string Example: role=Coach Role context for the request (Coach / Learner / Admin) |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Returns all holidays (personal time off) for the authenticated user across all roles. Source: src/routes/availabilityRoutes.ts
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Creates a holiday / personal time off entry covering a date range (inclusive) for the authenticated user and a specific role. Source: src/routes/availabilityRoutes.ts
| name required | string Display name |
| role required | string Role context for the request (Coach / Learner / Admin) |
| startDate required | string <date> Holiday start date (inclusive) |
| endDate required | string <date> Holiday end date (inclusive) |
{- "name": "Christmas Day",
- "role": "Coach",
- "startDate": "2026-12-25",
- "endDate": "2026-12-26"
}{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Deletes a holiday entry by its UUID. The owning user must match the authenticated user. Source: src/routes/availabilityRoutes.ts
| holidayId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 UUID of the holiday entry |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Returns the OAuth 2.0 authorization URL the client should redirect the user to in order to grant calendar access. Supports google, outlook, and apple (CalDAV). Source: src/routes/calendarRoutes.ts
| provider required | string Enum: "google" "outlook" "apple" Example: google Calendar provider being connected |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}OAuth 2.0 callback from Google. Receives the authorization code, exchanges it for access + refresh tokens, and persists the calendar connection for the user identified by the signed state parameter. Not called directly by clients — registered as a redirect URI with Google. Source: src/routes/calendarRoutes.ts
| code required | string Example: code=4/0AY0e-g7abc... OAuth 2.0 authorization code returned by the provider |
| state required | string Example: state=eyJ1c2VySWQiOiI1NTBlODQwMC0uLi4ifQ Signed state token issued during /auth/{provider}; correlates the callback to the originating user |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}OAuth 2.0 callback from Microsoft (Outlook / Microsoft 365). Receives the authorization code, exchanges it for tokens via the Graph identity platform, and persists the connection. Not called directly by clients — registered as a redirect URI with Microsoft. Source: src/routes/calendarRoutes.ts
| code required | string Example: code=4/0AY0e-g7abc... OAuth 2.0 authorization code returned by the provider |
| state required | string Example: state=eyJ1c2VySWQiOiI1NTBlODQwMC0uLi4ifQ Signed state token issued during /auth/{provider}; correlates the callback to the originating user |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Connects an Apple iCloud Calendar via CalDAV using an app-specific password. Validates the credentials against the supplied CalDAV server URL and stores the connection. Source: src/routes/calendarRoutes.ts
| username required | string <email> Apple ID / iCloud account email used for CalDAV auth |
| password required | string App-specific password issued by Apple for CalDAV access |
| serverUrl required | string <uri> CalDAV server URL |
{- "username": "user@icloud.com",
- "password": "abcd-efgh-ijkl-mnop",
}{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Service-to-service endpoint called by auth-service immediately after a user signs in with Google or Microsoft. Reuses the OAuth tokens already collected during login to auto-provision a calendar connection — the user does not see a second consent screen. Source: src/routes/calendarRoutes.ts
| userId required | integer <uuid> >= 1 Owning user UUID |
| provider required | string Enum: "GOOGLE" "OUTLOOK" Calendar provider being connected |
| email required | string <email> Email address |
| accessToken required | string OAuth 2.0 access token issued by the provider |
| refreshToken | string OAuth 2.0 refresh token used to mint new access tokens |
| tokenExpiresAt | string <date-time> ISO 8601 timestamp at which the access token expires |
| calendarId | string Provider-specific calendar ID to attach this connection to |
| calendarName | string Human-readable name of the provider calendar |
{- "userId": "550e8400-e29b-41d4-a716-446655440000",
- "provider": "google",
- "email": "attendee@example.com",
- "accessToken": "ya29.a0AfH6SMB...",
- "refreshToken": "1//0gabcRefreshTokenExample",
- "tokenExpiresAt": "2026-05-13T10:30:00.000Z",
- "calendarId": "primary",
- "calendarName": "Work Calendar"
}{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Lists every external calendar connection the authenticated user has active (Google, Microsoft, Apple). Used by the settings UI to render connection cards and by the event creator to decide which providers to fan out to. Source: src/routes/calendarRoutes.ts
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Disconnects an external calendar connection by its UUID, revoking stored tokens. Future events for this user will no longer fan out to that provider. Source: src/routes/calendarRoutes.ts
| connectionId required | string <uuid> Example: 550e8400-e29b-41d4-a716-446655440000 UUID of the calendar connection |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Returns the authenticated user's calendar-connection and availability-setup completeness for a given role. Drives the onboarding checklist. Source: src/routes/statusRoutes.ts
| role required | string Example: role=Coach Role context for the request (Coach / Learner / Admin) |
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Returns whether the authenticated user should see the calendar setup / welcome banner. Used by the frontend to drive a one-time onboarding nudge. Source: src/routes/calendarRoutes.ts
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Marks the calendar welcome notification as seen for the authenticated user so it stops appearing on subsequent logins. Source: src/routes/calendarRoutes.ts
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Amazon SES event webhook (bounces, complaints, deliveries) delivered via SNS. Body is the raw SES SNS notification payload. No bearer auth — verified via SNS signature (verification is currently TODO). Source: src/routes/calendarRoutes.ts
| property name* additional property | any |
{ }{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}Lightweight health probe used by load balancers and container orchestrators. Returns 200 when the service process is up; does not verify DB or downstream connectivity. Source: src/server.ts
{- "success": true,
- "message": "Operation completed successfully",
- "data": {
- "id": "550e8400-e29b-41d4-a716-446655440000"
}
}