Create an appointment
Creates an appointment attached to one or more courses via courseIds (layer IDs from GET /courses). Supports multiple courses in one request. Requires Idempotency-Key. Creator is recorded as an institution admin/moderator.
POST
/appointmentsHeader 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
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/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/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/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"
}
]
}