Skip to main content
https://.thoughtindustries.com

Update Courses

Updates existing course content. Supports partial updates — only provided fields are updated. Can also create new sections, lessons, topics, or course groups by omitting the `id` field. The update endpoint accepts up to 100 total items across all entity types combined.

Updates existing course content. Supports partial updates - only provided fields are updated. Can also create new sections, lessons, topics, or course groups by omitting the id field.

The update endpoint accepts up to 100 total items across all entity types combined.

Authentication & Permissions

Authenticate with Authorization: Bearer YOUR_API_KEY. This endpoint requires the courses.edit permission. This route is not rate limited.

Update Course Attributes

PropertyTypeRequired?Description
sectionsarraynoArray of section updates
courseGroupsarraynoArray of course group updates
coursesarraynoArray of course updates
lessonsarraynoArray of lesson updates
topicsarraynoArray of topic updates

Update Section Object

PropertyTypeRequired?Description
idUUIDnoSection ID (omit to create new section)
courseIdUUIDif creatingRequired when creating new section
titlestringnoSection title
releaseDatedatenoWhen section is released
displayOrderintegernoDisplay order in course

Update Course Group Object

PropertyTypeRequired?Description
idUUIDnoCourse group ID (omit to create new)
titlestringnoCourse group title
slugstringnoURL slug
descriptionstringnoCourse description (max 5,000 characters). Pass null to clear; omit to leave unchanged
tagIdsarraynoTag UUIDs (max 10). Replaces the entire array; pass null or [] to clear
customFieldsJSONnoCustom field values. Replaces the entire object; pass null or {} to clear
assetURLnoCatalog image URL. Pass null to clear
assetAltTextstringnoCatalog image alt text
detailAssetURLnoDetail page image URL. Pass null to clear
detailAssetAltTextstringnoDetail image alt text
ribbonstringnoRibbon badge slug. Pass null to clear
metaTitlestringnoSEO meta title (max 200 characters)
metaDescriptionstringnoSEO meta description (max 500 characters)
archivedbooleannoArchive status (update only — cannot be set on create)
relatedCourseGroupIdsarraynoRelated course group UUIDs. Replaces the entire array

Update Course Object

PropertyTypeRequired?Description
idUUIDnoCourse ID (omit to create new course)
courseGroupIdUUIDif creatingRequired when creating new course
titlestringnoCourse title
kindstringnoCourse kind
priceInCentsintegernoPrice in cents (max 99,999,999)
freeWithRegistrationbooleannoFree for registered users
purchasablebooleannoEnable purchasing
statusstringnoCourse status: draft, published, archived
customFieldsJSONnoSession custom fields. Replaces the entire object
forceLinearProgressbooleannoRequire sequential page completion
showProgressbooleannoShow progress indicator
prerequisiteCourseIdsarraynoPrerequisite course UUIDs
prerequisiteLearningPathIdsarraynoPrerequisite learning path UUIDs

Update Lesson Object

PropertyTypeRequired?Description
idUUIDnoLesson ID (omit to create new lesson)
sectionIdUUIDif creatingRequired when creating new lesson
titlestringnoLesson title
openTypestringnoAccess level: studentsOnly, open, emailCaptureOpen

Update Topic Object

PropertyTypeRequired?Description
idUUIDyes/noTopic ID (required for update, omit for create)
lessonIdUUIDif creatingRequired when creating new topic
titlestringnoTopic title
typestringif creatingTopic type (required when creating)
bodystringnoHTML content
languagesarraynoMulti-language variants
preTextBlockstringnoPre-content text
postTextBlockstringnoPost-content text
widthintegernoDisplay width (pixels)
heightintegernoDisplay height (pixels)
embeddedEnabledbooleannoEnable embedded display
fullscreenEmbedbooleannoEnable fullscreen embed
preventProgressionbooleannoPrevent progression until complete
resetSessionAfterCompletebooleannoReset session after completion
captionstringnoCaption text
searchDisabledbooleannoExclude from search
printDisabledbooleannoDisable printing
fileDownloadDisabledbooleannoDisable file download
scormUrlURLnoURL to SCORM/xAPI package
scoTitlestringnoSCORM title
objectTypestringnoSCORM standard type
restartProgressbooleannoRestart user progress when replacing SCORM
pdfUrlURLnoURL to PDF file
videoUrlURLnoExternal URL to a video file (for video type) — uploaded to Wistia by a background job
videoAssetIDnoExisting Wistia media ID or Synthesia UUID. Mutually exclusive with videoUrl
assetTypestringnoVideo provider: wistia (default) or synthesia
preAssetIDnoWistia media ID for pre-roll video
postAssetIDnoWistia media ID for post-roll video
posterImageAssetURLnoPoster image URL displayed before the video plays
audioUrlURLnoComing soon - URL to audio file
PUT https://example.thoughtindustries.com/incoming/v2/content/course/update

Example request - Update Course Group Title

curl -X "PUT" "https://example.thoughtindustries.com/incoming/v2/content/course/update" \
     -H 'Authorization: Bearer YOUR_API_KEY' \
     -H 'Content-Type: application/json' \
     -d '{
  "courseAttributes": {
    "courseGroups": [
      {
        "id": "1e7a0ab5-9e13-44d5-90bf-e7c61e7448f8",
        "title": "Updated Course Title"
      }
    ]
  }
}'

Example response

true

Example request - Update Topic Content

curl -X "PUT" "https://example.thoughtindustries.com/incoming/v2/content/course/update" \
     -H 'Authorization: Bearer YOUR_API_KEY' \
     -H 'Content-Type: application/json' \
     -d '{
  "courseAttributes": {
    "topics": [
      {
        "id": "1366501c-3740-4a30-9464-1a2f111499ee",
        "body": "<p>Updated content here</p>"
      }
    ]
  }
}'

Example request - Add New Section to Existing Course

curl -X "PUT" "https://example.thoughtindustries.com/incoming/v2/content/course/update" \
     -H 'Authorization: Bearer YOUR_API_KEY' \
     -H 'Content-Type: application/json' \
     -d '{
  "courseAttributes": {
    "sections": [
      {
        "courseId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "title": "New Section",
        "displayOrder": 3
      }
    ]
  }
}'

Example request - Upload SCORM to Existing Topic

curl -X "PUT" "https://example.thoughtindustries.com/incoming/v2/content/course/update" \
     -H 'Authorization: Bearer YOUR_API_KEY' \
     -H 'Content-Type: application/json' \
     -d '{
  "courseAttributes": {
    "topics": [
      {
        "id": "fdbec9af-e134-4c42-81c4-05a056dd40ca",
        "scormUrl": "https://example.com/scorm-packages/updated-module.zip",
        "restartProgress": true
      }
    ]
  }
}'

Example response - SCORM Update with Background Job

{
  "success": true,
  "backgroundJob": {
    "id": "job-uuid-here",
    "type": "contentBulkUpload",
    "status": "queued",
    "contentUploads": [
      {
        "topicId": "fdbec9af-e134-4c42-81c4-05a056dd40ca",
        "contentType": "scorm"
      }
    ]
  }
}

Example request - Add PDF Topic to Existing Lesson

curl -X "PUT" "https://example.thoughtindustries.com/incoming/v2/content/course/update" \
     -H 'Authorization: Bearer YOUR_API_KEY' \
     -H 'Content-Type: application/json' \
     -d '{
  "courseAttributes": {
    "topics": [
      {
        "lessonId": "93e6076b-ba84-4012-84ff-73c0367006e0",
        "title": "Course Materials PDF",
        "type": "pdfViewer",
        "pdfUrl": "https://example.com/materials/course-materials.pdf"
      }
    ]
  }
}'

Errors

Validation failures return HTTP 400 with an errors array. If a topic id does not belong to your company, the response reports Topics not found: <ids>.

{
  "errors": [
    "Topics not found: 1366501c-3740-4a30-9464-1a2f111499ee"
  ]
}