Skip to main content
Course endpoints sit under /api/brands/{brand}/courses/ with brandAccess middleware. Authenticate with EF-Access-Key.

List Courses

per_page
number
Results per page (1–100, default: 25)
q
string
Search by title, description, slug, or instructor name
sort
string
newest, oldest, created_at, updated_at
cURL

List Courses (Unpaginated)

Returns { id, title } for all courses — useful for dropdowns.

Get Course


Create Course

title
string
required
Course title (max 255)
language_code
string
required
Language code (e.g. en, pt)
description
string
required
Course description
status
string
required
draft or published
delivery_type
string
required
embedded (content lives inline on a page) or module (dedicated course pages on a domain)
domain_id
number
Required when delivery_type is module. Must be an existing brand domain.
slug
string
Required when delivery_type is module. Must be unique per brand_id + domain_id.
instructor_name
string
Instructor display name (max 255)
instructor_photo
file | string
Instructor photo — upload as file (multipart) or provide as URL string
Course logo — upload as file or URL string
cover
file | string
Cover image — upload as file or URL string
show_module_titles
boolean
Show module titles in the course outline
allow_comments
boolean
Enable commenting on content
category_name
string
Course category name (max 255)
details_page_id
number
Page ID for the course details/landing page
module_page_id
number
Page ID for module listing
content_page_id
number
Page ID for content viewing
enrollment_email_template_id
number
Email template ID to send upon enrollment
cURL

Update Course

Same body as Create. title, language_code, description, status, and delivery_type are required.

Delete Course


Copy Course to Another Brand

id
number
required
Source course ID
brand_id
number
required
Target brand ID
name
string
required
Title for the copied course in the target brand

Enrollments

List Enrollments

Get Enrollment

enrollment
string
required
Elasticsearch document ID for the enrollment

Enroll Student

email
string
required
Student email address. Returns 422 if already enrolled.
name
string
Student display name (max 255)
cURL

Update Enrollment Notes

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.
content_id
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)

Returns { id, title } array — cached.

Create Module

title
string
required
Module title (max 255)
description
string
required
Module description

Update Module

Delete Module

Reorder Modules

order
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 copy endpoint replicates the course’s modules and all content to the target brand
  • progress_percent is recalculated automatically when content is marked complete