Skip to content

Courses API

Portal course consumption endpoints and the full course administration surface.

Authentication

Course routes are split between PortalPolicy and CourseAdminPolicy depending on whether the endpoint is a learner or admin flow.

Endpoints

MethodPathEditionOperationWhat it does
GET/coursesCoreList CoursesReturns the paginated course catalogue visible to the current user, each entry carrying its enrolment state, progress, section and lesson counts.
GET/courses/{course_id}CoreGet CourseReturns one course by numeric id with its sections, the lessons the caller may see, per-lesson lock state and the current progress track.
GET/courses/{course_slug}/by-slugCoreGet Course By SlugReturns one course by slug with everything `get-course` returns, plus the instructor block — the creator profile, their total course count and optionally their total student count.
GET/courses/{course_slug}/lessons/{lesson_slug}/by-slugCoreGet Lesson By SlugReturns a single lesson by course and lesson slug, with its access decision resolved and its body parsed only when the caller may read it.
POST/courses/{course_id}/enrollCoreEnroll CourseEnrols the current user in a course and returns their freshly initialised progress track.
PUT/courses/{course_id}/lessons/{lesson_id}/completionCoreUpdate Lesson CompletionMarks a lesson complete or incomplete for the current user and returns the recalculated course progress track.
POST/courses/{course_id}/lessons/{lesson_id}/video-watchedCorePost Mark Lesson Video WatchedRecords that the current user has watched enough of a gated lesson video to be allowed to mark the lesson complete.
DELETE/courses/{course_id}/progressCoreDelete Reset My ProgressClears the current user own completion records for a course and returns an empty progress track, leaving the enrolment in place.
GET/courses/all-coursesCoreList All CoursesReturns the paginated course catalogue with each course fully expanded — sections, per-lesson lock state and the current user progress track — in a single call.
GET/admin/coursesCoreList Admin CoursesReturns the paginated list of courses the current user may manage, each with its student count and its section and lesson totals.
POST/admin/coursesCoreCreate CourseCreates a course in draft state, with its type, privacy, layout and lock screen behaviour set from the submitted settings.
GET/admin/courses/{course_id}CoreGet Admin CourseReturns one course in its editable form, with the lock screen configuration, the attached category ids and — when it has students — the completion count and average progress.
PUT/admin/courses/{course_id}CoreUpdate CourseUpdates a course record and its settings block, firing the course-published hook the first time its status crosses into `published`.
POST/admin/courses/{course_id}/duplicateCoreDuplicate CourseCopies a course, its sections, its lessons and their attached documents into a new draft owned by the current user.
DELETE/admin/courses/{course_id}CoreDelete CourseDeletes a course together with all of its content and every trace of student participation in it.
GET/admin/courses/{course_id}/studentsCoreList Course StudentsReturns the paginated roster of a course, each student carrying their enrolment pivot and their completion percentage.
POST/admin/courses/{course_id}/studentsCoreAdd Course StudentEnrols one existing WordPress user in the course on behalf of an administrator.
DELETE/admin/courses/{course_id}/students/{student_id}CoreRemove Course StudentUnenrols a student from the course.
DELETE/admin/courses/{course_id}/students/{student_id}/progressCoreDelete Reset Student ProgressClears one student completion records for the course while leaving them enrolled.
GET/admin/courses/{course_id}/users/searchCoreSearch Course UsersSearches for WordPress users who are not yet enrolled in the course, for the add-student picker.
POST/admin/courses/{course_id}/linksCoreUpdate Course LinksReplaces the sidebar link list shown on a course with the submitted set.
GET/admin/courses/{course_id}/meta-settingsCoreGet Course Meta SettingsReturns the extra course settings panels contributed by integrations, or `null` when nothing has registered any.
GET/admin/courses/{course_id}/instructors/searchCoreSearch Course InstructorsSearches all WordPress users so one can be assigned as the course instructor.
GET/admin/courses/{course_id}/sectionsCoreList Course SectionsReturns the sections of a course in display order, with their lessons attached.
POST/admin/courses/{course_id}/sectionsCoreCreate Course SectionAdds a published section to the end of a course outline.
PATCH/admin/courses/{course_id}/sections/indexesCoreReindex Course SectionsApplies a new display order to a course outline by writing the submitted priority for each section.
GET/admin/courses/{course_id}/sections/{section_id}CoreGet Course SectionReturns one section of a course with its lessons.
PUT/admin/courses/{course_id}/sections/{section_id}CoreUpdate Course SectionReplaces the title and status of a section.
PATCH/admin/courses/{course_id}/sections/{section_id}CorePatch Course SectionApplies a partial update to a section, accepting the drip fields that match the course type.
DELETE/admin/courses/{course_id}/sections/{section_id}CoreDelete Course SectionDeletes a section and every lesson inside it.
PATCH/admin/courses/{course_id}/sections/{section_id}/indexesCoreReindex Course LessonsApplies a new display order to the lessons inside one section.
GET/admin/courses/{course_id}/lessonsCoreList Course LessonsReturns the lessons of a course in display order, optionally narrowed to one section.
POST/admin/courses/{course_id}/lessonsCoreCreate Course LessonCreates an empty draft lesson at the end of a section.
PUT/admin/courses/{course_id}/copy-sectionCoreCopy Course SectionCopies a section, its lessons and their attached documents from one course into another, appended to the end of the destination outline.
PUT/admin/courses/{course_id}/move-lessonCoreMove Course LessonMoves a lesson into a different section of the same course.
GET/admin/courses/{course_id}/lessons/{lesson_id}CoreGet Course LessonReturns one lesson in its editable form with its section and course attached.
PUT/admin/courses/{course_id}/lessons/{lesson_id}CoreUpdate Course LessonSaves the full lesson record — title, status, body and metadata — and reconciles the featured image media.
PATCH/admin/courses/{course_id}/lessons/{lesson_id}CorePatch Course LessonApplies a partial update to a lesson, accepting only `title`, `status`, `slug` and `message`.
DELETE/admin/courses/{course_id}/lessons/{lesson_id}CoreDelete Course LessonDeletes a single lesson from a course.
POST/admin/courses/{course_id}/lessons/{lesson_id}/duplicateCorePost Duplicate LessonCopies a lesson, inserts the copy directly after the original and renumbers the rest of the section.
PUT/admin/courses/{course_id}/lockscreensPROUpdate Course Lockscreen SettingsStores the lock screen a private course shows to visitors who are not enrolled — its copy, imagery and call to action.
GET/admin/courses/{course_id}/welcome-bannerPROGet Course Welcome Banner SettingsReturns the two course welcome banner variants, one for enrolled students and one for visitors who have not enrolled.
POST/admin/courses/{course_id}/welcome-bannerPROPost Update Course Welcome Banner SettingsStores both course welcome banner variants and pre-renders their Markdown descriptions to HTML.
POST/admin/courses/{course_id}/students/bulk-addPROPost Bulk Add StudentsEnrols many users in a course in one call, either from an explicit id list or by copying the membership of another space or course in batches.
POST/admin/courses/{course_id}/students/bulk-importPROPost Bulk Import StudentsImports students into a course from submitted rows, creating WordPress users for addresses that do not yet exist.
POST/admin/courses/{course_id}/students/resolve-crm-tagPROPost Resolve CRM Tag CourseResolves a FluentCRM tag into a page of contacts to enrol in the course, optionally creating WordPress users for contacts that do not have one.
POST/courses/{course_id}/lessons/{lesson_id}/quiz/submitPROSubmit Lesson QuizGrades a quiz lesson submission, stores the attempt and returns the per-question result with the score.
GET/courses/{course_id}/lessons/{lesson_id}/quiz/resultPROGet Lesson Quiz ResultReturns the current user stored result for one quiz lesson, or null if they have not attempted it.
GET/admin/courses/{course_id}/quiz-resultsPROList Course Quiz ResultsReturns the paginated quiz attempts across a whole course, each with the student profile and the lesson attached.
POST/admin/courses/{course_id}/quiz-results/{quiz_id}PROUpdate Course Quiz ResultOverrides the pass or fail grade recorded against one quiz attempt.
GET/admin/courses/{course_id}/export/quiz-resultsPROGet Exportable Quiz ResultsReturns a flattened, spreadsheet-shaped list of quiz attempts for a course — student, email, quiz, score, grade, attempt count and submission time.

FluentCommunity developer documentation