Course endpoints sit under
/api/brands/{brand}/courses/ with brandAccess middleware. Authenticate with EF-Access-Key.List Courses
Results per page (1–100, default: 25)
Search by title, description, slug, or instructor name
newest, oldest, created_at, updated_atcURL
List Courses (Unpaginated)
{ id, title } for all courses — useful for dropdowns.
Get Course
Create Course
Course title (max 255)
Language code (e.g.
en, pt)Course description
draft or publishedembedded (content lives inline on a page) or module (dedicated course pages on a domain)Required when
delivery_type is module. Must be an existing brand domain.Required when
delivery_type is module. Must be unique per brand_id + domain_id.Instructor display name (max 255)
Instructor photo — upload as file (multipart) or provide as URL string
Course logo — upload as file or URL string
Cover image — upload as file or URL string
Show module titles in the course outline
Enable commenting on content
Course category name (max 255)
Page ID for the course details/landing page
Page ID for module listing
Page ID for content viewing
Email template ID to send upon enrollment
cURL
Update Course
title, language_code, description, status, and delivery_type are required.
Delete Course
Copy Course to Another Brand
Source course ID
Target brand ID
Title for the copied course in the target brand
Enrollments
List Enrollments
Get Enrollment
Elasticsearch document ID for the enrollment
Enroll Student
Student email address. Returns 422 if already enrolled.
Student display name (max 255)
cURL
Update Enrollment Notes
Internal notes about the enrollment (max 10,000 chars)
Complete Content Item
Mark a specific content item as completed for an enrolled student.The course content item ID to mark as complete
This endpoint is idempotent — marking an already-completed item again does not create duplicates.
Remove Enrollment
Modules
List Modules
List Modules (Unpaginated)
{ id, title } array — cached.
Create Module
Module title (max 255)
Module description
Update Module
Delete Module
Reorder Modules
Map of
{ "<module_id>": <integer order>, ... }Notes
- Enrollment IDs are Elasticsearch document IDs (strings), not numeric database IDs
- File uploads (
logo,cover,instructor_photo) are stored on BunnyCDN — you can provide a URL string instead of uploading a file - The
copyendpoint replicates the course’s modules and all content to the target brand progress_percentis recalculated automatically when content is marked complete