Scheduling API
Endpoints for managing schedules, shifts, and templates.
Shift Templates
List Templates
/api/scheduling/templatesAuth: SessionGet all shift templates.
Response (200):
{ "templates": [ { "id": "uuid", "name": "Morning Shift", "startTime": "08:00", "endTime": "16:00", "durationMinutes": 480, "breakRules": [ { "startOffset": 240, "duration": 60, "type": "lunch" } ], "daysOfWeek": [1, 2, 3, 4, 5], "color": "#3b82f6" } ]}Create Template
/api/scheduling/templatesAuth: SessionCreate a new shift template.
Request Body:
{ "name": "Morning Shift", "startTime": "08:00", "endTime": "16:00", "breakRules": [ { "startOffset": 120, "duration": 15, "type": "break" }, { "startOffset": 240, "duration": 60, "type": "lunch" } ], "daysOfWeek": [1, 2, 3, 4, 5], "color": "#3b82f6"}| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Required | Template name (1-100 chars) |
startTime | string | Required | Start time (HH:MM) |
endTime | string | Required | End time (HH:MM) |
breakRules | array | Optional | Break definitions |
daysOfWeek | array | Optional | Days (0=Sun, 6=Sat) |
color | string | Optional | Hex color code |
Update Template
/api/scheduling/templates/:idAuth: SessionUpdate an existing template.
Delete Template
/api/scheduling/templates/:idAuth: SessionDelete a template.
Schedules
List Schedules
/api/scheduling/schedulesAuth: SessionGet schedules with optional filters.
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | Optional | Filter: "draft", "published", "locked" |
startDate | string | Optional | Filter by start date |
endDate | string | Optional | Filter by end date |
Response (200):
{ "schedules": [ { "id": "uuid", "name": "Week of Feb 1", "startDate": "2026-02-01", "endDate": "2026-02-07", "status": "draft", "shiftCount": 45, "employeeCount": 12 } ]}Create Schedule
/api/scheduling/schedulesAuth: SessionCreate a new schedule.
Request Body:
{ "name": "Week of Feb 1", "startDate": "2026-02-01", "endDate": "2026-02-07"}Get Schedule Details
/api/scheduling/schedules/:idAuth: SessionGet schedule with all shifts.
Response (200):
{ "schedule": { "id": "uuid", "name": "Week of Feb 1", "status": "draft", "startDate": "2026-02-01", "endDate": "2026-02-07" }, "shifts": [ { "shift": { "id": "uuid", "date": "2026-02-01", "startTime": "08:00", "endTime": "16:00" }, "employee": { "id": "uuid", "firstName": "John", "lastName": "Doe" }, "template": { "name": "Morning Shift", "color": "#3b82f6" } } ]}Update Schedule
/api/scheduling/schedules/:idAuth: SessionUpdate schedule (e.g., publish).
Request Body:
{ "status": "published"}Delete Schedule
/api/scheduling/schedules/:idAuth: SessionDelete a schedule.
Shifts
List Shifts
/api/scheduling/shiftsAuth: SessionGet shifts with filters.
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
scheduleId | string | Optional | Filter by schedule |
employeeId | string | Optional | Filter by employee |
date | string | Optional | Filter by date |
Create Shifts
/api/scheduling/shiftsAuth: SessionCreate one or more shifts.
Request Body (Single Shift):
{ "scheduleId": "uuid", "employeeId": "uuid", "templateId": "uuid", "date": "2026-02-01", "startTime": "08:00", "endTime": "16:00"}Request Body (Bulk):
{ "shifts": [ { "scheduleId": "uuid", "employeeId": "uuid", "date": "2026-02-01", "startTime": "08:00", "endTime": "16:00" } ]}Update Shift
/api/scheduling/shifts/:idAuth: SessionUpdate a shift.
Delete Shift
/api/scheduling/shifts/:idAuth: SessionDelete a shift.
Auto-Generate Schedule
/api/scheduling/generateAuth: SessionAuto-generate an optimal schedule.
Request Body:
{ "name": "Auto-Generated Week", "startDate": "2026-02-01", "endDate": "2026-02-07", "employeeIds": ["uuid1", "uuid2"], "templateIds": ["uuid1"], "options": { "coverageTarget": 10, "respectAvailability": true, "balanceHours": true }}| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Required | Schedule name |
startDate | string | Required | Start date |
endDate | string | Required | End date |
employeeIds | array | Required | Employees to schedule |
templateIds | array | Optional | Templates to use |
options | object | Optional | Generation options |
Response (201):
{ "success": true, "schedule": { "id": "uuid", "name": "Auto-Generated Week", "shiftCount": 35 }}Clone Schedule
Clone a Schedule
/api/scheduling/schedules/:id/cloneAuth: SessionCreate a copy of a schedule with all shift assignments offset to a new date range. The cloned schedule is always created as a draft. Admin only.
Request Body:
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Required | Name for the cloned schedule |
startDate | string | Required | Start date (YYYY-MM-DD) for the new schedule |
Response (200):
{ "success": true, "message": "Schedule cloned with 35 shifts", "schedule": { "id": "uuid", "name": "Copy of Week 12", "startDate": "2026-03-22", "endDate": "2026-03-28", "status": "draft" }, "stats": { "totalShifts": 35 }}The end date is auto-calculated from the source schedule's duration. All shift times are preserved; only dates are offset.
Biddable Shifts (Pro+)
Shift bidding requires the Pro or Enterprise subscription tier.
List Biddable Shifts
/api/scheduling/biddable-shiftsAuth: SessionGet open shifts available for employee bidding.
Create Biddable Shift
/api/scheduling/biddable-shiftsAuth: SessionCreate a new biddable shift.
Update Biddable Shift
/api/scheduling/biddable-shifts/:idAuth: SessionUpdate a biddable shift.
Delete Biddable Shift
/api/scheduling/biddable-shifts/:idAuth: SessionRemove a biddable shift.