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.
/appointmentsAuthorizationBasic auth · headerrequiredBasic Auth with clientId as username and clientSecret as password
Idempotency-KeystringrequiredUnique key to ensure idempotent creation
application/jsontitlestringrequireddateTimestring<date-time>requiredStart time in ISO 8601. Must include a timezone offset (Z or ±HH:MM).
durationintegerrequiredDuration in minutes
isOnlinebooleanHint for online-only format. The server may recompute this from rooms, address, and onlineAddress.
isHybridbooleanHint for hybrid format. The server may recompute this from rooms, address, and onlineAddress.
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
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.
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.
notesstring{
"title": "Introduction lecture",
"dateTime": "2026-09-15T10:00:00.000Z",
"duration": 90,
"courseIds": [
"layer_abc123"
],
"notes": "First session of the semester"
}{
"title": "Lab session",
"dateTime": "2026-09-16T14:00:00.000Z",
"duration": 120,
"isHybrid": true,
"onlineAddress": "https://meet.example.com/lab",
"courseIds": [
"layer_abc123"
],
"rooms": [
{
"roomId": "room_xyz789",
"setupId": null
}
],
"organizerIds": [
"user_organizer1"
],
"userIds": [
"user_student1"
],
"userGroupIds": [
"group_tutorial_a"
]
}Appointment 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
AppointmentRoomBookingroomIdstringsetupIdstring | nullroomobjectsetupobject | nullappointmentLayersAppointmentLayer[]Show propertiesHide properties
AppointmentLayerlayerIdstringlayerobject | nullShow propertiesHide properties
idstringnamestringcourseobject | nullShow propertiesHide properties
idstringCourse entity ID
codestring | nullnamestringorganizerUsersAppointmentOrganizer[]Show propertiesHide properties
AppointmentOrganizerorganizerIdstringrequiredappointmentUsersAppointmentUserParticipant[]Show propertiesHide properties
AppointmentUserParticipantuserIdstringuserAppointmentSafeUserShow propertiesHide properties
idstringnamestringemailstringfirstNamestring | nulllastNamestring | nullimagestring | nullappointmentCreatorobject[]Institution admin/moderator used as creator for API-created appointments.
Show propertiesHide properties
objectuserIdstringuserAppointmentSafeUserShow propertiesHide properties
idstringnamestringemailstringfirstNamestring | nulllastNamestring | nullimagestring | nullappointmentUserGroupsobject[]Show propertiesHide properties
objectuserGroupIdstringuserGroupobjectappointmentTypeobject | nullseriesobject | nullmetaResponseMetarequiredShow propertiesHide properties
requestIdstringrequiredtimestampstring<date-time>requiredversionstringrequiredv4watermarkstring<date-time>Present on GET /users?updatedSince= pages. Taken at the first page minus a 60s overlap. Bound into pagination.next_cursor. Use it as the next updatedSince after deduping by user id. Delivery is inclusive >= and at-least-once.
Bad Request
typestringrequirederrorcodestringrequiredbad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedidempotency_key_in_progressservice_unavailableretryablerate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
objectfieldstringmessagestringexistingUserIdstringPresent on 409 email or membership-code conflicts. The user id that already holds the email or code.
activeSessionobjectPresent on time-tracking start 409 when a session is already running. Stop this session, then retry start.
Show propertiesHide properties
idstringrequiredstartTimestring<date-time>requiredconflictingLogobjectPresent on time-tracking 409 when the interval being written overlaps an existing log or open session. Start uses [punch, ∞). Stop uses [sessionStart, stop). endTime is null while that session is still open.
Show propertiesHide properties
idstringrequiredstartTimestring<date-time>requiredendTimestring<date-time> | nullrequiredUnauthorized
typestringrequirederrorcodestringrequiredbad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedidempotency_key_in_progressservice_unavailableretryablerate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
objectfieldstringmessagestringexistingUserIdstringPresent on 409 email or membership-code conflicts. The user id that already holds the email or code.
activeSessionobjectPresent on time-tracking start 409 when a session is already running. Stop this session, then retry start.
Show propertiesHide properties
idstringrequiredstartTimestring<date-time>requiredconflictingLogobjectPresent on time-tracking 409 when the interval being written overlaps an existing log or open session. Start uses [punch, ∞). Stop uses [sessionStart, stop). endTime is null while that session is still open.
Show propertiesHide properties
idstringrequiredstartTimestring<date-time>requiredendTimestring<date-time> | nullrequiredForbidden
typestringrequirederrorcodestringrequiredbad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedidempotency_key_in_progressservice_unavailableretryablerate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
objectfieldstringmessagestringexistingUserIdstringPresent on 409 email or membership-code conflicts. The user id that already holds the email or code.
activeSessionobjectPresent on time-tracking start 409 when a session is already running. Stop this session, then retry start.
Show propertiesHide properties
idstringrequiredstartTimestring<date-time>requiredconflictingLogobjectPresent on time-tracking 409 when the interval being written overlaps an existing log or open session. Start uses [punch, ∞). Stop uses [sessionStart, stop). endTime is null while that session is still open.
Show propertiesHide properties
idstringrequiredstartTimestring<date-time>requiredendTimestring<date-time> | nullrequiredConflict — duplicate email or membership code (body includes existingUserId when known), a time-tracking session that is already running (activeSession), a time-tracking interval that overlaps an existing log (conflictingLog), idempotency key reused with a different body (idempotency_key_reused), or concurrent request with the same key still in progress (idempotency_key_in_progress)
typestringrequirederrorcodestringrequiredbad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedidempotency_key_in_progressservice_unavailableretryablerate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
objectfieldstringmessagestringexistingUserIdstringPresent on 409 email or membership-code conflicts. The user id that already holds the email or code.
activeSessionobjectPresent on time-tracking start 409 when a session is already running. Stop this session, then retry start.
Show propertiesHide properties
idstringrequiredstartTimestring<date-time>requiredconflictingLogobjectPresent on time-tracking 409 when the interval being written overlaps an existing log or open session. Start uses [punch, ∞). Stop uses [sessionStart, stop). endTime is null while that session is still open.
Show propertiesHide properties
idstringrequiredstartTimestring<date-time>requiredendTimestring<date-time> | nullrequiredToo Many Requests — 1000 requests per minute per institution. Includes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset (ISO-8601), and Retry-After (seconds).
typestringrequirederrorcodestringrequiredbad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedidempotency_key_in_progressservice_unavailableretryablerate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
objectfieldstringmessagestringexistingUserIdstringPresent on 409 email or membership-code conflicts. The user id that already holds the email or code.
activeSessionobjectPresent on time-tracking start 409 when a session is already running. Stop this session, then retry start.
Show propertiesHide properties
idstringrequiredstartTimestring<date-time>requiredconflictingLogobjectPresent on time-tracking 409 when the interval being written overlaps an existing log or open session. Start uses [punch, ∞). Stop uses [sessionStart, stop). endTime is null while that session is still open.
Show propertiesHide properties
idstringrequiredstartTimestring<date-time>requiredendTimestring<date-time> | nullrequiredInternal Server Error
typestringrequirederrorcodestringrequiredbad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedidempotency_key_in_progressservice_unavailableretryablerate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
objectfieldstringmessagestringexistingUserIdstringPresent on 409 email or membership-code conflicts. The user id that already holds the email or code.
activeSessionobjectPresent on time-tracking start 409 when a session is already running. Stop this session, then retry start.
Show propertiesHide properties
idstringrequiredstartTimestring<date-time>requiredconflictingLogobjectPresent on time-tracking 409 when the interval being written overlaps an existing log or open session. Start uses [punch, ∞). Stop uses [sessionStart, stop). endTime is null while that session is still open.
Show propertiesHide properties
idstringrequiredstartTimestring<date-time>requiredendTimestring<date-time> | nullrequired