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.
| Field | Type | Description |
|---|---|---|
courseId | string | Course id |
name | string | Course title |
revisionNumber | number | Published revision |
lastUpdatedAt | number | Last update time |
lastUpdatedBy | string | User id of the last updater |
price | number | null | Optional 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.
| Field | Type | Description |
|---|---|---|
courseId | string | Course id |
name | string | Course title |
description | string | Course description |
revisionNumber | number | Published revision |
lastUpdatedAt | number | Last update time |
lastUpdatedBy | string | User id of the last updater |
price | number | null | Optional 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.
| Field | Type | Description |
|---|---|---|
courseId | string | Course id |
name | string | Course title |
description | string | Course description |
backgroundImageUrl | string | Background image URL |
lastUpdatedAt | number | Last update time |
lastUpdatedBy | string | User id of the last updater |
price | number | null | Optional price |
sellable | boolean | Whether the course is sellable |
softCorrection | boolean | Soft-correction setting |
estimatedCompletionTimeInMinutes | number | null | Estimated completion time |
authorIds | string[] | 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.
| Field | Type | Description |
|---|---|---|
courseId | string | Deleted 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).
| Field | Type | Description |
|---|---|---|
userId | string | Invited user id |
contentId | string | Content id |
contentType | string | Content type (for example COURSE, SCORM, PROGRAM) |
contentName | string | Content title (may be empty) |
createdAt | number | Invitation 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.
| Field | Type | Description |
|---|---|---|
userId | string | Learner user id |
contentId | string | Course id |
{
"userId": "user-1",
"contentId": "course-1"
}progress.course.canceled
Fires when a course participation is canceled.
| Field | Type | Description |
|---|---|---|
userId | string | Learner user id |
contentId | string | Course id |
{
"userId": "user-1",
"contentId": "course-1"
}progress.course.completed
Fires when a course participation completes.
| Field | Type | Description |
|---|---|---|
userId | string | Learner user id |
contentId | string | Course id |
{
"userId": "user-1",
"contentId": "course-1"
}progress.course.evaluated
Fires when a course participation is evaluated (approved / not approved).
| Field | Type | Description |
|---|---|---|
userId | string | Learner user id |
contentId | string | Course id |
approved | boolean | Evaluation 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.
| Field | Type | Description |
|---|---|---|
userId | string | Learner user id |
contentId | string | Imported 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.
| Field | Type | Description |
|---|---|---|
userId | string | Learner user id |
contentId | string | Imported Package content id |
participationId | string | Participation id |
createdAt | number | Evaluation time |
approved | boolean | true 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.
| Field | Type | Description |
|---|---|---|
userId | string | Learner user id |
contentId | string | Program id |
{
"userId": "user-1",
"contentId": "program-1"
}progress.program.completed
Fires when a program participation completes.
| Field | Type | Description |
|---|---|---|
userId | string | Learner user id |
contentId | string | Program id |
{
"userId": "user-1",
"contentId": "program-1"
}progress.certificate
Fires when a certificate is issued (including re-issued certificates).
| Field | Type | Description |
|---|---|---|
userId | string | Certificate holder user id |
certificates | array | One or more certificate objects (see below) |
Each item in certificates:
| Field | Type | Description |
|---|---|---|
certificateId | string | Certificate id |
userId | string | Holder user id |
issued | number | Issue time |
expiresAt | number | null | Expiry time, if any |
pdfUri | string | PDF download URI |
contentId | string | Related content id |
contentName | string | Related content title |
contentType | string | Related content type (for example COURSE) |
participationId | string | Related 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):
| Field | Type | Description |
|---|---|---|
occasionId | string | Occasion id |
description | string | Occasion description |
startTime | number | Start time |
endTime | number | End time |
location | string | Location text |
spots | number | null | Capacity, if limited |
meetup.published
Fires when a meetup is published.
| Field | Type | Description |
|---|---|---|
meetupId | string | Meetup id |
title | string | Meetup title |
description | string | Meetup description |
backgroundImageUrl | string | Background image URL |
occasions | array | Occasion objects (see above) |
estimatedCompletionTimeInMinutes | number | null | Estimated completion time |
authorIds | string[] | Author user ids |
createdBy | string | Creator user id |
createdAt | number | Creation time |
lastUpdatedBy | string | Last updater user id |
lastUpdatedAt | number | Last 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.
| Field | Type | Description |
|---|---|---|
meetupId | string | Deleted meetup id |
{
"meetupId": "meetup-1"
}meetup.occasion.added
Fires when a meetup occasion is added.
| Field | Type | Description |
|---|---|---|
meetupId | string | Meetup id |
occasionId | string | New occasion id |
lastUpdatedBy | string | User id of the updater |
lastUpdatedAt | number | Update time |
description | string | Occasion description |
startTime | number | Start time |
endTime | number | End time |
location | string | Location text |
spots | number | null | Capacity, 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.
| Field | Type | Description |
|---|---|---|
meetupId | string | Meetup id |
occasionId | string | Removed occasion id |
lastUpdatedBy | string | User id of the updater |
lastUpdatedAt | number | Update time |
{
"meetupId": "meetup-1",
"occasionId": "occ-2",
"lastUpdatedBy": "user-admin",
"lastUpdatedAt": 1717227200000
}meetup.attending
Fires when a learner marks attending for an occasion.
| Field | Type | Description |
|---|---|---|
userId | string | Learner user id |
meetupId | string | Meetup id |
occasionId | string | Occasion id |
{
"userId": "user-1",
"meetupId": "meetup-1",
"occasionId": "occ-1"
}meetup.unattending
Fires when a learner stops attending an occasion.
| Field | Type | Description |
|---|---|---|
userId | string | Learner user id |
meetupId | string | Meetup id |
occasionId | string | Occasion id |
{
"userId": "user-1",
"meetupId": "meetup-1",
"occasionId": "occ-1"
}meetup.attendance.submitted
Fires when attendance is submitted for an occasion.
| Field | Type | Description |
|---|---|---|
meetupId | string | Meetup id |
occasionId | string | Occasion id |
attendanceList | object | Attendance payload (see below) |
attendanceList:
| Field | Type | Description |
|---|---|---|
coworkerAttendances | array | Per-user attendance rows |
submittedAt | number | null | Submission time |
Each item in coworkerAttendances:
| Field | Type | Description |
|---|---|---|
coworkerId | string | Learner user id (field name is coworkerId on the wire) |
attended | boolean | Whether 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 label | Status |
|---|---|
| SCORM / Program as standalone content-lifecycle categories | Visible in Configure but not selectable; content create/update webhooks for Imported Package/program items are not delivered yet |
| Reflection | Exists 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.*).