Course endpoints sit under
/api/brands/{brand}/courses/ with brandAccess middleware. Authenticate with EF-Access-Key.List Courses
number
Results per page (1–100, default: 25)
string
Search by title, description, slug, or instructor name
string
newest, oldest, created_at, updated_atcURL
List Courses (Unpaginated)
{ id, title } for all courses — useful for dropdowns.
Get Course
Create Course
string
required
Course title (max 255)
string
required
Language code (e.g.
en, pt)string
required
Course description
string
required
draft or publishedstring
required
embedded (content lives inline on a page) or module (dedicated course pages on a domain)number
Required when
delivery_type is module. Must be an existing brand domain.string
Required when
delivery_type is module. Must be unique per brand_id + domain_id.string
Instructor display name (max 255)
file | string
Instructor photo — upload as file (multipart) or provide as URL string
file | string
Course logo — upload as file or URL string
file | string
Cover image — upload as file or URL string
boolean
Show module titles in the course outline
boolean
Enable commenting on content
string
Course category name (max 255)
number
Page ID for the course details/landing page
number
Page ID for module listing
number
Page ID for content viewing
number
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
number
required
Source course ID
number
required
Target brand ID
string
required
Title for the copied course in the target brand
Enrollments
List Enrollments
Get Enrollment
string
required
Elasticsearch document ID for the enrollment
Enroll Student
string
required
Student email address. Returns 422 if already enrolled.
string
Student display name (max 255)
cURL
Update Enrollment Notes
string
Internal notes about the enrollment (max 10,000 chars)
Complete Content Item
Mark a specific content item as completed for an enrolled student.number
required
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
string
required
Module title (max 255)
string
required
Module description
Update Module
Delete Module
Reorder Modules
object
required
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