Skip to Content

Courses

Course CRUD, cloning, export/import and contributor management. Create and update endpoints accept multipart form data.

Export multiple courses as ZIP

POST/api/v1/courses/export/batch
API tokencourses:createor user session

Export multiple courses (up to 20 per request) as a single ZIP archive. All specified courses must belong to the same organization and the caller must have read access to each course.

Request bodyapplication/jsonrequired

course_uuidsstring[]required
Error responses
  • 403 User lacks read permission on one of the courses
  • 404 One or more of the requested courses was not found
  • 422 Validation error (empty list or more than 20 courses requested)
Request

Analyze a course import package

POST/api/v1/courses/import/analyze
API tokencourses:createor user session

Upload and analyze a LearnHouse course export ZIP. Validates the package, extracts its contents, and returns a list of courses available for import along with a temp_id to use with the subsequent import endpoint.

Query parameters

org_idintegerrequired

Request bodymultipart/form-datarequired

zip_filefilerequired

Returns

ImportAnalysisResponse — Package analyzed successfully

temp_idstringrequired
versionstringrequired
coursesImportCourseInfo[]required
Show child attributes
course_uuidstringrequired
namestringrequired
descriptionstring | null
chapters_countinteger
activities_countinteger
has_thumbnailboolean
Error responses
  • 400 Invalid or malformed export package
  • 403 User lacks permission to create courses in the organization
  • 404 Organization not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{
  "temp_id": "string",
  "version": "string",
  "courses": [
    {
      "course_uuid": "string",
      "name": "Example name",
      "description": "An example description",
      "chapters_count": 0,
      "activities_count": 0,
      "has_thumbnail": false
    }
  ]
}

Import courses from an analyzed package

POST/api/v1/courses/import
API tokencourses:createor user session

Import previously analyzed courses into an organization. Uses the temp_id returned by the analyze step along with the list of course UUIDs to import. Up to 20 courses can be imported per request.

Query parameters

org_idintegerrequired

Request bodyapplication/jsonrequired

temp_idstringrequired
course_uuidsstring[]required
name_prefixstring | null
set_privateboolean
set_unpublishedboolean

Returns

ImportResult — Courses imported successfully

total_coursesintegerrequired
successfulintegerrequired
failedintegerrequired
coursesImportCourseResult[]required
Show child attributes
original_uuidstringrequired
new_uuidstringrequired
namestringrequired
successbooleanrequired
errorstring | null
Error responses
  • 400 Invalid temp_id or course_uuids not present in the package
  • 403 User lacks permission to create courses in the organization
  • 404 Organization or temporary package not found
  • 422 Validation error (empty list or more than 20 courses)
Request
Response
{
  "total_courses": 0,
  "successful": 0,
  "failed": 0,
  "courses": [
    {
      "original_uuid": "string",
      "new_uuid": "string",
      "name": "Example name",
      "success": false,
      "error": "string"
    }
  ]
}

Create course

POST/api/v1/courses/
API tokencourses:createor user session

Create a new course in the specified organization. Accepts multipart form data with course metadata and an optional thumbnail image or video.

Query parameters

org_idintegerrequired

Request bodymultipart/form-datarequired

namestringrequired
descriptionstringrequired
publicbooleanrequired
learningsstring
tagsstring
aboutstringrequired
thumbnail_typeThumbnailType
imagevideoboth
extra_metadatastring | null
thumbnailfile | null

Returns

CourseRead — Course created successfully

namestringrequired
descriptionstring | null
aboutstring | null
learningsstring | null
tagsstring | null
thumbnail_typeenum | null
imagevideoboth
thumbnail_imagestring | null
thumbnail_videostring | null
publicbooleanrequired
publishedboolean
open_to_contributorsbooleanrequired
idintegerrequired
org_idinteger
authorsAuthorWithRole[]required
Show child attributes
userUserReadrequired
Show child attributes
usernamestringrequired
first_namestringrequired
last_namestringrequired
emailstringrequired
avatar_imagestring | null
biostring | null
detailsDetails | null
profileProfile | null
extra_metadataExtra Metadata | null
idintegerrequired
user_uuidstringrequired
email_verifiedboolean
last_login_atstring | null
signup_methodstring | null
is_superadminboolean
authorshipResourceAuthorshipEnumrequired
CREATORCONTRIBUTORMAINTAINERREPORTER
authorship_statusResourceAuthorshipStatusEnumrequired
ACTIVEPENDINGINACTIVE
creation_datestringrequired
update_datestringrequired
course_uuidstringrequired
creation_datestringrequired
update_datestringrequired
seoSeo | null
extra_metadataExtra Metadata | null
Error responses
  • 403 User lacks permission to create courses in the organization
  • 404 Organization not found
  • 422 Invalid form data
Request
Response
{
  "name": "Example name",
  "description": "An example description",
  "about": "string",
  "learnings": "string",
  "tags": "string",
  "thumbnail_type": "image",
  "thumbnail_image": "string",
  "thumbnail_video": "string",
  "public": false,
  "published": false,
  "open_to_contributors": false,
  "id": 1,
  "org_id": 1,
  "authors": [
    {
      "user": {
        "username": "string",
        "first_name": "Example name",
        "last_name": "Example name",
        "email": "ada@example.com",
        "avatar_image": "string",
        "bio": "string",
        "details": {},
        "profile": {},
        "extra_metadata": {},
        "id": 1,
        "user_uuid": "string",
        "email_verified": false,
        "last_login_at": "string",
        "signup_method": "string",
        "is_superadmin": false
      },
      "authorship": "CREATOR",
      "authorship_status": "ACTIVE",
      "creation_date": "string",
      "update_date": "string"
    }
  ],
  "course_uuid": "string",
  "creation_date": "string",
  "update_date": "string",
  "seo": {},
  "extra_metadata": {}
}

Update course thumbnail

PUT/api/v1/courses/{course_uuid}/thumbnail
API tokencourses:updateor user session

Replace the thumbnail image or video for an existing course.

Path parameters

course_uuidstringrequired

Request bodymultipart/form-data

thumbnail_typeThumbnailType
imagevideoboth
thumbnailfile | null

Returns

CourseRead — Thumbnail updated successfully

namestringrequired
descriptionstring | null
aboutstring | null
learningsstring | null
tagsstring | null
thumbnail_typeenum | null
imagevideoboth
thumbnail_imagestring | null
thumbnail_videostring | null
publicbooleanrequired
publishedboolean
open_to_contributorsbooleanrequired
idintegerrequired
org_idinteger
authorsAuthorWithRole[]required
Show child attributes
userUserReadrequired
Show child attributes
usernamestringrequired
first_namestringrequired
last_namestringrequired
emailstringrequired
avatar_imagestring | null
biostring | null
detailsDetails | null
profileProfile | null
extra_metadataExtra Metadata | null
idintegerrequired
user_uuidstringrequired
email_verifiedboolean
last_login_atstring | null
signup_methodstring | null
is_superadminboolean
authorshipResourceAuthorshipEnumrequired
CREATORCONTRIBUTORMAINTAINERREPORTER
authorship_statusResourceAuthorshipStatusEnumrequired
ACTIVEPENDINGINACTIVE
creation_datestringrequired
update_datestringrequired
course_uuidstringrequired
creation_datestringrequired
update_datestringrequired
seoSeo | null
extra_metadataExtra Metadata | null
Error responses
  • 403 User lacks permission to update the course
  • 404 Course not found
  • 422 Invalid thumbnail file
Request
Response
{
  "name": "Example name",
  "description": "An example description",
  "about": "string",
  "learnings": "string",
  "tags": "string",
  "thumbnail_type": "image",
  "thumbnail_image": "string",
  "thumbnail_video": "string",
  "public": false,
  "published": false,
  "open_to_contributors": false,
  "id": 1,
  "org_id": 1,
  "authors": [
    {
      "user": {
        "username": "string",
        "first_name": "Example name",
        "last_name": "Example name",
        "email": "ada@example.com",
        "avatar_image": "string",
        "bio": "string",
        "details": {},
        "profile": {},
        "extra_metadata": {},
        "id": 1,
        "user_uuid": "string",
        "email_verified": false,
        "last_login_at": "string",
        "signup_method": "string",
        "is_superadmin": false
      },
      "authorship": "CREATOR",
      "authorship_status": "ACTIVE",
      "creation_date": "string",
      "update_date": "string"
    }
  ],
  "course_uuid": "string",
  "creation_date": "string",
  "update_date": "string",
  "seo": {},
  "extra_metadata": {}
}

Get course by UUID

GET/api/v1/courses/{course_uuid}
API tokencourses:reador user session

Retrieve a single course by its UUID.

Path parameters

course_uuidstringrequired

Returns

CourseRead — Course retrieved successfully

namestringrequired
descriptionstring | null
aboutstring | null
learningsstring | null
tagsstring | null
thumbnail_typeenum | null
imagevideoboth
thumbnail_imagestring | null
thumbnail_videostring | null
publicbooleanrequired
publishedboolean
open_to_contributorsbooleanrequired
idintegerrequired
org_idinteger
authorsAuthorWithRole[]required
Show child attributes
userUserReadrequired
Show child attributes
usernamestringrequired
first_namestringrequired
last_namestringrequired
emailstringrequired
avatar_imagestring | null
biostring | null
detailsDetails | null
profileProfile | null
extra_metadataExtra Metadata | null
idintegerrequired
user_uuidstringrequired
email_verifiedboolean
last_login_atstring | null
signup_methodstring | null
is_superadminboolean
authorshipResourceAuthorshipEnumrequired
CREATORCONTRIBUTORMAINTAINERREPORTER
authorship_statusResourceAuthorshipStatusEnumrequired
ACTIVEPENDINGINACTIVE
creation_datestringrequired
update_datestringrequired
course_uuidstringrequired
creation_datestringrequired
update_datestringrequired
seoSeo | null
extra_metadataExtra Metadata | null
Error responses
  • 403 User lacks read access to this course
  • 404 Course not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{
  "name": "Example name",
  "description": "An example description",
  "about": "string",
  "learnings": "string",
  "tags": "string",
  "thumbnail_type": "image",
  "thumbnail_image": "string",
  "thumbnail_video": "string",
  "public": false,
  "published": false,
  "open_to_contributors": false,
  "id": 1,
  "org_id": 1,
  "authors": [
    {
      "user": {
        "username": "string",
        "first_name": "Example name",
        "last_name": "Example name",
        "email": "ada@example.com",
        "avatar_image": "string",
        "bio": "string",
        "details": {},
        "profile": {},
        "extra_metadata": {},
        "id": 1,
        "user_uuid": "string",
        "email_verified": false,
        "last_login_at": "string",
        "signup_method": "string",
        "is_superadmin": false
      },
      "authorship": "CREATOR",
      "authorship_status": "ACTIVE",
      "creation_date": "string",
      "update_date": "string"
    }
  ],
  "course_uuid": "string",
  "creation_date": "string",
  "update_date": "string",
  "seo": {},
  "extra_metadata": {}
}

Update course

PUT/api/v1/courses/{course_uuid}
API tokencourses:updateor user session

Update course metadata (name, description, about, tags, visibility, etc.) by UUID.

Path parameters

course_uuidstringrequired

Request bodyapplication/jsonrequired

namestring | null
descriptionstring | null
aboutstring | null
learningsstring | null
tagsstring | null
thumbnail_typeenum | null
imagevideoboth
thumbnail_imagestring | null
thumbnail_videostring | null
publicboolean | null
publishedboolean | null
open_to_contributorsboolean | null
seoSeo | null
extra_metadataExtra Metadata | null

Returns

CourseRead — Course updated successfully

namestringrequired
descriptionstring | null
aboutstring | null
learningsstring | null
tagsstring | null
thumbnail_typeenum | null
imagevideoboth
thumbnail_imagestring | null
thumbnail_videostring | null
publicbooleanrequired
publishedboolean
open_to_contributorsbooleanrequired
idintegerrequired
org_idinteger
authorsAuthorWithRole[]required
Show child attributes
userUserReadrequired
Show child attributes
usernamestringrequired
first_namestringrequired
last_namestringrequired
emailstringrequired
avatar_imagestring | null
biostring | null
detailsDetails | null
profileProfile | null
extra_metadataExtra Metadata | null
idintegerrequired
user_uuidstringrequired
email_verifiedboolean
last_login_atstring | null
signup_methodstring | null
is_superadminboolean
authorshipResourceAuthorshipEnumrequired
CREATORCONTRIBUTORMAINTAINERREPORTER
authorship_statusResourceAuthorshipStatusEnumrequired
ACTIVEPENDINGINACTIVE
creation_datestringrequired
update_datestringrequired
course_uuidstringrequired
creation_datestringrequired
update_datestringrequired
seoSeo | null
extra_metadataExtra Metadata | null
Error responses
  • 403 User lacks permission to update the course
  • 404 Course not found
  • 422 Invalid update payload
Request
Response
{
  "name": "Example name",
  "description": "An example description",
  "about": "string",
  "learnings": "string",
  "tags": "string",
  "thumbnail_type": "image",
  "thumbnail_image": "string",
  "thumbnail_video": "string",
  "public": false,
  "published": false,
  "open_to_contributors": false,
  "id": 1,
  "org_id": 1,
  "authors": [
    {
      "user": {
        "username": "string",
        "first_name": "Example name",
        "last_name": "Example name",
        "email": "ada@example.com",
        "avatar_image": "string",
        "bio": "string",
        "details": {},
        "profile": {},
        "extra_metadata": {},
        "id": 1,
        "user_uuid": "string",
        "email_verified": false,
        "last_login_at": "string",
        "signup_method": "string",
        "is_superadmin": false
      },
      "authorship": "CREATOR",
      "authorship_status": "ACTIVE",
      "creation_date": "string",
      "update_date": "string"
    }
  ],
  "course_uuid": "string",
  "creation_date": "string",
  "update_date": "string",
  "seo": {},
  "extra_metadata": {}
}

Delete course

DELETE/api/v1/courses/{course_uuid}
API tokencourses:deleteor user session

Permanently delete a course and all of its content by UUID.

Path parameters

course_uuidstringrequired
Error responses
  • 403 User lacks permission to delete the course
  • 404 Course not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

Get course by ID

GET/api/v1/courses/id/{course_id}
API tokencourses:reador user session

Retrieve a single course by its numeric database ID.

Path parameters

course_idintegerrequired

Returns

CourseRead — Course retrieved successfully

namestringrequired
descriptionstring | null
aboutstring | null
learningsstring | null
tagsstring | null
thumbnail_typeenum | null
imagevideoboth
thumbnail_imagestring | null
thumbnail_videostring | null
publicbooleanrequired
publishedboolean
open_to_contributorsbooleanrequired
idintegerrequired
org_idinteger
authorsAuthorWithRole[]required
Show child attributes
userUserReadrequired
Show child attributes
usernamestringrequired
first_namestringrequired
last_namestringrequired
emailstringrequired
avatar_imagestring | null
biostring | null
detailsDetails | null
profileProfile | null
extra_metadataExtra Metadata | null
idintegerrequired
user_uuidstringrequired
email_verifiedboolean
last_login_atstring | null
signup_methodstring | null
is_superadminboolean
authorshipResourceAuthorshipEnumrequired
CREATORCONTRIBUTORMAINTAINERREPORTER
authorship_statusResourceAuthorshipStatusEnumrequired
ACTIVEPENDINGINACTIVE
creation_datestringrequired
update_datestringrequired
course_uuidstringrequired
creation_datestringrequired
update_datestringrequired
seoSeo | null
extra_metadataExtra Metadata | null
Error responses
  • 403 User lacks read access to this course
  • 404 Course not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{
  "name": "Example name",
  "description": "An example description",
  "about": "string",
  "learnings": "string",
  "tags": "string",
  "thumbnail_type": "image",
  "thumbnail_image": "string",
  "thumbnail_video": "string",
  "public": false,
  "published": false,
  "open_to_contributors": false,
  "id": 1,
  "org_id": 1,
  "authors": [
    {
      "user": {
        "username": "string",
        "first_name": "Example name",
        "last_name": "Example name",
        "email": "ada@example.com",
        "avatar_image": "string",
        "bio": "string",
        "details": {},
        "profile": {},
        "extra_metadata": {},
        "id": 1,
        "user_uuid": "string",
        "email_verified": false,
        "last_login_at": "string",
        "signup_method": "string",
        "is_superadmin": false
      },
      "authorship": "CREATOR",
      "authorship_status": "ACTIVE",
      "creation_date": "string",
      "update_date": "string"
    }
  ],
  "course_uuid": "string",
  "creation_date": "string",
  "update_date": "string",
  "seo": {},
  "extra_metadata": {}
}

Get course metadata

GET/api/v1/courses/{course_uuid}/meta
API tokencourses:reador user session

Retrieve full course metadata including chapters and activities. Use slim=true to exclude heavy activity content/details, useful for navigation menus.

Path parameters

course_uuidstringrequired

Query parameters

with_unpublished_activitiesboolean
slimboolean

Returns

FullCourseRead — Course metadata retrieved successfully

namestringrequired
descriptionstring | null
aboutstring | null
learningsstring | null
tagsstring | null
thumbnail_typeenum | null
imagevideoboth
thumbnail_imagestring | null
thumbnail_videostring | null
publicbooleanrequired
publishedboolean
open_to_contributorsbooleanrequired
idintegerrequired
org_idintegerrequired
org_uuidstring | null
course_uuidstring | null
creation_datestring | null
update_datestring | null
seoSeo | null
extra_metadataExtra Metadata | null
chaptersChapterRead[]required
Show child attributes
namestringrequired
descriptionstring | null
thumbnail_imagestring | null
lock_typeLockType
publicauthenticatedrestricted
org_idintegerrequired
course_idintegerrequired
idintegerrequired
activitiesActivityRead[]required
Show child attributes
namestringrequired
activity_typeActivityTypeEnumrequired
TYPE_VIDEOTYPE_DOCUMENTTYPE_DYNAMICTYPE_ASSIGNMENTTYPE_CUSTOMTYPE_SCORM
activity_sub_typeActivitySubTypeEnumrequired
SUBTYPE_DYNAMIC_PAGESUBTYPE_DYNAMIC_MARKDOWNSUBTYPE_DYNAMIC_EMBEDSUBTYPE_DYNAMIC_RESOURCESUBTYPE_VIDEO_YOUTUBESUBTYPE_VIDEO_HOSTEDSUBTYPE_DOCUMENT_PDFSUBTYPE_DOCUMENT_DOCSUBTYPE_ASSIGNMENT_ANYSUBTYPE_CUSTOMSUBTYPE_SCORM_12SUBTYPE_SCORM_2004
contentContent
detailsDetails | null
publishedboolean
lock_typeActivityLockType
publicauthenticatedrestricted
idintegerrequired
org_idintegerrequired
course_idintegerrequired
activity_uuidstringrequired
creation_datestringrequired
update_datestringrequired
extra_metadataExtra Metadata | null
current_versioninteger
last_modified_by_idinteger | null
last_modified_by_usernamestring | null
is_lockedboolean
chapter_uuidstringrequired
creation_datestringrequired
update_datestringrequired
extra_metadataExtra Metadata | null
is_lockedboolean
authorsAuthorWithRole[]required
Show child attributes
userUserReadrequired
Show child attributes
usernamestringrequired
first_namestringrequired
last_namestringrequired
emailstringrequired
avatar_imagestring | null
biostring | null
detailsDetails | null
profileProfile | null
extra_metadataExtra Metadata | null
idintegerrequired
user_uuidstringrequired
email_verifiedboolean
last_login_atstring | null
signup_methodstring | null
is_superadminboolean
authorshipResourceAuthorshipEnumrequired
CREATORCONTRIBUTORMAINTAINERREPORTER
authorship_statusResourceAuthorshipStatusEnumrequired
ACTIVEPENDINGINACTIVE
creation_datestringrequired
update_datestringrequired
Error responses
  • 403 User lacks read access to this course
  • 404 Course not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{
  "name": "Example name",
  "description": "An example description",
  "about": "string",
  "learnings": "string",
  "tags": "string",
  "thumbnail_type": "image",
  "thumbnail_image": "string",
  "thumbnail_video": "string",
  "public": false,
  "published": false,
  "open_to_contributors": false,
  "id": 1,
  "org_id": 1,
  "org_uuid": "string",
  "course_uuid": "string",
  "creation_date": "string",
  "update_date": "string",
  "seo": {},
  "extra_metadata": {},
  "chapters": [
    {
      "name": "Example name",
      "description": "An example description",
      "thumbnail_image": "string",
      "lock_type": "public",
      "org_id": 1,
      "course_id": 1,
      "id": 1,
      "activities": [
        {
          "name": "Example name",
          "activity_type": "TYPE_VIDEO",
          "activity_sub_type": "SUBTYPE_DYNAMIC_PAGE",
          "content": {},
          "details": {},
          "published": false,
          "lock_type": "public",
          "id": 1,
          "org_id": 1,
          "course_id": 1,
          "activity_uuid": "string",
          "creation_date": "string",
          "update_date": "string",
          "extra_metadata": {},
          "current_version": 1,
          "last_modified_by_id": 1,
          "last_modified_by_username": "string",
          "is_locked": false
        }
      ],
      "chapter_uuid": "string",
      "creation_date": "string",
      "update_date": "string",
      "extra_metadata": {},
      "is_locked": false
    }
  ],
  "authors": [
    {
      "user": {
        "username": "string",
        "first_name": "Example name",
        "last_name": "Example name",
        "email": "ada@example.com",
        "avatar_image": "string",
        "bio": "string",
        "details": {},
        "profile": {},
        "extra_metadata": {},
        "id": 1,
        "user_uuid": "string",
        "email_verified": false,
        "last_login_at": "string",
        "signup_method": "string",
        "is_superadmin": false
      },
      "authorship": "CREATOR",
      "authorship_status": "ACTIVE",
      "creation_date": "string",
      "update_date": "string"
    }
  ]
}

List courses for an organization

GET/api/v1/courses/org_slug/{org_slug}/page/{page}/limit/{limit}
API tokencourses:reador user session

Paginated list of courses for an organization identified by slug. Set include_unpublished=true to include unpublished courses (requires update permission on the organization).

Path parameters

pageintegerrequired
limitintegerrequired
org_slugstringrequired

Query parameters

include_unpublishedboolean

Returns

CourseRead[] — Paginated list of courses

namestringrequired
descriptionstring | null
aboutstring | null
learningsstring | null
tagsstring | null
thumbnail_typeenum | null
imagevideoboth
thumbnail_imagestring | null
thumbnail_videostring | null
publicbooleanrequired
publishedboolean
open_to_contributorsbooleanrequired
idintegerrequired
org_idinteger
authorsAuthorWithRole[]required
Show child attributes
userUserReadrequired
Show child attributes
usernamestringrequired
first_namestringrequired
last_namestringrequired
emailstringrequired
avatar_imagestring | null
biostring | null
detailsDetails | null
profileProfile | null
extra_metadataExtra Metadata | null
idintegerrequired
user_uuidstringrequired
email_verifiedboolean
last_login_atstring | null
signup_methodstring | null
is_superadminboolean
authorshipResourceAuthorshipEnumrequired
CREATORCONTRIBUTORMAINTAINERREPORTER
authorship_statusResourceAuthorshipStatusEnumrequired
ACTIVEPENDINGINACTIVE
creation_datestringrequired
update_datestringrequired
course_uuidstringrequired
creation_datestringrequired
update_datestringrequired
seoSeo | null
extra_metadataExtra Metadata | null
Error responses
  • 403 User lacks permission to list unpublished courses
  • 404 Organization not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
[
  {
    "name": "Example name",
    "description": "An example description",
    "about": "string",
    "learnings": "string",
    "tags": "string",
    "thumbnail_type": "image",
    "thumbnail_image": "string",
    "thumbnail_video": "string",
    "public": false,
    "published": false,
    "open_to_contributors": false,
    "id": 1,
    "org_id": 1,
    "authors": [
      {
        "user": {
          "username": "string",
          "first_name": "Example name",
          "last_name": "Example name",
          "email": "ada@example.com",
          "avatar_image": "string",
          "bio": "string",
          "details": {},
          "profile": {},
          "extra_metadata": {},
          "id": 1,
          "user_uuid": "string",
          "email_verified": false,
          "last_login_at": "string",
          "signup_method": "string",
          "is_superadmin": false
        },
        "authorship": "CREATOR",
        "authorship_status": "ACTIVE",
        "creation_date": "string",
        "update_date": "string"
      }
    ],
    "course_uuid": "string",
    "creation_date": "string",
    "update_date": "string",
    "seo": {},
    "extra_metadata": {}
  }
]

Count courses in an organization

GET/api/v1/courses/org_slug/{org_slug}/count
API tokencourses:reador user session

Return the total number of courses for the organization identified by slug.

Path parameters

org_slugstringrequired
Error responses
  • 404 Organization not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
0
GET/api/v1/courses/org_slug/{org_slug}/search
API tokencourses:reador user session

Full-text search courses by title and description within an organization. Query length is capped at 200 characters and results are paginated with a maximum page size of 50 to prevent data dumping.

Path parameters

org_slugstringrequired

Query parameters

querystringrequired

Search query

pageinteger

Page number

limitinteger

Items per page (max 50)

Returns

CourseRead[] — Paginated list of matching courses

namestringrequired
descriptionstring | null
aboutstring | null
learningsstring | null
tagsstring | null
thumbnail_typeenum | null
imagevideoboth
thumbnail_imagestring | null
thumbnail_videostring | null
publicbooleanrequired
publishedboolean
open_to_contributorsbooleanrequired
idintegerrequired
org_idinteger
authorsAuthorWithRole[]required
Show child attributes
userUserReadrequired
Show child attributes
usernamestringrequired
first_namestringrequired
last_namestringrequired
emailstringrequired
avatar_imagestring | null
biostring | null
detailsDetails | null
profileProfile | null
extra_metadataExtra Metadata | null
idintegerrequired
user_uuidstringrequired
email_verifiedboolean
last_login_atstring | null
signup_methodstring | null
is_superadminboolean
authorshipResourceAuthorshipEnumrequired
CREATORCONTRIBUTORMAINTAINERREPORTER
authorship_statusResourceAuthorshipStatusEnumrequired
ACTIVEPENDINGINACTIVE
creation_datestringrequired
update_datestringrequired
course_uuidstringrequired
creation_datestringrequired
update_datestringrequired
seoSeo | null
extra_metadataExtra Metadata | null
Error responses
  • 404 Organization not found
  • 422 Invalid query or pagination parameters
Request
Response
[
  {
    "name": "Example name",
    "description": "An example description",
    "about": "string",
    "learnings": "string",
    "tags": "string",
    "thumbnail_type": "image",
    "thumbnail_image": "string",
    "thumbnail_video": "string",
    "public": false,
    "published": false,
    "open_to_contributors": false,
    "id": 1,
    "org_id": 1,
    "authors": [
      {
        "user": {
          "username": "string",
          "first_name": "Example name",
          "last_name": "Example name",
          "email": "ada@example.com",
          "avatar_image": "string",
          "bio": "string",
          "details": {},
          "profile": {},
          "extra_metadata": {},
          "id": 1,
          "user_uuid": "string",
          "email_verified": false,
          "last_login_at": "string",
          "signup_method": "string",
          "is_superadmin": false
        },
        "authorship": "CREATOR",
        "authorship_status": "ACTIVE",
        "creation_date": "string",
        "update_date": "string"
      }
    ],
    "course_uuid": "string",
    "creation_date": "string",
    "update_date": "string",
    "seo": {},
    "extra_metadata": {}
  }
]

Clone course

POST/api/v1/courses/{course_uuid}/clone
API tokencourses:createor user session

Create a complete copy of a course including chapters, activities, blocks and all associated files. The cloned course gets a new UUID, is set to private by default, and has the current user as the creator.

Path parameters

course_uuidstringrequired

Returns

CourseRead — Cloned course

namestringrequired
descriptionstring | null
aboutstring | null
learningsstring | null
tagsstring | null
thumbnail_typeenum | null
imagevideoboth
thumbnail_imagestring | null
thumbnail_videostring | null
publicbooleanrequired
publishedboolean
open_to_contributorsbooleanrequired
idintegerrequired
org_idinteger
authorsAuthorWithRole[]required
Show child attributes
userUserReadrequired
Show child attributes
usernamestringrequired
first_namestringrequired
last_namestringrequired
emailstringrequired
avatar_imagestring | null
biostring | null
detailsDetails | null
profileProfile | null
extra_metadataExtra Metadata | null
idintegerrequired
user_uuidstringrequired
email_verifiedboolean
last_login_atstring | null
signup_methodstring | null
is_superadminboolean
authorshipResourceAuthorshipEnumrequired
CREATORCONTRIBUTORMAINTAINERREPORTER
authorship_statusResourceAuthorshipStatusEnumrequired
ACTIVEPENDINGINACTIVE
creation_datestringrequired
update_datestringrequired
course_uuidstringrequired
creation_datestringrequired
update_datestringrequired
seoSeo | null
extra_metadataExtra Metadata | null
Error responses
  • 403 User lacks read access to the source course or cannot create courses
  • 404 Source course not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{
  "name": "Example name",
  "description": "An example description",
  "about": "string",
  "learnings": "string",
  "tags": "string",
  "thumbnail_type": "image",
  "thumbnail_image": "string",
  "thumbnail_video": "string",
  "public": false,
  "published": false,
  "open_to_contributors": false,
  "id": 1,
  "org_id": 1,
  "authors": [
    {
      "user": {
        "username": "string",
        "first_name": "Example name",
        "last_name": "Example name",
        "email": "ada@example.com",
        "avatar_image": "string",
        "bio": "string",
        "details": {},
        "profile": {},
        "extra_metadata": {},
        "id": 1,
        "user_uuid": "string",
        "email_verified": false,
        "last_login_at": "string",
        "signup_method": "string",
        "is_superadmin": false
      },
      "authorship": "CREATOR",
      "authorship_status": "ACTIVE",
      "creation_date": "string",
      "update_date": "string"
    }
  ],
  "course_uuid": "string",
  "creation_date": "string",
  "update_date": "string",
  "seo": {},
  "extra_metadata": {}
}

Export course as ZIP

GET/api/v1/courses/{course_uuid}/export
API tokencourses:reador user session

Export a single course and all its content (chapters, activities, blocks, and files) as a ZIP archive following the LearnHouse export format.

Path parameters

course_uuidstringrequired
Error responses
  • 403 User lacks read access to the course
  • 404 Course not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

Apply as course contributor

POST/api/v1/courses/{course_uuid}/apply-contributor
API tokencourses:createor user session

Submit an application for the current user to become a contributor on the given course.

Path parameters

course_uuidstringrequired
Error responses
  • 403 Course is not open to contributors
  • 404 Course not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

List course updates

GET/api/v1/courses/{course_uuid}/updates
API tokencourses:reador user session

Return all course update posts for a given course.

Path parameters

course_uuidstringrequired

Returns

CourseUpdateRead[] — List of course update posts

idintegerrequired
titlestringrequired
contentstringrequired
course_idintegerrequired
courseupdate_uuidstringrequired
linked_activity_uuidsstring | null
org_idintegerrequired
creation_datestringrequired
update_datestringrequired
Error responses
  • 403 User lacks read access to the course
  • 404 Course not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
[
  {
    "id": 1,
    "title": "Example title",
    "content": "string",
    "course_id": 1,
    "courseupdate_uuid": "string",
    "linked_activity_uuids": "string",
    "org_id": 1,
    "creation_date": "string",
    "update_date": "string"
  }
]

Create course update

POST/api/v1/courses/{course_uuid}/updates
API tokencourses:createor user session

Create a new course update post associated with the given course.

Path parameters

course_uuidstringrequired

Request bodyapplication/jsonrequired

titlestringrequired
contentstringrequired
linked_activity_uuidsstring | null
org_idintegerrequired

Returns

CourseUpdateRead — Course update created

idintegerrequired
titlestringrequired
contentstringrequired
course_idintegerrequired
courseupdate_uuidstringrequired
linked_activity_uuidsstring | null
org_idintegerrequired
creation_datestringrequired
update_datestringrequired
Error responses
  • 403 User lacks permission to create updates for this course
  • 404 Course not found
  • 422 Invalid update payload
Request
Response
{
  "id": 1,
  "title": "Example title",
  "content": "string",
  "course_id": 1,
  "courseupdate_uuid": "string",
  "linked_activity_uuids": "string",
  "org_id": 1,
  "creation_date": "string",
  "update_date": "string"
}

Update course update

PUT/api/v1/courses/{course_uuid}/update/{courseupdate_uuid}
API tokencourses:updateor user session

Edit an existing course update post identified by its UUID.

Path parameters

course_uuidstringrequired
courseupdate_uuidstringrequired

Request bodyapplication/jsonrequired

titlestring | null
contentstring | null
linked_activity_uuidsstring | null

Returns

CourseUpdateRead — Course update modified

idintegerrequired
titlestringrequired
contentstringrequired
course_idintegerrequired
courseupdate_uuidstringrequired
linked_activity_uuidsstring | null
org_idintegerrequired
creation_datestringrequired
update_datestringrequired
Error responses
  • 403 User lacks permission to modify updates on this course
  • 404 Course or course update not found
  • 422 Invalid update payload
Request
Response
{
  "id": 1,
  "title": "Example title",
  "content": "string",
  "course_id": 1,
  "courseupdate_uuid": "string",
  "linked_activity_uuids": "string",
  "org_id": 1,
  "creation_date": "string",
  "update_date": "string"
}

Delete course update

DELETE/api/v1/courses/{course_uuid}/update/{courseupdate_uuid}
API tokencourses:deleteor user session

Delete a course update post by its UUID.

Path parameters

course_uuidstringrequired
courseupdate_uuidstringrequired
Error responses
  • 403 User lacks permission to delete updates on this course
  • 404 Course or course update not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

List course contributors

GET/api/v1/courses/{course_uuid}/contributors
API tokencourses:reador user session

Return all contributors attached to a given course along with their authorship role and status.

Path parameters

course_uuidstringrequired
Error responses
  • 403 User lacks permission to view contributors
  • 404 Course not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

Update course contributor

PUT/api/v1/courses/{course_uuid}/contributors/{contributor_user_id}
API tokencourses:updateor user session

Update a course contributor's authorship role and status. Only course administrators or maintainers can perform this action.

Path parameters

course_uuidstringrequired
contributor_user_idintegerrequired

Query parameters

authorshipResourceAuthorshipEnumrequired
CREATORCONTRIBUTORMAINTAINERREPORTER
authorship_statusResourceAuthorshipStatusEnumrequired
ACTIVEPENDINGINACTIVE
Error responses
  • 403 User lacks permission to manage contributors
  • 404 Course or contributor not found
  • 422 Invalid authorship or status value
Request

Bulk add course contributors

POST/api/v1/courses/{course_uuid}/bulk-add-contributors
API tokencourses:createor user session

Add multiple contributors to a course by their usernames in a single call. Only course administrators can perform this action.

Path parameters

course_uuidstringrequired

Request bodyapplication/jsonrequired

Error responses
  • 403 User lacks permission to manage contributors
  • 404 Course or one of the specified users not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

Bulk remove course contributors

PUT/api/v1/courses/{course_uuid}/bulk-remove-contributors
API tokencourses:updateor user session

Remove multiple contributors from a course by their usernames in a single call.

Path parameters

course_uuidstringrequired

Request bodyapplication/jsonrequired

Error responses
  • 403 User lacks permission to manage contributors
  • 404 Course or one of the specified users not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

Get course user rights

GET/api/v1/courses/{course_uuid}/rights
API tokencourses:reador user session

Return the current user's detailed rights on a course (permissions, ownership, roles). Intended for UI-level feature gating; anonymous users only see rights for public courses.

Path parameters

course_uuidstringrequired
Error responses
  • 404 Course not found
  • 422 Validation ErrorHTTPValidationError
Request
Response
{}