Workspace Services API (v1)
Overview
The Workspace Services API allows workspace owners to manage workspace services that can be assigned to sessions. Each workspace can create, update, and delete services with properties like name, description, duration, price, color, and scope. Services are categorized by scope (currently: sessions) to define their usage within the workspace.
Method & Path
All endpoints use the base path:
/api/v1/workspace/:workspaceId/services
Authentication
Required: Workspace authentication via session cookie.
Headers
Content-Type: application/json- Cookie with workspace session
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | Yes | The workspace ID |
List Services
Method & Path
GET /api/v1/workspace/:workspaceId/services
Description
Retrieves a list of all services for the workspace.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| isActive | boolean | No | Filter by active status (true/false) |
| scope | string | No | Filter by scope. Currently only sessions is supported |
Response 200 OK
{
"services": [
{
"id": "507f1f77bcf86cd799439011",
"workspaceId": "507f191e810c19729de860ea",
"name": "استشارة طبية",
"description": "جلسة استشارة طبية شاملة",
"durationMinutes": 60,
"price": 150.00,
"color": "#3B82F6",
"scope": "sessions",
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
]
}
Common Errors
404 Not Found: Workspace not found or access denied 401 Unauthorized: Authentication required 403 Forbidden: Subscription expired or insufficient permissions
Get Service by ID
Method & Path
GET /api/v1/workspace/:workspaceId/services/:serviceId
Description
Retrieves a specific service by its ID.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | Yes | The workspace ID |
| serviceId | string | Yes | The service ID |
Response 200 OK
{
"service": {
"id": "507f1f77bcf86cd799439011",
"workspaceId": "507f191e810c19729de860ea",
"name": "استشارة طبية",
"description": "جلسة استشارة طبية شاملة",
"durationMinutes": 60,
"price": 150.00,
"color": "#3B82F6",
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
}
Common Errors
404 Not Found: Service not found 401 Unauthorized: Authentication required 403 Forbidden: Subscription expired
Create Service
Method & Path
POST /api/v1/workspace/:workspaceId/services
Description
Creates a new service for the workspace.
Request Body
{
"name": "استشارة طبية",
"description": "جلسة استشارة طبية شاملة",
"durationMinutes": 60,
"price": 150.00,
"color": "#3B82F6",
"scope": "sessions",
"isActive": true
}
Fields:
name(string, required): Service name (1-200 characters)description(string, optional): Service description (max 1000 characters)durationMinutes(number, optional): Default duration in minutes (min: 1)price(number, optional): Default price (min: 0)color(string, optional): Hex color code for display (e.g., "#3B82F6")scope(string, optional): Service scope. Currently onlysessionsis supported (default: "sessions")isActive(boolean, optional): Whether the service is active (default: true)
Response 201 Created
{
"service": {
"id": "507f1f77bcf86cd799439011",
"workspaceId": "507f191e810c19729de860ea",
"name": "استشارة طبية",
"description": "جلسة استشارة طبية شاملة",
"durationMinutes": 60,
"price": 150.00,
"color": "#3B82F6",
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
}
Common Errors
400 Bad Request: Invalid input data 409 Conflict: Service with this name already exists 404 Not Found: Workspace not found 401 Unauthorized: Authentication required 403 Forbidden: Subscription expired
Update Service
Method & Path
PATCH /api/v1/workspace/:workspaceId/services/:serviceId
Description
Updates an existing service.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | Yes | The workspace ID |
| serviceId | string | Yes | The service ID |
Request Body
All fields are optional:
{
"name": "استشارة طبية محدثة",
"description": "وصف محدث",
"durationMinutes": 90,
"price": 200.00,
"color": "#10B981",
"scope": "sessions",
"isActive": false
}
Response 200 OK
{
"service": {
"id": "507f1f77bcf86cd799439011",
"workspaceId": "507f191e810c19729de860ea",
"name": "استشارة طبية محدثة",
"description": "وصف محدث",
"durationMinutes": 90,
"price": 200.00,
"color": "#10B981",
"isActive": false,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T12:00:00.000Z"
}
}
Common Errors
400 Bad Request: Invalid input data 409 Conflict: Service with this name already exists 404 Not Found: Service not found 401 Unauthorized: Authentication required 403 Forbidden: Subscription expired
Delete Service
Method & Path
DELETE /api/v1/workspace/:workspaceId/services/:serviceId
Description
Deletes a service from the workspace.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | Yes | The workspace ID |
| serviceId | string | Yes | The service ID |
Response 204 No Content
No response body.
Common Errors
404 Not Found: Service not found 401 Unauthorized: Authentication required 403 Forbidden: Subscription expired
Service Model
Service Object
{
id: string; // Service ID
workspaceId: string; // Workspace ID
name: string; // Service name (1-200 chars)
description?: string; // Service description (max 1000 chars)
durationMinutes?: number; // Default duration in minutes
price?: number; // Default price
color?: string; // Hex color code (e.g., "#3B82F6")
scope: string; // Service scope (currently: "sessions")
isActive: boolean; // Active status
createdAt: string; // ISO datetime
updatedAt: string; // ISO datetime
}
Notes
- Service names must be unique within a workspace
- Service colors must be unique within a workspace (cannot have two services with the same color)
- Services can be marked as inactive without deletion
- Color must be a valid hex color code (3 or 6 digits)
- Duration and price are optional and can be set per session
- Services are required when creating sessions (serviceIds array field)
- Service colors are used to visually identify sessions in calendar views
- Scope field: The
scopefield determines the purpose of the service. Currently, onlysessionsis supported, meaning the service is used for session/appointment management. This allows for future expansion to support services for other features (e.g., products, appointments, etc.) - Services with
scope: "sessions"are automatically filtered in session-related queries and widgets