Create a module
Creates a Module or catalog Submodule with an initial active version. Omit kind or send kind=module to create a normal Module (isSubmodule=false). kind=submodule creates a reusable catalog Submodule (isSubmodule=true) and requires Module Hierarchy; otherwise the API returns 409 Conflict. This does not attach the Submodule to a parent version — use POST /modules/{id}/versions/{versionId}/submodules for connections. Returns defaultVersion, firstVersion, and courses count. Scoped to your integration’s institution via Basic Auth credentials.
/modulesAuthorizationBasic auth · headerrequiredBasic Auth with clientId as username and clientSecret as password
Idempotency-Keystringrequiredapplication/jsonnamestringrequiredcodestringdescriptionstringiconstringbannerstringectsPointsnumberECTS credit points. Halves only (0, 0.5, 1, 1.5, …). Breaking change: previously integer-only.
requiredAttendancePercentageintegerversionNamestringkindstringOptional catalog kind. Omit or use module to create a Module. Use submodule to create a reusable catalog Submodule.
modulesubmoduleModule created
dataModuleCreateResultrequiredModule returned by POST /modules: created module with its initial version, plus defaultVersion, firstVersion, and courses count. Use GET /modules/{id} for examination requirements, files, and full version detail.
Show propertiesHide properties
idstringrequirednamestringrequiredinstitutionIdstringrequiredcodestring | nullisArchivedboolean | nullnameTranslationsobject | nullcourseModuleTagsModuleTag[]Show propertiesHide properties
ModuleTagidstringrequiredcourseModuleIdstringrequiredtagIdstringrequiredtagobjectrequiredShow propertiesHide properties
idstringrequirednamestringrequiredinstitutionIdstringrequiredcolorstring | nulliconstring | nullversionsModuleVersion[]requiredShow propertiesHide properties
ModuleVersionidstringrequiredversionstringrequirednamestringrequireddescriptionstring | nullrequiredMay be an empty string when not set.
iconstring | nullrequirediconTypestring | nullrequiredbannerstring | nullrequiredcreatedAtstring<date-time>requiredupdatedAtstring<date-time>requiredrequiredAttendancePercentageintegerrequiredectsPointsnumberrequiredECTS credit points. Halves only (0, 0.5, 1, 1.5, …). Breaking change: previously integer-only.
courseModuleIdstringrequiredstatusstringrequiredDRAFTACTIVEARCHIVEDtimePlanIdstring | nullrequiredisDefaultbooleanrequiredearlyAssessmentEnabledbooleanrequiredisCurrentlyElectablebooleanrequiredcapacityinteger | nullrequiredcolorinteger | nullrequiredcourseChatFileAttachmentsDefaultbooleanrequiredcourseChatReadOnlyDefaultbooleanrequiredcourseFeatureDefaultsobject | nullrequiredmoduleNamestring | nullrequiredattemptRulesobject | nullrequireddefaultVersionModuleVersion | nullThe default version for this module. On create, matches firstVersion.
Show propertiesHide properties
idstringrequiredversionstringrequirednamestringrequireddescriptionstring | nullrequiredMay be an empty string when not set.
iconstring | nullrequirediconTypestring | nullrequiredbannerstring | nullrequiredcreatedAtstring<date-time>requiredupdatedAtstring<date-time>requiredrequiredAttendancePercentageintegerrequiredectsPointsnumberrequiredECTS credit points. Halves only (0, 0.5, 1, 1.5, …). Breaking change: previously integer-only.
courseModuleIdstringrequiredstatusstringrequiredDRAFTACTIVEARCHIVEDtimePlanIdstring | nullrequiredisDefaultbooleanrequiredearlyAssessmentEnabledbooleanrequiredisCurrentlyElectablebooleanrequiredcapacityinteger | nullrequiredcolorinteger | nullrequiredcourseChatFileAttachmentsDefaultbooleanrequiredcourseChatReadOnlyDefaultbooleanrequiredcourseFeatureDefaultsobject | nullrequiredmoduleNamestring | nullrequiredattemptRulesobject | nullrequirednullfirstVersionModuleVersion | nullThe first version created for this module.
Show propertiesHide properties
idstringrequiredversionstringrequirednamestringrequireddescriptionstring | nullrequiredMay be an empty string when not set.
iconstring | nullrequirediconTypestring | nullrequiredbannerstring | nullrequiredcreatedAtstring<date-time>requiredupdatedAtstring<date-time>requiredrequiredAttendancePercentageintegerrequiredectsPointsnumberrequiredECTS credit points. Halves only (0, 0.5, 1, 1.5, …). Breaking change: previously integer-only.
courseModuleIdstringrequiredstatusstringrequiredDRAFTACTIVEARCHIVEDtimePlanIdstring | nullrequiredisDefaultbooleanrequiredearlyAssessmentEnabledbooleanrequiredisCurrentlyElectablebooleanrequiredcapacityinteger | nullrequiredcolorinteger | nullrequiredcourseChatFileAttachmentsDefaultbooleanrequiredcourseChatReadOnlyDefaultbooleanrequiredcourseFeatureDefaultsobject | nullrequiredmoduleNamestring | nullrequiredattemptRulesobject | nullrequirednullcoursesintegerTotal courses linked across all versions.
isSubmodulebooleanCatalog classification. false is a Module; true is a reusable catalog Submodule. This is not a parent-version connection.
metaResponseMetarequiredShow 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> | 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> | nullrequiredUnprocessable Entity — validation or business rule 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> | 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