SkillhabitDocs

Event Catalog

Webhook eventType values, when they fire, and the full data object for each delivery.

What This Is For

This page lists every eventType Skillhabit puts on webhook deliveries, plus the full JSON data object for that event. In Configure you pick categories (Course, Progress, Meetup, …); each delivery still carries one of these precise names in the body and in the Event-Type header.

Subscribe to a category to receive the matching events below. Envelope and headers: Delivery Envelope.

Timestamps in data are epoch milliseconds (UTC) unless noted. Treat unknown fields conservatively: ignore what you do not need.

Who This Is For

Developers mapping Skillhabit events into CRM, HR, chat, or warehouse pipelines.


Course Content

Subscribe with category Course.

course.created

Fires when course content is published / created for delivery.

FieldTypeDescription
courseIdstringCourse id
namestringCourse title
revisionNumbernumberPublished revision
lastUpdatedAtnumberLast update time
lastUpdatedBystringUser id of the last updater
pricenumber | nullOptional price (may be omitted or null)
{
  "courseId": "course-1",
  "name": "Fire safety",
  "revisionNumber": 1,
  "lastUpdatedAt": 1717200000000,
  "lastUpdatedBy": "user-admin",
  "price": null
}

course.updated

Fires when published course content is updated.

FieldTypeDescription
courseIdstringCourse id
namestringCourse title
descriptionstringCourse description
revisionNumbernumberPublished revision
lastUpdatedAtnumberLast update time
lastUpdatedBystringUser id of the last updater
pricenumber | nullOptional price (may be omitted or null)
{
  "courseId": "course-1",
  "name": "Fire safety",
  "description": "Annual mandatory training",
  "revisionNumber": 2,
  "lastUpdatedAt": 1717203600000,
  "lastUpdatedBy": "user-admin",
  "price": null
}

course.info_updated

Fires when course info metadata is updated.

FieldTypeDescription
courseIdstringCourse id
namestringCourse title
descriptionstringCourse description
backgroundImageUrlstringBackground image URL
lastUpdatedAtnumberLast update time
lastUpdatedBystringUser id of the last updater
pricenumber | nullOptional price
sellablebooleanWhether the course is sellable
softCorrectionbooleanSoft-correction setting
estimatedCompletionTimeInMinutesnumber | nullEstimated completion time
authorIdsstring[]Author user ids
{
  "courseId": "course-1",
  "name": "Fire safety",
  "description": "Annual mandatory training",
  "backgroundImageUrl": "https://example.com/fire.jpg",
  "lastUpdatedAt": 1717207200000,
  "lastUpdatedBy": "user-admin",
  "price": null,
  "sellable": true,
  "softCorrection": false,
  "estimatedCompletionTimeInMinutes": 45,
  "authorIds": ["user-author"]
}

course.deleted

Fires when course content is deleted.

FieldTypeDescription
courseIdstringDeleted course id
{
  "courseId": "course-1"
}

Progress

Subscribe with category Progress. This category covers invites, built-in course progress, Imported Package progress, program progress, and certificates—even when separate SCORM / Program chips in Configure are disabled.

progress.invited.user

Fires when a user is invited / assigned content (personal visibility).

FieldTypeDescription
userIdstringInvited user id
contentIdstringContent id
contentTypestringContent type (for example COURSE, SCORM, PROGRAM)
contentNamestringContent title (may be empty)
createdAtnumberInvitation time
{
  "userId": "user-1",
  "contentId": "course-1",
  "contentType": "COURSE",
  "contentName": "Fire safety",
  "createdAt": 1717210000000
}

progress.course.started

Fires when a built-in course participation starts.

FieldTypeDescription
userIdstringLearner user id
contentIdstringCourse id
{
  "userId": "user-1",
  "contentId": "course-1"
}

progress.course.canceled

Fires when a course participation is canceled.

FieldTypeDescription
userIdstringLearner user id
contentIdstringCourse id
{
  "userId": "user-1",
  "contentId": "course-1"
}

progress.course.completed

Fires when a course participation completes.

FieldTypeDescription
userIdstringLearner user id
contentIdstringCourse id
{
  "userId": "user-1",
  "contentId": "course-1"
}

progress.course.evaluated

Fires when a course participation is evaluated (approved / not approved).

FieldTypeDescription
userIdstringLearner user id
contentIdstringCourse id
approvedbooleanEvaluation result
{
  "userId": "user-1",
  "contentId": "course-1",
  "approved": true
}

progress.scorm.started

Fires when an Imported Package participation starts. The event name keeps scorm for compatibility; it covers SCORM, Tin Can / xAPI, and cmi5 packages.

FieldTypeDescription
userIdstringLearner user id
contentIdstringImported Package content id
{
  "userId": "user-1",
  "contentId": "package-1"
}

progress.scorm.evaluated

Fires when an Imported Package participation is evaluated (approved or failed). Same eventType for both outcomes—use approved.

FieldTypeDescription
userIdstringLearner user id
contentIdstringImported Package content id
participationIdstringParticipation id
createdAtnumberEvaluation time
approvedbooleantrue if approved, false if failed
{
  "userId": "user-1",
  "contentId": "package-1",
  "participationId": "part-1",
  "createdAt": 1717213600000,
  "approved": true
}

progress.program.started

Fires when a program participation starts.

FieldTypeDescription
userIdstringLearner user id
contentIdstringProgram id
{
  "userId": "user-1",
  "contentId": "program-1"
}

progress.program.completed

Fires when a program participation completes.

FieldTypeDescription
userIdstringLearner user id
contentIdstringProgram id
{
  "userId": "user-1",
  "contentId": "program-1"
}

progress.certificate

Fires when a certificate is issued (including re-issued certificates).

FieldTypeDescription
userIdstringCertificate holder user id
certificatesarrayOne or more certificate objects (see below)

Each item in certificates:

FieldTypeDescription
certificateIdstringCertificate id
userIdstringHolder user id
issuednumberIssue time
expiresAtnumber | nullExpiry time, if any
pdfUristringPDF download URI
contentIdstringRelated content id
contentNamestringRelated content title
contentTypestringRelated content type (for example COURSE)
participationIdstringRelated participation id
{
  "userId": "user-1",
  "certificates": [
    {
      "certificateId": "cert-1",
      "userId": "user-1",
      "issued": 1717217200000,
      "expiresAt": 1748753200000,
      "pdfUri": "https://example.com/cert-1.pdf",
      "contentId": "course-1",
      "contentName": "Fire safety",
      "contentType": "COURSE",
      "participationId": "part-1"
    }
  ]
}

progress.certificate.expired

Fires when one or more certificates expire. Same data shape as progress.certificate.

{
  "userId": "user-1",
  "certificates": [
    {
      "certificateId": "cert-1",
      "userId": "user-1",
      "issued": 1685670000000,
      "expiresAt": 1717200000000,
      "pdfUri": "https://example.com/cert-1.pdf",
      "contentId": "course-1",
      "contentName": "Fire safety",
      "contentType": "COURSE",
      "participationId": "part-1"
    }
  ]
}

Meetups

Subscribe with category Meetup.

Occasion object

Used inside meetup.published (and similar occasion fields elsewhere):

FieldTypeDescription
occasionIdstringOccasion id
descriptionstringOccasion description
startTimenumberStart time
endTimenumberEnd time
locationstringLocation text
spotsnumber | nullCapacity, if limited

meetup.published

Fires when a meetup is published.

FieldTypeDescription
meetupIdstringMeetup id
titlestringMeetup title
descriptionstringMeetup description
backgroundImageUrlstringBackground image URL
occasionsarrayOccasion objects (see above)
estimatedCompletionTimeInMinutesnumber | nullEstimated completion time
authorIdsstring[]Author user ids
createdBystringCreator user id
createdAtnumberCreation time
lastUpdatedBystringLast updater user id
lastUpdatedAtnumberLast update time
{
  "meetupId": "meetup-1",
  "title": "Workshop: Evacuation drill",
  "description": "Hands-on practice",
  "backgroundImageUrl": "https://example.com/meetup.jpg",
  "occasions": [
    {
      "occasionId": "occ-1",
      "description": "Morning session",
      "startTime": 1717300000000,
      "endTime": 1717307200000,
      "location": "Building A",
      "spots": 20
    }
  ],
  "estimatedCompletionTimeInMinutes": 120,
  "authorIds": ["user-author"],
  "createdBy": "user-admin",
  "createdAt": 1717220000000,
  "lastUpdatedBy": "user-admin",
  "lastUpdatedAt": 1717220000000
}

meetup.deleted

Fires when a meetup is deleted.

FieldTypeDescription
meetupIdstringDeleted meetup id
{
  "meetupId": "meetup-1"
}

meetup.occasion.added

Fires when a meetup occasion is added.

FieldTypeDescription
meetupIdstringMeetup id
occasionIdstringNew occasion id
lastUpdatedBystringUser id of the updater
lastUpdatedAtnumberUpdate time
descriptionstringOccasion description
startTimenumberStart time
endTimenumberEnd time
locationstringLocation text
spotsnumber | nullCapacity, if limited
{
  "meetupId": "meetup-1",
  "occasionId": "occ-2",
  "lastUpdatedBy": "user-admin",
  "lastUpdatedAt": 1717223600000,
  "description": "Afternoon session",
  "startTime": 1717310000000,
  "endTime": 1717317200000,
  "location": "Building B",
  "spots": 15
}

meetup.occasion.removed

Fires when a meetup occasion is removed.

FieldTypeDescription
meetupIdstringMeetup id
occasionIdstringRemoved occasion id
lastUpdatedBystringUser id of the updater
lastUpdatedAtnumberUpdate time
{
  "meetupId": "meetup-1",
  "occasionId": "occ-2",
  "lastUpdatedBy": "user-admin",
  "lastUpdatedAt": 1717227200000
}

meetup.attending

Fires when a learner marks attending for an occasion.

FieldTypeDescription
userIdstringLearner user id
meetupIdstringMeetup id
occasionIdstringOccasion id
{
  "userId": "user-1",
  "meetupId": "meetup-1",
  "occasionId": "occ-1"
}

meetup.unattending

Fires when a learner stops attending an occasion.

FieldTypeDescription
userIdstringLearner user id
meetupIdstringMeetup id
occasionIdstringOccasion id
{
  "userId": "user-1",
  "meetupId": "meetup-1",
  "occasionId": "occ-1"
}

meetup.attendance.submitted

Fires when attendance is submitted for an occasion.

FieldTypeDescription
meetupIdstringMeetup id
occasionIdstringOccasion id
attendanceListobjectAttendance payload (see below)

attendanceList:

FieldTypeDescription
coworkerAttendancesarrayPer-user attendance rows
submittedAtnumber | nullSubmission time

Each item in coworkerAttendances:

FieldTypeDescription
coworkerIdstringLearner user id (field name is coworkerId on the wire)
attendedbooleanWhether the learner attended
{
  "meetupId": "meetup-1",
  "occasionId": "occ-1",
  "attendanceList": {
    "coworkerAttendances": [
      { "coworkerId": "user-1", "attended": true },
      { "coworkerId": "user-2", "attended": false }
    ],
    "submittedAt": 1717320000000
  }
}

Categories Still Growing

Configure labelStatus
SCORM / Program as standalone content-lifecycle categoriesVisible in Configure but not selectable; content create/update webhooks for Imported Package/program items are not delivered yet
ReflectionExists in platform configuration models; not offered in the current Configure UI

Learner Imported Package and program progress still arrive under Progress (progress.scorm.*, progress.program.*).