[BETA] 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, AMBIGUOUS_COURSE_IDENTIFIER, DUPLICATE_IN_REQUEST, COURSE_NOT_FOUND, ARCHIVED_COURSE_EXISTS, REQUIRED_FIELD_MISSING, INVALID_DATE_RANGE, AMBIGUOUS_PROFESSOR_IDENTIFIER, PROFESSORS_NOT_FOUND, ARCHIVED_PROFESSOR_EXISTS, AMBIGUOUS_CLASSROOM_IDENTIFIER, CLASSROOM_NOT_FOUND, 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
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