Create an appointment for a course
Creates an appointment attached to the course in the path. The path id is the course entity ID. The request body still requires courseIds, but only the path course is attached — pass that course’s layerId in courseIds for consistency. Requires Idempotency-Key. Creator is recorded as an institution admin/moderator.
POST
/courses/{id}/appointmentsPath parameters
idstringrequiredCourse entity ID (`id` from `GET /courses`).
Header parameters
Idempotency-KeystringrequiredUnique key to ensure idempotent creation
Request body
requiredapplication/jsontitlestringrequiredmin length 1 · max length 255
dateTimestring<date-time>requiredStart time in ISO 8601. Must include a timezone offset (`Z` or `±HH:MM`).
durationintegerrequiredDuration in minutes
min 1
isOnlinebooleanHint for online-only format. The server may recompute this from rooms, address, and onlineAddress.
default: false
isHybridbooleanHint for hybrid format. The server may recompute this from rooms, address, and onlineAddress.
default: false
addressstringPhysical address. May be taken from the first booked room's location.
onlineAddressstringOnline meeting URL (e.g. video link).
locationstringFree-text location label.
roomsAppointmentRoomInput[]v4 only — legacy `roomId` / `roomIds` fields are not accepted.
Show propertiesHide properties
Array of
AppointmentRoomInputroomIdstringrequiredInstitution room ID from Room Management.
setupIdstring | nullOptional room setup/version ID. Omit or pass null for the default setup.
courseIdsstring[]requiredLayer IDs of courses to attach (`layerId` from `GET /courses`, **not** the course entity `id`). Required on all create requests.
min items 1
organizerIdsstring[]User IDs of organizers (must belong to the institution).
userIdsstring[]Additional participant user IDs (must belong to the institution).
userGroupIdsstring[]User group IDs to invite as participants.
appointmentTypeIdstring | nullInstitution appointment type ID. There is no public list endpoint — obtain IDs from your institution configuration in the dashboard.
notesstringResponses
201Appointment created
dataAppointmentrequiredFull appointment from `GET /appointments`, `GET /appointments/{id}`, and create responses. Includes participants, creator, groups, and series when loaded.
Show propertiesHide properties
idstringrequiredtitlestringrequirednotesstringdateTimestring<date-time>requireddurationintegerrequiredDuration in minutes
isOnlinebooleanrequiredisHybridbooleanrequiredonlineAddressstringaddressstringlocationstring | nullproviderstringroomIdstring | nullDeprecated — use appointmentRooms.
appointmentRoomsAppointmentRoomBooking[]Show propertiesHide properties
Array of
AppointmentRoomBookingroomIdstringsetupIdstring | nullroomobjectsetupobject | nullappointmentLayersAppointmentLayer[]Show propertiesHide properties
Array of
AppointmentLayerlayerIdstringlayerobject | nullShow propertiesHide properties
idstringnamestringcourseobject | nullShow propertiesHide properties
idstringCourse entity ID
codestring | nullnamestringorganizerUsersAppointmentOrganizer[]Show propertiesHide properties
Array of
AppointmentOrganizerorganizerIdstringrequiredappointmentUsersAppointmentUserParticipant[]Show propertiesHide properties
Array of
AppointmentUserParticipantuserIdstringuserAppointmentSafeUserShow propertiesHide properties
idstringnamestringemailstringfirstNamestring | nulllastNamestring | nullimagestring | nullappointmentCreatorobject[]Institution admin/moderator used as creator for API-created appointments.
Show propertiesHide properties
Array of
objectuserIdstringuserAppointmentSafeUserShow propertiesHide properties
idstringnamestringemailstringfirstNamestring | nulllastNamestring | nullimagestring | nullappointmentUserGroupsobject[]Show propertiesHide properties
Array of
objectuserGroupIdstringuserGroupobjectappointmentTypeobject | nullseriesobject | nullmetaResponseMetarequiredShow propertiesHide properties
requestIdstringrequiredtimestampstring<date-time>requiredversionstringrequiredAllowed:
v4400Bad Request
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestring401Unauthorized
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestring403Forbidden
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestring404Not Found
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestring409Conflict
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestring429Too Many Requests
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestring500Internal Server Error
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestringRequest
curl -X POST "https://fuxam.app/api/v4/courses/string/appointments" \
-H "Idempotency-Key: string" \
-H "Content-Type: application/json" \
-d '{
"title": "Introduction lecture",
"dateTime": "2026-09-15T10:00:00.000Z",
"duration": 90,
"courseIds": [
"layer_abc123"
],
"organizerIds": [
"user_organizer1"
],
"notes": "First session of the semester"
}'const response = await fetch("https://fuxam.app/api/v4/courses/string/appointments", {
method: "POST",
headers: {
"Idempotency-Key": "string",
"Content-Type": "application/json"
},
body: JSON.stringify({
"title": "Introduction lecture",
"dateTime": "2026-09-15T10:00:00.000Z",
"duration": 90,
"courseIds": [
"layer_abc123"
],
"organizerIds": [
"user_organizer1"
],
"notes": "First session of the semester"
})
});import requests
response = requests.post(
"https://fuxam.app/api/v4/courses/string/appointments",
headers={
"Idempotency-Key": "string",
"Content-Type": "application/json"
},
json={
"title": "Introduction lecture",
"dateTime": "2026-09-15T10:00:00.000Z",
"duration": 90,
"courseIds": [
"layer_abc123"
],
"organizerIds": [
"user_organizer1"
],
"notes": "First session of the semester"
},
)Response
{
"data": {
"id": "appt_def456",
"title": "Introduction lecture",
"notes": "First session of the semester",
"dateTime": "2026-09-15T10:00:00.000Z",
"duration": 90,
"isOnline": false,
"isHybrid": false,
"onlineAddress": "",
"address": "Building A, Room 101",
"location": null,
"provider": "fuxam",
"roomId": null,
"appointmentLayers": [
{
"layerId": "layer_abc123",
"layer": {
"id": "layer_abc123",
"name": "CS101"
},
"course": {
"id": "clx1234567890",
"code": "CS101",
"name": "Introduction to Computer Science"
}
}
],
"appointmentRooms": [],
"organizerUsers": [
{
"organizerId": "user_organizer1"
}
],
"appointmentUsers": [
{
"userId": "user_student1",
"user": {
"id": "user_student1",
"name": "Jane Doe",
"email": "jane@example.com",
"firstName": "Jane",
"lastName": "Doe",
"image": null
}
}
],
"appointmentCreator": [
{
"userId": "user_admin1",
"user": {
"id": "user_admin1",
"name": "Admin User",
"email": "admin@example.com",
"firstName": "Admin",
"lastName": "User",
"image": null
}
}
],
"appointmentUserGroups": [],
"appointmentType": null,
"series": null
},
"meta": {
"requestId": "req_1234567890_abc",
"timestamp": "2026-06-02T07:00:00.000Z",
"version": "v4"
}
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}