Batch create or update courses

Upsert up to 1000 courses in a single request. Returns 200 when all items succeed, 207 for partial success with per-item failures.

Resolution logic:

  • courseId provided → strict update by Edusign ID
  • externalReferenceId provided → create-or-update: lookup by external ID within school scope; create if not found
  • Neither provided → create (all mandatory fields required)

XOR rules (mutually exclusive):

  • courseId / externalReferenceId — provide one or neither
  • professorIds / professorExternalReferenceIds — provide exactly one
  • classroomId / classroomExternalReferenceId — provide one or neither
  • students.studentIds / students.studentExternalReferenceIds — provide one or neither
  • students.groupIds / students.groupExternalReferenceIds — provide one or neither

Required fields for creation: name, startDateTime, endDateTime, and one of professorIds or professorExternalReferenceIds.

Student enrollment (optional): when the students field is provided, the resolved roster fully replaces the current one (replace semantics, mirroring PUT /courses/:id/students for the roster diff — survey recipient sync is not performed by this endpoint, use the mono-cours PUT if you need it). Past-protection: students currently enrolled in a course where endAt < now or locked === true are not removed. Multi-group protection: students still members of an assigned group are not removed. When students is omitted on an update, the roster is left unchanged.

Per-item error codes: VALIDATION_ERROR, DUPLICATE_IN_REQUEST, REQUIRED_FIELD_MISSING, EXTERNAL_REFERENCE_PAIR_MISSING, INVALID_DATE_RANGE, AMBIGUOUS_COURSE_IDENTIFIER, COURSE_NOT_FOUND, ARCHIVED_COURSE_EXISTS, AMBIGUOUS_PROFESSOR_IDENTIFIER, PROFESSORS_NOT_FOUND, ARCHIVED_PROFESSOR_EXISTS, AMBIGUOUS_CLASSROOM_IDENTIFIER, CLASSROOM_NOT_FOUND, AMBIGUOUS_TRAINING_IDENTIFIER, TRAINING_NOT_FOUND, ARCHIVED_TRAINING_EXISTS, AMBIGUOUS_STUDENT_IDENTIFIER, STUDENTS_NOT_FOUND, ARCHIVED_STUDENT_EXISTS, AMBIGUOUS_GROUP_IDENTIFIER, GROUPS_NOT_FOUND, ARCHIVED_GROUP_EXISTS, MAX_STUDENTS_EXCEEDED, CREATE_FAILED, UPDATE_FAILED.

Rate limit: HEAVY. Idempotency: 5s deduplication window.

Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…
Body Params
courses
array of objects
required

Array of courses to create or update

courses*
Responses

Language
Credentials
Bearer
JWT
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json