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
| Method | Path | Edition | Operation | What it does |
|---|---|---|---|---|
GET | /courses | Core | List Courses | Returns the paginated course catalogue visible to the current user, each entry carrying its enrolment state, progress, section and lesson counts. |
GET | /courses/{course_id} | Core | Get Course | Returns 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-slug | Core | Get Course By Slug | Returns 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-slug | Core | Get Lesson By Slug | Returns 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}/enroll | Core | Enroll Course | Enrols the current user in a course and returns their freshly initialised progress track. |
PUT | /courses/{course_id}/lessons/{lesson_id}/completion | Core | Update Lesson Completion | Marks a lesson complete or incomplete for the current user and returns the recalculated course progress track. |
POST | /courses/{course_id}/lessons/{lesson_id}/video-watched | Core | Post Mark Lesson Video Watched | Records that the current user has watched enough of a gated lesson video to be allowed to mark the lesson complete. |
DELETE | /courses/{course_id}/progress | Core | Delete Reset My Progress | Clears the current user own completion records for a course and returns an empty progress track, leaving the enrolment in place. |
GET | /courses/all-courses | Core | List All Courses | Returns 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/courses | Core | List Admin Courses | Returns the paginated list of courses the current user may manage, each with its student count and its section and lesson totals. |
POST | /admin/courses | Core | Create Course | Creates a course in draft state, with its type, privacy, layout and lock screen behaviour set from the submitted settings. |
GET | /admin/courses/{course_id} | Core | Get Admin Course | Returns 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} | Core | Update Course | Updates 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}/duplicate | Core | Duplicate Course | Copies a course, its sections, its lessons and their attached documents into a new draft owned by the current user. |
DELETE | /admin/courses/{course_id} | Core | Delete Course | Deletes a course together with all of its content and every trace of student participation in it. |
GET | /admin/courses/{course_id}/students | Core | List Course Students | Returns the paginated roster of a course, each student carrying their enrolment pivot and their completion percentage. |
POST | /admin/courses/{course_id}/students | Core | Add Course Student | Enrols one existing WordPress user in the course on behalf of an administrator. |
DELETE | /admin/courses/{course_id}/students/{student_id} | Core | Remove Course Student | Unenrols a student from the course. |
DELETE | /admin/courses/{course_id}/students/{student_id}/progress | Core | Delete Reset Student Progress | Clears one student completion records for the course while leaving them enrolled. |
GET | /admin/courses/{course_id}/users/search | Core | Search Course Users | Searches for WordPress users who are not yet enrolled in the course, for the add-student picker. |
POST | /admin/courses/{course_id}/links | Core | Update Course Links | Replaces the sidebar link list shown on a course with the submitted set. |
GET | /admin/courses/{course_id}/meta-settings | Core | Get Course Meta Settings | Returns the extra course settings panels contributed by integrations, or `null` when nothing has registered any. |
GET | /admin/courses/{course_id}/instructors/search | Core | Search Course Instructors | Searches all WordPress users so one can be assigned as the course instructor. |
GET | /admin/courses/{course_id}/sections | Core | List Course Sections | Returns the sections of a course in display order, with their lessons attached. |
POST | /admin/courses/{course_id}/sections | Core | Create Course Section | Adds a published section to the end of a course outline. |
PATCH | /admin/courses/{course_id}/sections/indexes | Core | Reindex Course Sections | Applies a new display order to a course outline by writing the submitted priority for each section. |
GET | /admin/courses/{course_id}/sections/{section_id} | Core | Get Course Section | Returns one section of a course with its lessons. |
PUT | /admin/courses/{course_id}/sections/{section_id} | Core | Update Course Section | Replaces the title and status of a section. |
PATCH | /admin/courses/{course_id}/sections/{section_id} | Core | Patch Course Section | Applies a partial update to a section, accepting the drip fields that match the course type. |
DELETE | /admin/courses/{course_id}/sections/{section_id} | Core | Delete Course Section | Deletes a section and every lesson inside it. |
PATCH | /admin/courses/{course_id}/sections/{section_id}/indexes | Core | Reindex Course Lessons | Applies a new display order to the lessons inside one section. |
GET | /admin/courses/{course_id}/lessons | Core | List Course Lessons | Returns the lessons of a course in display order, optionally narrowed to one section. |
POST | /admin/courses/{course_id}/lessons | Core | Create Course Lesson | Creates an empty draft lesson at the end of a section. |
PUT | /admin/courses/{course_id}/copy-section | Core | Copy Course Section | Copies 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-lesson | Core | Move Course Lesson | Moves a lesson into a different section of the same course. |
GET | /admin/courses/{course_id}/lessons/{lesson_id} | Core | Get Course Lesson | Returns one lesson in its editable form with its section and course attached. |
PUT | /admin/courses/{course_id}/lessons/{lesson_id} | Core | Update Course Lesson | Saves the full lesson record — title, status, body and metadata — and reconciles the featured image media. |
PATCH | /admin/courses/{course_id}/lessons/{lesson_id} | Core | Patch Course Lesson | Applies a partial update to a lesson, accepting only `title`, `status`, `slug` and `message`. |
DELETE | /admin/courses/{course_id}/lessons/{lesson_id} | Core | Delete Course Lesson | Deletes a single lesson from a course. |
POST | /admin/courses/{course_id}/lessons/{lesson_id}/duplicate | Core | Post Duplicate Lesson | Copies a lesson, inserts the copy directly after the original and renumbers the rest of the section. |
PUT | /admin/courses/{course_id}/lockscreens | PRO | Update Course Lockscreen Settings | Stores 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-banner | PRO | Get Course Welcome Banner Settings | Returns the two course welcome banner variants, one for enrolled students and one for visitors who have not enrolled. |
POST | /admin/courses/{course_id}/welcome-banner | PRO | Post Update Course Welcome Banner Settings | Stores both course welcome banner variants and pre-renders their Markdown descriptions to HTML. |
POST | /admin/courses/{course_id}/students/bulk-add | PRO | Post Bulk Add Students | Enrols 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-import | PRO | Post Bulk Import Students | Imports 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-tag | PRO | Post Resolve CRM Tag Course | Resolves 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/submit | PRO | Submit Lesson Quiz | Grades a quiz lesson submission, stores the attempt and returns the per-question result with the score. |
GET | /courses/{course_id}/lessons/{lesson_id}/quiz/result | PRO | Get Lesson Quiz Result | Returns the current user stored result for one quiz lesson, or null if they have not attempted it. |
GET | /admin/courses/{course_id}/quiz-results | PRO | List Course Quiz Results | Returns 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} | PRO | Update Course Quiz Result | Overrides the pass or fail grade recorded against one quiz attempt. |
GET | /admin/courses/{course_id}/export/quiz-results | PRO | Get Exportable Quiz Results | Returns a flattened, spreadsheet-shaped list of quiz attempts for a course — student, email, quiz, score, grade, attempt count and submission time. |