NAV Navbar

LearnUpon technical documentation

Set up Webhooks version 2 to connect to LearnUpon, to keep your records of learner activity up to date.

Webhooks version 2.0 guide

This guide explains how to set up and configure LearnUpon webhooks, version 2.0.

Webhooks let you "listen" for specific events that occur on your LearnUpon portal, like a learner completing a course or a manager enrolling a learner. Once you set up webhooks, LearnUpon sends event notices, aka the webhooks, to a defined URL, as a JSON data POST, with defined data schematics. You can use these notices in your third-party site or applications.

See LearnUpon's webhooks version 1 guide to compare the functionality between versions 1 and 2.0.

Notable features of webhooks version 2.0

Version 2.0 aims to provide the right information in a webhook, and avoid sending redundant information that you don't need to complete an action. Some changes include:

Switching from v1 to v2.0

For the time being you can use webhooks v1 and v2 in parallel.

If you are already consuming v1 webhooks, you can use the existing receiving location for v2.0. However, LearnUpon recommends you create a separate receiving endpoint.

There are breaking changes introduced in v2: make sure you have separate processing paths for the new version.

Due to security improvements in v2.0 you need a different signature verification process. See:Verify the webhook signature.

Additionally, as the webhook payloads are optimized, check for payload changes for each individual webhook.

Configuration

Contact the support team to turn on webhooks for your portal.

When you have access to the feature, you set it up through your portal interface, following the instructions for setting up version 2.0 in the LearnUpon Knowledge Base.

Webhook version 2.0 types

LearnUpon sends webhook messages you choose for the following events on your portal.

Webhook type Description of event
course_cloning_complete an admin finishes cloning a course
course_completion a learner completes a course
course_updated someone updates a course
module_complete a learner completes a module within a course
learning_path_updated someone updates a learning path
learning_path_completion a learner completes a learning path
purchase_completion a customer completes a purchase of courses on the portal
badge_awarded the portal awards a badge associated with a course, learning path, activity or level
badge_revoked an admin removes a badge from a learner
course_enrollment someone enrolls a learner on a course
course_unenrollment someone unenrolls a learner from a course
learning_path_enrollment someone enrolls a learner on a learning path
event_session_creation someone creates a live learning event session
event_session_updated someone updates a live learning event session
event_session_canceled someone cancels a live learning event session

Receiving a webhook on your servers

Currently, LearnUpon sends a maximum of 10 events in 1 bulk, using a limit of 5 parallel HTTP connections to customers' servers to prevent overloading.

These numbers are subject to change: stay informed about any updates through this documentation.

To ensure data security at LearnUpon, all webhooks are transmitted over HTTPS and signed with SHA256 with additional security measures.

Each webhook has an ID associated with it X-Webhook-ID. This ID helps confirm that your store successfully processed webhooks in your application, You can block repeat posts of the same ID to your application. This ID can help you prevent replay attacks on your servers.

The HTTP header also contains webhook attempts information. Use this information to track errors in your own service. For example, if the number of attempts was 4 and the last_attempt_at is set, that indicates that a problem occurred when LearnUpon last tried to send you this webhook.

Verify the webhook signature

Sample Java code for receiving a webhook, anonymized

import org.apache.commons.codec.binary.Hex;

import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

public class WebhookVerifier {

    public static void main(String[] args) {
        String secret = "00000AB00C0D0E00F0A";
        String rawBody = "{\"data\":[{\"enrollmentId\":19090500,\"user\":{\"userId\":291164,\"email\":\"beatrice.dansk@yourdomain.com\",\"username\":null},\"courseId\":1807600,\"dueDate\":\"2024-03-03T18:13:09.000Z\",\"eventCreated\":\"2024-02-02T18:13:10.038Z\",\"wasRecertified\":false}]}";
        String signature = "a403759157e609bf3852001ff9d83db59b454a82841c4369b0e65d066035af45";

        try {
            // Calculate the hash of the raw body using the SHA-256 hash function and the secret
            Mac sha256Hmac = Mac.getInstance("HmacSHA256");
            SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
            sha256Hmac.init(secretKey);
            byte[] digest = sha256Hmac.doFinal(rawBody.getBytes(StandardCharsets.UTF_8));

            // Convert the digest to a hexadecimal string
            String calculatedSignature = Hex.encodeHexString( digest );

            // Compare the calculated signature with the provided signature
            boolean signaturesMatch = MessageDigest.isEqual(calculatedSignature.getBytes(StandardCharsets.UTF_8), signature.getBytes(StandardCharsets.UTF_8));

            // Print the result
            System.out.println(signaturesMatch);

        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            e.printStackTrace();
        }
    }
}


Sample python script for receiving a webhook, anonymized

import hashlib
import hmac

secret = '00000AB00C0D0E00F0A'
raw_body = r'{"data":[{"enrollmentId":19090500,"user":{"userId":291164,"email":"beatrice.dansk@yourdomain.com","username":null},"courseId":1807600,"dueDate":"2024-03-03T18:13:09.000Z","eventCreated":"2024-02-02T18:13:10.038Z","wasRecertified":false}]}'
signature = 'a403759157e609bf3852001ff9d83db59b454a82841c4369b0e65d066035af45'

# Calculate the hash of the raw body using the SHA-256 hash function and the secret
digest = hmac.new(secret.encode('utf-8'), raw_body.encode('utf-8'), digestmod=hashlib.sha256).hexdigest()

# Compare the encoded hash with the one sent in the X-Webhook-Signature signature header.
print(hmac.compare_digest(digest.encode('utf-8'), signature.encode('utf-8')))

To verify that the JSON payload sent to you is not manipulated externally, verify the signatures that LearnUpon sends in the HTTP header. This check demonstrates that no tampering happened to the data in transit.

  1. Get the raw body of the request
  2. Extract the signature header value X-Webhook-Signature
  3. Calculate the hash of the raw body using the SHA-256 hash function and the secret
  4. Convert the result to a hexadecimal string
  5. Compare the encoded hash with the one sent in the X-Webhook-Signature signature header.

Receiving webhooks with a CSRF-protected server

If you use Rails, Django, or another web framework, your server may automatically check that POST request bodies it receives contain a CSRF token. This security feature helps protect you and your users from cross-site request forgery. However, it may also prevent your server from receiving legitimate webhooks. You may need to exempt the CSRF protection on the Rails route or Django view you use to receive webhooks.

Troubleshooting

If the SHA256 hash does not match the returned signature value, make sure:

If you still have no success, contact the support team with a sample for further assistance.

Responding to a webhook

To acknowledge you received the webhook successfully, your server should return a 2xx HTTP status code. LearnUpon ignores any other information you return in the request headers or request body.

Any response code outside the 2xx range indicates to LearnUpon that you did not receive/process the webhook successfully. When a webhook is not received for whatever reason, LearnUpon continues trying to send the webhook per Retry policy that follows.

If your server returns a 4XX HTTP status code, LearnUpon logs a response inside the Error Message section of webhook status.

Make sure responses are no longer than 2 seconds. LearnUpon will time out the connection, and mark the hook as failed, if the system gets no response within 7+ seconds. If you need to process data, or have any time-consuming operation in your webhook handler, return a status and then finish your processing, either in a background process, or after sending the response and closing the socket.

Retry policy

In case of any problems delivering webhooks, LearnUpon attempts to resend a webhook for 72 hours after the initial failure. The current resend intervals are:

Webhook content

Webhooks version 2.0 has consistent, compact payloads with a minimum required user data and custom user data. See the individual webhook types for payload contents and attributes.

User data: unique identifiers in webhooks

The webhooks that contain references to learners, aka user data, contain a user object. It contains all the unique identifiers available.

By default, LearnUpon portals use userIds to identify users: as a part of portal setup, you can choose usernames as an alternative. See LearnUpon Knowledge Base: Log in with usernames.

User object data attributes

Attribute Type Description
username string Unique identifier for a user, for portals that require usernames
email string Email address for a user
userId integer Unique numeric identifier for a user

For instructor-led training, live learning-related webhooks contain a sessionInstructors object. See sessionInstructors data object attributes.

HTTP headers

Each webhook contains the same HTTP header.

Header Description
Content-Type application/json
X-LearnUpon-TimeStamp Unix Epoch Time when LearnUpon servers generated this webhook
X-Webhook-Attempt Number of attempts to send the webhook
X-Webhook-ID Unique alphanumeric identifier for the webhook
X-Webhook-Last-Attempt-At date in UTC format of the last attempt to send the webhook
X-Webhook-Powered-By LearnUpon
X-Webhook-Signature Hash of the JSON data you receive (without the signature attribute), with a secret key that is set on your webhook configuration settings
X-Webhook-Subscription-ID A unique identifier string for subscriptions, format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx for future development
User-Agent LearnUpon Webhook/v2
X-Webhook-Type Describes the webhook type in the JSON package, formatted with an underscore. See Webhook version 2 types
X-LearnUpon-Version 2.0

Course clone completion

Sample course cloning completion webhook

{
   "data" : [
      {
         "clonedFromPortalId" : 13600,
         "clonedToPortalId" : 15800,
         "originalCourseId" : 2700200,
         "newCourseId" : 2758500,
         "ownerId" : 291100,
         "eventCreated" : "2023-12-05T20:27:29.675Z",
      }
   ]
}

The course clone completion hook is a JSON payload sent to your designated URL end point whenever LearnUpon successfully clones, aka makes a copy of, a course, from either the user interface or by using the API.

Compare to webhook v1 clone completion.

Course clone completion attributes

Attribute Type Description
clonedFromPortalId integer Source portal of the original course
clonedToPortalId integer Destination portal for the new cloned course
originalCourseId integer The course id for the original course
newCourseId integer The course id for the newly cloned course
ownerId integer Unique identifier of the course owner
eventCreated date Date and time of cloning completion in UTC format

Course completion

Sample course completion webhook

{
   "data" : [
      {
         "courseId" : 2587200,
         "enrollmentId" : 17906600,
         "courseReferenceCode" : null,
          "certification" : {
            "certExpiresAt" : "",
            "wasRecertified" : false,
            "certificationName" : ""
         },
         "courseAccessExpiresAt" : null,
         "dateEnrolled" : "2023-10-20T20:45:41.000Z",
         "dateStarted" : "2023-10-20T20:47:42.000Z",
         "dateCompleted" : "2023-10-20T04:00:00.000Z",
         "enrollmentStatus" : "passed",
         "percentage" : 100,
         "hasAttemptsRemaining" : false,
         "manuallyMarkedCompleteById" : 291100,
         "manuallyMarkedComplete" : true,
          "user" : {
            "userId" : 291162,
            "username" : null,
            "email" : "agnes.poitou@yourdomain.com"
         },
         "credits" : null,
         "modules" : [
            {
               "name" : "Webhooks: intro",
               "dateCompleted" : "2023-10-20T04:00:00.000Z",
               "type" : "page",
               "status" : "completed",
               "dateStarted" : "2023-10-20T20:47:42.000Z",
               "additional_data" : null,
               "markedCompleted" : true,
               "id" : 2409200,
               "percentage" : null,
               "sequence" : 1
            },
            {
               "percentage" : null,
               "sequence" : 2,
               "markedCompleted" : true,
               "additional_data" : null,
               "id" : 2409200,
               "dateCompleted" : "2023-10-20T04:00:00.000Z",
               "dateStarted" : null,
               "status" : "not_started",
               "type" : "training",
               "name" : "Use webhooks to build integrations: intro"
            },
            {
               "name" : "Use APIs to get the most from automation",
               "dateStarted" : null,
               "type" : "training",
               "status" : "not_started",
               "dateCompleted" : "2023-10-20T04:00:00.000Z",
               "id" : 405200,
               "additional_data" : null,
               "markedCompleted" : true,
               "sequence" : 3,
               "percentage" : null
            },
            {
               "name" : "Webhooks exam",
               "dateCompleted" : "2023-10-20T04:00:00.000Z",
               "status" : "not_started",
               "type" : "exam",
               "dateStarted" : null,
               "additional_data" : {
                  "attemptsTaken" : 0,
                  "isKnowledgeTest" : false,
                  "unlimitedAttemptsAllowed" : false,
                  "passMark" : 0,
                  "timedExam" : false,
                  "passPercentage" : 50,
                  "wasAutoSubmitted" : false,
                  "timeTaken" : null,
                  "examId" : 205900,
                  "attemptsAllowed" : 1,
                  "timeAllowed" : null
               },
               "markedCompleted" : true,
               "id" : 2409200,
               "percentage" : null,
               "sequence" : 4
            },
            {
               "name" : "Wrap up survey",
               "type" : "survey",
               "status" : "not_started",
               "dateStarted" : null,
               "dateCompleted" : "2023-10-20T04:00:00.000Z",
               "id" : 2409200,
               "markedCompleted" : true,
               "additional_data" : {
                  "surveyId" : 205900
               },
               "sequence" : 5,
               "percentage" : null
            }
         ],
         "eventCreated" : "2023-10-20T20:56:03.000Z"
      }
   ]
}

The course completion hook is a JSON payload of completion data sent to your designated URL end point, every time a learner completes a course.

This webhook's details about modules are different from the module completion webhook. See Module Completion.

Compare to webhook v1 course completion.

The sample webhook is for a course that was marked complete.

Course completion attributes

Attribute Type Description
enrollmentId integer Unique numeric identifier for the enrollment
courseId integer Unique numeric identifier for the course
courseReferenceCode string If you enable course reference codes on your portal, this field contains the references and data from that attribute
certification object When you offer certificates for a course, the details appear in a listed/embedded object
courseAccessExpiresAt string The date and time (UTC) that the learner's access to this course expires, if set
dateEnrolled string The date and time (UTC) that the learner enrolled on the course
dateStarted string The date and time (UTC) that the learner started the course
dateCompleted string The date and time (UTC) that the learner completed the course
enrollmentStatus string Indicates the status of the learner on the course having completed it: values are completed, passed or failed
percentage integer The percentage scored for the learner on the course: this value is the learner's average score across all modules with scores in the course.
hasAttemptsRemaining boolean Indicates if the learner has more attempts on the course: this value appears if a learner reaches a failed status, but they have an exam that allows them to re-attempt the course
manuallyMarkedComplete boolean Indicates if the completion was marked complete manually by an authorized user
manuallyMarkedCompleteById integer Unique numeric identifier of the person who manually marked the learner as complete
user object List of unique identifiers for an individual user
credits array If you issue credits for your course, the credits appear here in a listed/embedded object
modules array The list of modules and related statuses in the course: for each module in your course, you get a status, a date the status was set, and scores where relevant
eventCreated date Date and time of course completion in UTC format

Course credits data attributes

attribute type description
id integer For learning path completions only: Unique numeric identifier for the credit. See Path credits data attributes
name string The name of the credit that was awarded, like "CPD"
number float The number of credits that were awarded to the learner by completing the course, like 5.0

Module object attributes

attribute type description
id integer Unique id of the module in LearnUpon
type string The type of the module: values include module, page, exam, scorm, tincan, assignment, survey, checklist, training, event
name string The name of the module in LearnUpon
status string The status of the module at the time the learner completed the course, with one of the following statuses: not_started, in_progress, completed, passed, failed, pending_review, attended, no_show, cancelled
percentage integer The score that the learner achieved, if the module included a test, such as an exam or assignment. Normally an integer, but can be a float in some particular modules (e.g. SCORM Module)
dateCompleted string Date and time in UTC format when the user completed this module
attempts integer The number of attempts by the learner, on the module, assuming this module is exam-based
isKnowledgeCheck boolean If the module is an exam, indicates if the exam was a knowledge test only (true) or formal exam (false)
sequence integer Order of the modules in the course, if set

Certification object attributes

attribute type description
id integer For learning path completions only: Unique numeric identifier for the certification. See Learning path completed user attributes
certificationName string The name of the certificate awarded, if any
certExpiresAt string Set to a date (UTC) when the learner's certificate will expire: empty string indicates no expiry
wasRecertified boolean If you have set up recertification policies on your course certificate, and the user was awarded a certificate, this value is set to true when the user was automatically recertified by LearnUpon on the course

Course update

Sample course update webhook

{
    "data" : [
       {
          "courseId" : 2587200,
          "courseName" : "Course 1 of Learning path",
          "courseReferenceCode" : null,
          "courseKeywords" : null,
          "courseShortDescription" : null,
          "datePublished" : "2023-10-20T19:36:32.000Z",
          "courseVersion" : 2,
          "courseSourceId" : 1929500,
          "courseStatus" : "Under Revision",
          "thumbnailImageUrl" : null,
          "cataloged" : false,
          "modules" : [
             {
                "isKnowledgeCheck" : false,
                "id" : 1724000,
                "type" : "Module"
             },
             {
                "type" : "SCORM",
                "isKnowledgeCheck" : false,
                "id" : 2409200
             }
          ],
          "courseIsSellable" : false,
          "price" : null,
          "membershipPricing" : [],
          "dueDate" : null,
          "accessExpires" : null,
          "difficulty" : null,
          "courseLength" : 0,
          "courseLengthUnit" : "Minutes",
          "certificate" : null,
          "credits" : [],
          "badges" : [],
          "eventCreated" : "2023-10-20T20:26:48.000Z",
       }
    ]
 }


 {
    "data" : [
       {
          "courseId" : 2587200,
          "courseName" : "Course 1 of Learning path",
          "courseReferenceCode" : null,
          "courseKeywords" : null,
          "courseShortDescription" : null,
          "datePublished" : "2023-10-20T19:36:32.000Z",
          "courseVersion" : 2,
          "courseSourceId" : 1929500,
          "courseStatus" : "Archived",
          "thumbnailImageUrl" : null,
          "cataloged" : false,
          "modules" : [
             {
                "isKnowledgeCheck" : false,
                "id" : 1724000,
                "type" : "Module"
             },
             {
                "type" : "SCORM",
                "isKnowledgeCheck" : false,
                "id" : 2409200
             }
          ],
          "courseIsSellable" : false,
          "price" : null,
          "membershipPricing" : [],
          "dueDate" : null,
          "accessExpires" : null,
          "difficulty" : null,
          "courseLength" : 0,
          "courseLengthUnit" : "Minutes",
          "certificate" : null,
          "credits" : [],
          "badges" : [],
          "eventCreated" : "2023-10-20T20:27:17.000Z",
       }
       {
          "courseId" : 2587200,
          "courseName" : "Course 1 of Learning path",
          "courseReferenceCode" : null,
          "courseKeywords" : null,
          "courseShortDescription" : null,
          "datePublished" : "2023-10-20T19:36:32.000Z",
          "courseVersion" : 3,
          "courseSourceId" : 1929500,
          "courseStatus" : "Published",
          "thumbnailImageUrl" : null,
          "cataloged" : false,
          "modules" : [
             {
                "isKnowledgeCheck" : false,
                "id" : 1724000,
                "type" : "Module"
             },
             {
                "type" : "SCORM",
                "isKnowledgeCheck" : false,
                "id" : 2409200
             }
          ],
          "courseIsSellable" : false,
          "price" : null,
          "membershipPricing" : [],
          "dueDate" : null,
          "accessExpires" : null,
          "difficulty" : null,
          "courseLength" : 0,
          "courseLengthUnit" : "Minutes",
          "certificate" : null,
          "credits" : [],
          "badges" : [],
          "eventCreated" : "2023-10-20T20:27:16.000Z",
       }
    ]
 }

The course update webhook is a JSON payload of course change data sent to your designated URL end point, every time an admin, manager or instructor starts a new course version, or when the course status changes.

Courses must have a status of published, under revision, archived or deleted to trigger a webhook.

To trigger a webhook, you need to make changes that require a new course version. Creating and editing a draft course does not prompt a webhook. Changing course settings, or metadata like custom course data, does not prompt a webhook.

For a deleted course status, LearnUpon sends a webhook noting the deletion, and won't send further webhooks for that course.

Once published, any change to the course attributes listed triggers a webhook.

Webhooks version 2 does not support courseMetaData attribute. Creating or deleting a new custom course data field doesn't trigger a webhook. Custom course data does not appear in the payload.

Course Update does not pass any user information: course information only.

Compare to webhook v1 course update.

Course update attributes

Attribute Type Description
courseId integer Unique identifier numeric for the course
courseName string The title of the course
courseReferenceCode string If you have course reference codes enabled on your portal, this attribute contains the references and data from that attribute
courseKeywords string If you have keywords added to your course, they appear here
courseShortDescription string The short description, which appears on the My Courses page or the catalog
datePublished string The date and time that the course was first published, in UTC format
courseVersion integer The version of the course
courseSourceId integer This is the source course_id for each version of a course. For example: for 3 courses, A, B, C (versions 1, 2, 3 respectively) each of these courses use the same courseSourceId value, the id of the first course. This attribute lets you group together courses that stem from the same root course, in their version tree
courseStatus string The status of the course at the time LearnUpon sends the webhook, for courses with a status of Published, Under Revision, Archived or Deleted
thumbnailImageUrl string The main thumbnail image URL for the course
cataloged boolean Indicates if the course is available in the internal catalog (true). Default value is false
modules array The list of modules and module types in the course
courseIsSellable boolean Notes if the course is available on the storefront. Default value is false, for not sellable
price integer The price of the course
membershipPricing array If you use associations in your portal, the pricing for each type of member is in a listed/embedded object
dueDate object The course due date, or set number of days to complete the course after an enrollment for a learner
accessExpires object The course expiry date, or set number of days before an enrollment expires after an enrollment for a learner
difficulty string Indicates the difficulty level on your course
courseLength integer The course length if specified
courseLengthUnit string Indicates the length unit for your course, hours or minutes
certificate object If learners can get a certificate on this course, this attribute contains the information
credits array If you issue credits for your course, the credits appear here in a listed/embedded object
badges array Describes the badges learners can receive, in a listed/embedded object
eventCreated date Date and time of course completion in UTC format

dueDate object attributes

Attribute Type Description
numOfDaysAfterEnrollment integer The number of days after enrollment on this course, for completing the course
setDate string The date and time when this course is due for completion in UTC format

accessExpires object attributes

Attribute Type Description
numOfDaysAfterEnrollment integer The number of days learners can access this course before it expires
setDate string The set expiry date for this course in UTC format. If set, learners cannot access after this date

certificate object attributes

Attribute Type Description
certificateName string The name of the certificate awarded to a learner, on successful completion of the course
certExpiresNumDaysAfterAward integer The set number of days before a certificate expires after awarding
autoReenroll boolean
autoReenrollNumDaysBeforeCertExpires integer If the learner is expected to renew their certificate before it expires, this attribute lists the number of days before the expiry, to auto re-enroll the learner

modules array attributes

Attribute Type Description
id integer Unique id of the module in LearnUpon
type string The type of the module: values include module, page, exam, scorm, tincan, assignment, survey, checklist, training, event
isKnowledgeCheck boolean If the module is an exam, indicates if the exam was a knowledge test only (true) or formal exam (false)
startAt string Legacy ILTs only: start date and time that the ILT session is scheduled, in UTC format
endAt string Legacy ILTs only: end date and time that the ILT session is scheduled to complete, in UTC format
maxCapacity integer Legacy ILTs only: the maximum number of learners allowed to attend the ILT session

membershipPricing array attributes

Attribute Type Description
name string The name provided as the membership type in your portal
price integer The course price for the specific membership type

credits array attributes

Attribute Type Description
name string The name of the credit that was awarded, like "CPD"
number float The number of credits that were awarded to the learner by completing the course, like 5.0

badges array attributes

Attribute Type Description
name string The name of the badge
type string The type of badge
points integer The number of points awarded
achieved string Notes when learner will receive the badge: for example, on completion of the course

Module complete

Sample module completion webhook, type scorm

{
   "data" : [
      {
         "user" : {
            "email" : "agnes.poitou@yourdomain.com",
            "username" : null,
            "userId" : 291100
         },
         "enrollmentId" : 16107700,
         "courseId" : 1561400,
         "moduleId" : 1344900,
         "dateStarted" : "2023-12-05T21:25:44.000Z",
         "dateCompleted" : "2023-12-05T21:36:35.000Z",
         "markedCompleted" : false,
         "type" : "scorm",
         "sequence" : 1,
         "status" : "passed",
         "percentage" : 100,
         "additional_data" : null,
         "eventCreated" : "2023-12-05T21:36:35.647Z",
      }
   ]
}

Sample module completed webhook, type exam

{
   "data" : [
      {
         "user" : {
            "username" : null,
            "userId" : 291100,
            "email" : "agnes.poitou@yourdomain.com"
         },
         "enrollmentId" : 18678300,
         "courseId" : 2758500,
         "moduleId" : 2586500,
         "dateStarted" : "2023-12-05T21:17:37.000Z",
         "dateCompleted" : "2023-12-05T21:18:03.000Z",
         "markedCompleted" : false,
         "type" : "exam",
         "sequence" : 3,
         "status" : "passed",
         "percentage" : 60,
         "additional_data" : {
            "examId" : 217100,
            "isKnowledgeTest" : false,
            "attemptsTaken" : 1,
            "attemptsAllowed" : 1,
            "unlimitedAttemptsAllowed" : false,
            "timedExam" : false,
            "timeAllowed" : null,
            "timeTaken" : 0,
            "wasAutoSubmitted" : false,
            "passMark" : 0,
            "passPercentage" : 50
         }
         "eventCreated" : "2023-12-05T21:18:03.131Z",
      }
   ]
}

Sample module completed webhook, type survey

{
   "data" : [
      {
         "user" : {
            "userId" : 291100,
            "username" : null,
            "email" : "agnes.poitou@yourdomain.com"
         },
         "enrollmentId" : 18678300,
         "courseId" : 2758500,
         "moduleId" : 2586500,
         "dateStarted" : "2023-12-05T21:17:21.000Z",
         "dateCompleted" : "2023-12-05T21:17:32.000Z",
         "markedCompleted" : false,
         "status" : "completed",
         "type" : "survey",
         "sequence" : 2,
         "percentage" : null,
         "additional_data" : {
            "surveyId" : 217100
         },
         "eventCreated" : "2023-12-05T21:17:32.431Z",
      }
   ]
}

Sample module completed webhook, type tincan

{
   "data" : [
      {
         "user" : {
            "email" : "agnes.poitou@yourdomain.com",
            "username" : null,
            "userId" : 291100
         },
         "enrollmentId" : 18678300,
         "courseId" : 2758500,
         "moduleId" : 2414100,
         "dateStarted" : "2023-12-05T21:15:41.000Z",
         "dateCompleted" : "2023-12-05T21:17:04.000Z",
         "markedCompleted" : false,
         "type" : "tincan",
         "sequence" : 1,
         "status" : "passed",
         "percentage" : null,
         "additional_data" : null,
         "eventCreated" : "2023-12-05T21:17:04.186Z",
      }
   ]
}

Sample module completed webhook, type assignment. This course included an uploaded document, and was auto-corrected.

{
   "data" : [
      {
         "user" : {
            "userId" : 2859300,
            "email" : "bella.bell@yourdomain.com",
            "username" : null
         },
         "enrollmentId" : 19678100,
         "courseId" : 3743600,
         "dateStarted" : "2024-08-06T14:53:35.000Z",
         "dateCompleted" : "2024-08-06T14:54:37.000Z",
         "markedCompleted" : false,
         "type" : "assignment",
         "sequence" : 2,
         "status" : "passed",
         "percentage" : null,
         "moduleId" : 3606900,
         "additional_data" : {
            "instructorFeedback" : {
               "reviewedByUserId" : null,
               "wasAutocompleted" : true,
               "uploads" : null,
               "feedback" : "Thanks for submitting your assignment.\n",
               "reviewedAt" : "2024-08-06T14:54:37Z",
               "score" : 100,
            },
            "assignmentAnswer" : {
               "truncated" : false,
               "uploads" : [
                  {
                     "id" : 20400,
                     "url" : "https://submittedassignments.verylongurlforamazonaws.com/"
                  }
               ],
               "answerSubmittedAt" : "2024-08-06T14:54:37Z",
               "answer" : "I've attached a CSV with my answers included \n",
               "id" : 165800
            }
         },
         "eventCreated" : "2024-08-06T14:54:37.948Z",

      }
   ]
}

Sample module completed webhook, type checklist. This course was marked complete

{
   "data" : [
         {
         "user" : {
            "email" : "jttaylor@yourndomain.com",
            "username" : null,
            "userId" : 290900
         },   
         "enrollmentId" : 14200765,
         "courseId" : 1374800,
         "moduleId" : 1160100,
         "dateStarted" : "2023-10-26T15:39:10.000Z",
         "dateCompleted" : "2024-01-12T05:00:00.000Z",
         "markedCompleted" : true,
         "type" : "checklist",
         "sequence" : 2,
         "status" : "completed",
         "percentage" : null,
         "additional_data" : null,
         "eventCreated" : "2024-01-12T16:08:03.027Z",

      }

   ]
}

The module complete hook is a JSON payload of completion data sent to your designated URL end point, every time a learner completes a module. The webhook is uniform for all module types, with an object for additionalData to hold exam and survey details.

This webhook is different from the course completion webhook, that contains module data. See Course Completion.

This webhook handles live learning training differently from legacy ILT modules:

Compare to webhook v1 module complete.

For assignment modules only: the moduleID is the same as the assignment_id for LearnUpon's API. You can use moduleID to automate the assignments endpoint. See LearnUpon API guide.

Module completion attributes

Attribute Type Description
user object List of unique identifiers for an individual user
enrollmentId integer Unique numeric identifier for the enrollment
courseId integer Unique numeric identifier for the course
moduleId integer Unique numeric identifier for the module the learner completed
dateStarted string The date and time (UTC) that the learner started the module
dateCompleted string The date and time (UTC) that the learner completed the module
markedCompleted boolean Indicates if the completion was marked complete manually by an authorized user. Default is false
type string Type of module the learner completed: one of module, page, exam, scorm, tincan, assignment, survey, checklist, training, event
sequence integer Refers to the order of the modules within the course
status string Indicates the status of the learner on the module having completed it: one ofcompleted, failed, pending_review, not_started (when learner never started course, and markedCompleted=true)
percentage integer The score of the module completed. Can be null
additionalData object Provides details for specific module types like exams and surveys. Can be null
eventCreated date Date and time of event completion in UTC format

additionalData object attributes for module completion webhook

This object holds details about exam and survey modules:

Either object can contain an uploads array.

Attribute Type Description
instructorFeedback object Attributes about the feedback the instructor provides, including an array for any feedback attachments
assignmentAnswer object Attributes about the answer provided by the learner, including an array for any uploaded content
surveyId integer Survey only: unique numeric identifier for a survey in LearnUpon
examId integer Unique numeric identifier of the exam in LearnUpon
isKnowledgeTest boolean Indicates if the exam is a knowledge test (true) only or formal exam (false)
attemptsTaken integer The number of attempts on this exam by the learner so far
attemptsAllowed integer The number of attempts permitted, assuming attempts are limited (see unlimitedAttemptsAllowed attribute)
unlimitedAttemptsAllowed boolean Set to true if the exam has unlimited attempts permitted: otherwise false. When set, this attribute overrides attemptsAllowed
timedExam boolean Set to true when the exam is a timed exam
timeAllowed integer The number of minutes allocated to complete the exam
timeTaken float The number of seconds taken by the learner to complete the exam
wasAutoSubmitted boolean Set to true if LearnUpon automatically submitted the exam, when the allocated time (timeAllowed) elapsed in full
passMark integer The number of correct answers required to pass the exam, if you do not use passPercentage attribute
passPercentage integer The passing percentage required for this exam. When set, this value overrides passMark

instructorFeedback object attributes for module completion webhook

Attribute Type Description
reviewedByUserId integer Unique numeric identifier of the instructor who reviews the assignment
wasAutocompleted boolean Indicates if the assignment was reviewed automatically with a pre-set score. Default is null
uploads array Contains details of any uploaded response by the instructor
feedback string Any text entered by the instructor to acknowledge the assignment. Can be provided automatically by autocomplete
reviewedAt date/time The date and time (UTC) that the instructor reviwed the assignment
score integer Numeric value assigned for the assignment. Can be provided automatically by autocomplete

assignmentAnswer object attributes for module completion webhook

Attribute Type Description
id integer Unique numeric identifier for the learner's answer to this assignment
answer string Any text entered in the UI by the learner as part of their assignment response. This attribute truncates at 3000 characters
truncated boolean Indicates if the learner's answer shown in the webhook was cut short
uploads array Contains details of any uploaded content by the learner
answerSubmittedAt date/time The date and time (UTC) that the learner sent the assignment

uploads array attributes for module completion webhook

Both the instructorFeedback and the assignmentAnswer objects can contain an array called uploads.

Attribute Type Description
id integer Unique numeric identifier for the upload
url string URL link to the content uploaded by either the instructor or the learner

Learning path update

Sample learning path update webhook

{
    "data" : [
       {
          "user" : {
             "userId" : 291164,
             "username" : null
             "email" : "beatrice.dansk@yourdomain.com"
          },
          "learningPathId" : 49400,
          "learningPathName" : "APIs are the future",
          "learningPathKeywords" : "API, automation, admin",
          "learningPathShortDescription" : "Learn how APIs are building integrated networks across your tech stack. \n",
          "learningPathStatus" : "Published",
          "thumbnailImageUrl" : "https://yourcloudserver.s3.eu-west-1.amazonaws.com/lpimages/2847/large/Blog-How-to-Buy-Software-720x300.png",
          "cataloged" : true,
          "difficulty" : "Not Applicable",
          "learningPathLength" : 0,
          "learningPathLengthUnit" : "Minutes",
          "eventCreated" : "2023-10-20T20:40:33.000Z",
       }
    ]
 }

The learning path update webhook is a JSON payload of learning path data sent to your designated URL end point, every time an admin, manager or instructor updates a learning path. This webhook helps you keep up to date of changes to learning paths.

You need to turn on learning paths in your portal, and create and publish a learning path with courses before any learning path updates appear as webhooks.

See Learning paths: create a path, add courses, set progression and publish in the LearnUpon Knowledge Base.

Learning paths must have a status of published, archived or deleted to trigger a webhook. Creating and editing a draft learning path does not prompt a webhook.

For a deleted learning path status, LearnUpon sends a webhook noting the deletion, and does not send further webhooks for that learning path.

Once published, any change to the learning path attributes listed triggers a webhook.

Compare to webhook v1 learning path update.

Learning path update attributes

Attribute Type Description
user object List of unique identifiers for an individual user
learningPathId integer Unique numeric identifier for the learning path
learningPathName string The title of the learning path
learningPathKeywords string If you have keywords added to your learning path, they appear here
learningPathShortDescription string The short description, which appears on the My Courses page or the catalog
learningPathStatus string The status of the learning path at the time LearnUpon sends the webhook, for learning paths with a status of Published, Archived or Deleted
thumbnailImageUrl string The main thumbnail image URL for the learning path
cataloged boolean Indicates if the learning path is available in the internal catalog. Default value is false
difficulty string Indicates the difficulty level on your learning path
learningPathLength integer The learning path length if specified
learningPathLengthUnit string Indicates the length unit for your course, hours or minutes
eventCreated date Date and time of learning path update in UTC format

Learning path completions

Sample learning path completion webhook

{
   "data" : [
      {
         "user" : {
            "userId" : 2859300,
            "email" : "wendy.gill@yourdomain.com",
            "username" : null
         },
         "learningPathEnrollmentId" : 1053200,
         "learningPathId" : 194900,
         "certification" : null,
         "dateEnrolled" : "2023-12-13T20:06:09.000Z",
         "dateStarted" : "2023-12-13T20:08:26.000Z",
         "dateCompleted" : "2023-12-13T20:37:56.000Z",
         "percentage" : 50,
         "numberCompletedCourses" : 2,
         "credits" : [],
         "courses" : [
            {
               "id" : 1413800,
               "status" : "passed",
               "percentage" : null,
            },
            {
               "id" : 720600,
               "status" : "passed",
               "percentage" : 100,
            }
         ],
         "eventCreated" : "2023-12-13T20:37:57.000Z"
      }
   ]
}

The learning path completion hook is a JSON payload of completion data sent to your designated URL end point, every time a learner completes a learning path.

Compare to webhook v1 learning path completions.

Learning path completed user attributes

attribute type description
user object List of unique identifiers for an individual user
learningPathEnrollmentId integer Unique numeric identifier of the learning path enrollment for the learner in LearnUpon
learningPathId integer Unique numeric identifier of the path in LearnUpon
certification object When you offer certificates for a learning path, the details appear in a listed/embedded object
dateEnrolled string The date and time (UTC) that the learner was enrolled on the path
dateStarted string The date and time (UTC) that the learner started the path
dateCompleted string The date and time (UTC) that the learner completed the path
percentage integer The percentage scored for the learner on the path: the average score across all scorable courses which the learner completes in the path
numberCompletedCourses integer The number of courses the learner completes on this path
credits array If you issue credits for your path, the credits appear here in a listed/embedded object
courses array The list of courses and related statuses in the course: for each course in your path, you see an ID, a status, scores where relevant
eventCreated date Date of course completion in UTC format

Path credits data attributes

attribute type description
id integer Unique numeric identifier for the credit
name string The name of the credit that was awarded, like "CPD"
number float The number of credits that were awarded to the learner by completing the path, like 5.0

Course object attributes

attribute type description
id integer Unique id of the course in LearnUpon
status string The status of the course at the time the learner completed the path, with one of the following statuses: not_started, in_progress, completed, passed, failed, pending_review
percentage integer The average score that the learner achieved on this course, if the course contained scoring modules

Purchase completion

Sample purchase completion webhook

{
  "data": [
    {
      "user": {
        "userId": 2415600,
        "email": "william.wallace@yourdomain.com",
        "username": "wnwallace"
      },
      "orderId": 3465500,
      "currency": "usd",
      "country": "United States",
      "state": "Colorado",
      "paymentGateway": "paypal",
      "paymentId": "EC-24815576G65860000",
      "coupon": "testcoup90",
      "dateCompleted": "2023-12-14T21:21:26.000Z",
      "bulkCodes": null,
      "orderTotal": 5,
      "amountPaid": 0.5,
      "orderDiscount": 4.5,
      "salesTaxAmount": null,
      "lineItems": [
        {
          "lineItemId": 4838500,
          "name": "Test Course 1",
          "courseReferenceCode": null,
          "type": "course",
          "listPrice": 5,
          "discount": 4.5,
          "coupon": null,
          "salesTaxRate": null,
          "salesTaxAmount": null,
          "taxRateLocation": "store",
          "amountPaid": 0.5,
          "quantity": 1
        }
      ],
      "eventCreated": "2023-12-14T21:21:26.580Z"
    }
  ]
}

When you use LearnUpon’s eCommerce features to sell training, you can listen for purchase completion actions on your storefront. LearnUpon sends a webhook for every successful sale on your store, including the customer details, the courses, paths or bundles purchased and any taxes, discounts and pricing applied for the sale.

Compare to webhook v1 purchase completions.

Purchase completion user attributes

Attribute Type Description
user object List of unique identifiers for an individual user
orderId integer Unique numeric identifier of the order or cart in LearnUpon.
currency string The currency code for this purchase: options are usd, eur, gbp, cad, aud, nzd
country string The country the customer selected while purchasing
state string The state, if applicable, that the customer selected while purchasing
paymentGateway string The gateway that the customer used in this purchase, assuming it was not a free purchase: options are paypal, stripe, or shopify
paymentId string Unique Payment ID for the purchase: the PayPal, Stripe, or Shopify payment ID/token. If the purchase is a free purchase and no gateway is involved, then this value is a LearnUpon internal ID for free purchases
coupon string The coupon code for discounts applied for all items in the cart
dateCompleted string The date and time (UTC) that the customer completed the purchase
bulkCodes string List of bulk purchase codes associated with the purchase, if applicable. Buyers can use these codes to redeem a purchase in the case of bulk or purchasing on behalf of other users
orderTotal float The total cost of the order, without discounts applied or taxes
amountPaid float The actual total amount paid by the customer, including discounts applied and taxes
orderDiscount float The discount applied to the order if any, by way of a coupon
salesTaxAmount float The amount of sales tax applied on the purchase if any
lineItems array The list of items the customer bought: courses, learning paths and/or bundles
eventCreated date Date and time of purchase completion in UTC format

Order line items data attributes

Attribute Type Description
lineItemId integer Unique numeric identifier of the item sold in LearnUpon, for a course, learning path or bundle
name string The name of the item purchased in LearnUpon
courseReferenceCode string If you use course reference codes on your portal, this field contains the references and data from that attribute
type string Indicates the type of the item purchased: course, path or bundle
listPrice float The list price of the course in the store, without discounts or coupons applied
discount float Discount applied to the line_item, if any
coupon string The coupon code for a discount on an individual line item
salesTaxRate float The sales tax rate applied to the line item
salesTaxAmount float The amount of sales tax applied, if any, to this line_item: applies to all purchases where sales tax is applicable
taxRateLocation string Indicates if the tax paid was the store tax rate, or the local tax rate of the purchase. The local tax rate applies only for EU based sales. Options are store or local
amountPaid float The cost of this line_item in relation to the overall cart, including discounts removed
quantity integer The number or quantity of this item purchased: minimum 1, but can be more for a bulk purchase

Badge awarded

Sample badge awarded webhook

{
   "data" : [
      {
         "awardedByBadgeEvent" : 6,
         "user" : {
            "username" : null
            "userId" : 291100,
            "email" : "agnes.poitou@yourdomain.com"
         },
         "awardedBy" : {
            "course" : {
               "courseId" : 2587200,
               "courseName" : "Use webhooks to extend automation: intro"
            },
         },
         "numberOfPoints" : 195,
         "numberOfBadges" : 10,   
         "badge" : {
            "points" : 20,
            "id" : 1212400,
            "name" : "Bronze Course Completion"
            },
         "eventCreated" : "2023-10-20T20:56:04.000Z",
      }
   ]
}

When you use the LearnUpon gamification feature, you can listen for badge-related actions. When learners complete actions (typically completing a course) which trigger awarding a badge, LearnUpon sends a JSON payload with user details.

LearnUpon includes webhook data based on what triggered the awardedBy event. Some hooks won't include all objects.

Compare to webhook v1 badge awarded.

Badge awarded data attributes

Attribute Type Description
awardedByBadgeEvent integer 1=daily_learning, 2=purchase, 3=views_resource, 4=self_enroll, 5=approve_ext_credit, 6=course_completion, 7=learning_path_completion, 8=level_achieved
user object List of unique identifiers for an individual user
awardedBy object Describes the gamification system linked to the action: in this example, taking a course
numberOfPoints integer Number of points awarded to the learner
numberOfBadges integer Number of badges awarded to the learner
badge object Describes the badge awarded to the user
eventCreated date Date and time badge was awarded in UTC format

awardedBy attributes

Attribute Type Description
gamificationLevel object Details about the gamification level achieved by the learner
order object eCommerce: Attributes for the purchase order in the online store
learningResource object Details about the learning resource used by the learner
course object Details about the course the learner is taking
learningPath object Details about the learning path linked to the gamification
externalTrainingRecord object Details about the user's external training record

gamificationLevel attributes

Attribute Type Description
id integer Unique numeric identifier of the gamification level
achievedOverOrEqual integer Indicates how many points required to achieve this level
name string Name of the level the user has achieved: for example, Level 1, 2, 3

order attributes

Attribute Type Description
id integer Unique numeric identifier of the purchase order in the online store

learningResource attributes

Attribute Type Description
id integer Unique numeric identifier of the learning resource
title string Title of the learning resource

course attributes

Attribute Type Description
id integer Unique numeric identifier of the course
name string Course name

learningPath attributes

Attribute Type Description
id integer Unique numeric identifier of the learning path
name string Learning path name

externalTrainingRecord attributes

Attribute Type Description
id integer Unique numeric identifier of the external training record
activity string Name of the external training activity

badge attributes

Attribute Type Description
points integer Number of points associated with this badge
name string Name of the badge: for example, Level 1 novice badge, Level 2 beginner badge,
id integer Unique numeric identifier associated with the badge awarded to this user

Badge revoked

Sample badge revoked webhook

{
   "data" : [
      {
         "user" : {
            "username" : null
            "email" : "agnes.poitou@yourdomain.com",
            "userId" : 291100
         },
         "badge" : {
            "points" : 25,
            "name" : "API expert",
            "id" : 1142100
         },
         "numberOfPoints" : 170,
         "numberOfBadges" : 9,
         "eventCreated" : "2023-10-20T21:03:06.371Z",
      }
   ]
}

If you use the gamification feature, LearnUpon sends the Badge Revoked webhook when a portal admin revokes (deletes) a badge from the list of badges a learner has received.

Compare to webhook v1 badge revoked.

Badge revoked attributes

Attribute Type Description
user object List of unique identifiers for an individual user
badge object List of attributes which describe the badge revoked from the user
numberOfPoints integer Number of points revoked from the learner
numberOfBadges integer Number of badges revoked from the learner
eventCreated date Date and time badge was awarded in UTC format

badge attributes

Attribute Type Description
points integer Number of points associated with this badge
name string Name of the badge: for example, Level 1 novice badge, Level 2 beginner badge
id integer Unique numeric identifier associated with the badge removed from this user

Course enrollment

Sample course enrollment webhook

{
   "data" : [
      {
         "eventCreated" : "2023-12-14T19:41:35.463Z",
         "user" : {
            "userId" : 285900,
            "email" : "bella.bell@yourdomain.com",
            "username" : null
         },
         "enrollmentId" : 18976600,
         "dueDate" : null,
         "courseId" : 2712800,
         "wasRecertified" : false
      }
   ]
}

The course enrollment hook is a JSON payload sent to your designated URL end point whenever LearnUpon successfully enrolls a learner on a course.

Course enrollment attributes

Attribute Type Description
eventCreated date Date of enrollment in UTC format
user object List of unique identifiers for an individual user
enrollmentId integer Unique identifier for this enrollment action
dueDate date The course due date for this enrollment
courseId integer Unique identifier for the course
wasRecertified boolean If you have set up recertification policies on your course certificate, and the user was awarded a certificate, this value is set to true when the user is automatically recertified by LearnUpon on the course. Default false

Course unenrollment

Sample course unenrollment webhook

{
   "data" : [
      {
         "courseId" : 2712800,
         "enrollmentId" : 18976600,
         "user" : {
            "email" : "bella.bell@yourdomain.com",
            "username" : null,
            "userId" : 2859300
         },
         "eventCreated" : "2023-12-14T19:43:33.822Z"
      }
   ]
}

The course unenrollment hook is a JSON payload sent to your designated URL end point whenever LearnUpon successfully unenrolls a learner on a course.

Course unenrollment attributes

Attribute Type Description
courseId integer Unique identifier for the course
enrollmentId integer Unique identifier for the original enrollment action
user object List of unique identifiers for an individual user
eventCreated date Date of unenrollment in UTC format

Learning path enrollment

Sample learning path enrollment webhook

{
   "data" : [
      {
         "learningPathId" : 21600,
         "dueDate" : null,
         "user" : {
            "email" : "bella.bell@yourdomain.com",
            "userId" : 2859300,
            "username" : null
         },
         "enrollmentId" : 1053300,
         "eventCreated" : "2023-12-14T19:46:06.659Z"
      }
   ]
}

The learning path enrollment hook is a JSON payload sent to your designated URL end point whenever LearnUpon successfully enrolls a learner on a learning path.

Learning path enrollment attributes

Attribute Type Description
learingPathID integer Unique identifier for the learning path
dueDate date The learning path due date for this enrollment
user object List of unique identifiers for an individual user
enrollmentId integer Unique identifier for this enrollment action
eventCreated date Date of enrollment in UTC format

Live learning event session created

Live learning event session created webhook

{
   "data" : [
      {
         "description" : "
testing webhooks v2
\n",
         "locationId" : null,
         "locationTitle" : null,
         "startTime" : "2025-11-21T18:00:00Z",
         "endTime" : "2025-11-21T19:00:00Z",
         "webinarUrl" : null,
         "customWebinarUrl" : null,
         "webinarTitle" : null,
         "createdByUserId" : 291100,
         "updatedByUserId" : null,
         "environmentType" : "in person",
         "numEnrolled" : 0,
         "completionRequirement" : "attendance required",
         "clonedFromId" : null,
         "title" : "Session created to test webhooks",
         "registerWaitlistEnabled" : true,
         "waitlistExpiry" : "2025-11-21T17:00:00Z",
         "customSessionData" : [
            {
               "customSessionDataDefinitionId" : 29950,
               "fieldValue" : "SECRET",
               "fieldLabel" : "Client code"
            },
            {
               "customSessionDataDefinitionId" : 29949,
               "fieldLabel" : "Cost center",
               "fieldValue" : [
                  "Sales"
               ]
            }
         ],
         "minimumAttendanceThreshold" : null,
         "minCapacity" : null,
         "maxCapacity" : 5,
         "sessionId" : 1574477,
         "timezone" : "Eastern Time (US & Canada)",
         "eventId" : 1449140,
         "sessionInstructorsUserIds" : [
            291160,
            291142
         ]
      }
   ]
}


The live learning event session creation and session updated webhooks have identical structures.

For session creation: LearnUpon sends a JSON payload to your designated URL end point, whenever someone creates an event session, from either the user interface or by using the API.

Live learning event session creation attributes

Attribute Type Description
sessionId integer Unique numeric identifier for the event session
eventId integer Unique numeric identifier for the live learning event
title string Session title
description string Session description
minCapacity integer Minimum number of attendees for a session
maxCapacity integer Maximum number of attendees allowed for a session
completionRequirement string One of: attendance required, attendance optional
minimumAttendanceThreshold integer For sessions with minimum attendance required only: percentage of a session learner must attend
numEnrolled integer Number of learners enrolled on a session
clonedFromId integer For cloned (copied) sessions: the ID of the original session that was cloned
startTime date Date and time the session started UTC format
endTime date Date and time the session ended UTC format
timezone string Name of the timezone where the session is happening
environmentType string One of virtual, in person, custom virtual
customWebinarUrl string URL for webinars through extnernal providers, aka not through integrations
webinarTitle string Title for the webinar set up through an integration
webinarUrl string URL for a webinar through an integration
locationId integer Unique identifier for a physical address for in-person sessions
locationTitle string Name of the physical location for in-person sessions
createdByUserId integer Unique numeric identifier for the person who created the session
updatedByUserId integer Unique numeric identifier for the person who updated the session registerWaitlistEnabled
waitlistExpiry date/time Date and time that the waitlist expires. After this time learners aren't notified of any cancellations
sessionInstructorUserIds array A list of session instructors and their unique identifiers
customSessionData array Optional: a list of customer-created session data fields

event sessionInstructorUserIds data attributes

Attribute Type Description
Id integer Unique numeric identifier for each portal user

customSessionData array attributes

Attribute Type Description
customSessionDataDefinitionId integer Unique numeric identifier for the custom session field
fieldLabel string Customer-created name for the custom session field
fieldValue One of string, string choice, integer, integer choice, decimal, decimal choice Customer-created entries for the field

Live learning event session updated

Live learning event session updated webhook

{
   "data" : [
      {
         "sessionInstructorsUserIds" : [
            291100,
            291140
         ],
         "minCapacity" : null,
         "maxCapacity" : 5,
         "numEnrolled" : 0,
         "sessionId" : 1574477,
         "webinarUrl" : null,
         "timezone" : "Eastern Time (US & Canada)",
         "title" : "Session created to test webhooks",
         "customWebinarUrl" : null,
         "completionRequirement" : "attendance required",
         "startTime" : "2025-11-24T18:00:00Z",
         "endTime" : "2025-11-24T19:00:00Z",
         "customSessionData" : [
            {
               "fieldLabel" : "Client code",
               "fieldValue" : "SECRET",
               "customSessionDataDefinitionId" : 29950
            },
            {
               "customSessionDataDefinitionId" : 29949,
               "fieldLabel" : "Cost center",
               "fieldValue" : [
                  "Sales"
               ]
            }
         ],
         "minimumAttendanceThreshold" : null,
         "waitlistExpiry" : "2025-11-24T17:00:00Z",
         "description" : "testing webhooks v2 \n",
         "createdByUserId" : 291160,
         "locationTitle" : null,
         "registerWaitlistEnabled" : true,
         "updatedByUserId" : 291160,
         "clonedFromId" : null,
         "eventId" : 1449140,
         "locationId" : null,
         "environmentType" : "in person",
         "webinarTitle" : null
      }
   ]
}

The Live learning event session creation and session updated webhooks have identical structures.

For session update: LearnUpon sends a JSON payload to your designated URL end point, whenever someone changes any details in an event session, from either the user interface or by using the API. The webhook doesn't indicate what changed, only lists the attributes including any changes.

Live learning event session updated attributes

Attribute Type Description
sessionId integer Unique numeric identifier for the event session
eventId integer Unique numeric identifier for the live learning event
title string Session title
description string Session description
minCapacity integer Minimum number of attendees for a session
maxCapacity integer Maximum number of attendees allowed for a session
completionRequirement string One of: attendance required, attendance optional
minimumAttendanceThreshold integer For sessions with minimum attendance required only: percentage of a session learner must attend
numEnrolled integer Number of learners enrolled on a session
clonedFromId integer For cloned (copied) sessions: the ID of the original session that was cloned
startTime date Date and time the session started UTC format
endTime date Date and time the session ended UTC format
timezone string Name of the timezone where the session is happening
environmentType string One of virtual, in person, custom virtual
customWebinarUrl string URL for webinars through extnernal providers, aka not through integrations
webinarTitle string Title for the webinar set up through an integration
webinarUrl string URL for a webinar through an integration
locationId integer Unique identifier for a physical address for in-person sessions
locationTitle string Name of the physical location for in-person sessions
createdByUserId integer Unique numeric identifier for the person who created the session
updatedByUserId integer Unique numeric identifier for the person who updated the session
registerWaitlistEnabled boolean Indicates if the session has a waitlist
waitlistExpiry date/time Date and time that the waitlist expires. After this time learners aren't notified of any cancellations
sessionInstructorUserIds array A list of session instructors and their unique identifiers
customSessionData array Optional: a list of customer-created session data fields

Live learning event session cancelled

Live learning event session cancellation webhook

{
   "data" : [
      {
         "sessionId" : 1574477,
         "eventId" : 1449140,
         "locationTitle" : null,
         "locationId" : null,
         "endTime" : "2025-11-24T19:00:00Z",
         "startTime" : "2025-11-24T18:00:00Z",
         "title" : "Session created to test webhooks",
         "createdByUserId" : 291160,
         "timezone" : "Eastern Time (US & Canada)",
         "clonedFromId" : null,
         "customSessionData" : [
            {
               "fieldLabel" : "Client code",
               "customSessionDataDefinitionId" : 29950,
               "fieldValue" : "SECRECT"
            },
            {
               "customSessionDataDefinitionId" : 29949,
               "fieldValue" : [
                  "Sales"
               ],
               "fieldLabel" : "Cost center"
            }
         ],
         "numEnrolled" : 0,
         "updatedByUserId" : 291160,
         "environmentType" : "in person",
         "description" : "testing webhooks v2 \n"
      }
   ]
}


The session canceled webhook is a JSON payload sent to your designated URL end point, when someone cancels an event session, from either the user interface or by using the API.

Live learning event session cancellation attributes

Attribute Type Description
sessionId integer Unique numeric identifier for the event session
eventId integer Unique numeric identifier for the live learning event
title string Session title
description string Session description
numEnrolled integer Number of learners enrolled on a session
clonedFromId integer For cloned (copied) sessions: the ID of the original session that was cloned
startTime date Date and time the session started UTC format
endTime date Date and time the session ended UTC format
timezone string Name of the timezone where the session is happening
environmentType string One of virtual, in person, custom virtual
locationId integer Unique identifier for a physical address for in-person sessions
locationTitle string Name of the physical location for in-person sessions
createdByUserId integer Unique numeric identifier for the person who created the session
updatedByUserId integer Unique numeric identifier for the person who updated the session
customSessionData array Optional: a list of customer-created session data fields

Live learning event session series created

Live learning session series created webhook

{
   "data" : [
      {
         "id" : 1580094,
         "portalId" : 13457,
         "trainingId" : 1410634,
         "descriptionHtml" : "Seasons sessions for local offices across LearnUpon",
         "descriptionText" : "Seasons sessions for local offices across LearnUpon",
         "referenceName" : "Fall and winter sessions 2025",
         "title" : "Salt Lake City office: fall and winter sessions 2025",
         "numEnrolled" : 0,
         "minCapacity" : null,
         "maxCapacity" : 5,
         "minimumAttendanceThreshold" : null,
         "completionRequirement" : "attendance required",
         "sessionParts" : [
            {
               "id" : 2111947,
               "location" : "Salt Lake City office",
               "locationId" : 126926,
               "address1" : "9 Exchange Place",
               "address2" : " Suite 400",
               "address3" : " Salt Lake City, 84111",
               "sessionType" : "classroom",
               "webinarUrl" : "N/A",
               "webinarAccountId" : null,
               "timezone" : "(GMT-07:00) Mountain Time (US & Canada)",
               "startTime" : "2025-12-01T08:00:00-07:00",
               "endTime" : "2025-12-01T09:00:00-07:00",
               "environmentType" : 1,
               "instructors" : [
                  {
                     "email" : "beatrice.dansk@yourdomain.com",
                     "firstName" : "Beatrice",
                     "lastName" : "Dansk",
                     "portalMembershipId" : 1475800,
                     "isPrimary" : false,
                     "userId" : 291160
                  },
                  {
                     "userId" : 291190,
                     "isPrimary" : true,
                     "firstName" : "Anne",
                     "lastName" : "Autriche",
                     "portalMembershipId" : 1475800,
                     "email" : "anne.autriche@yourdomain.com"
                  },
               ],
               "customSessionData" : [
                  {
                     "customSessionDataDefinitionId" : 29950,
                     "fieldValue" : "Internal",
                     "fieldLabel" : "Client code"
                  },
                  {
                     "fieldLabel" : "Cost center",
                     "customSessionDataDefinitionId" : 29949,
                     "fieldValue" : [
                        "Success"
                     ]
                  }
               ],
               "tags" : [
                  {
                     "statusId" : 1,
                     "id" : 392396,
                     "sequence" : 0,
                     "name" : "Fall scheduling for office meeting rooms",
                     "requiredAttendance" : true
                  }
               ],
            },
            {
               "environmentType" : 1,
               "timezone" : "(GMT-07:00) Mountain Time (US & Canada)",
               "startTime" : "2025-12-01T09:30:00-07:00",
               "endTime" : "2025-12-01T10:30:00-07:00",
               "instructors" : [
                  {
                     "isPrimary" : true,
                     "userId" : 291160,
                     "portalMembershipId" : 1475800,
                     "firstName" : "Beatrice",
                     "lastName" : "Dansk",
                     "email" : "beatrice.dansk@yourdomain.com",
                  },
                  {
                     "email" : "anne.autriche@yourdomain.com",
                     "firstName" : "Anne",
                     "lastName" : "Autriche",
                     "portalMembershipId" : 1475800,
                     "isPrimary" : false,
                     "userId" : 291190
                  },
               ],
               "webinarUrl" : "N/A",
               "webinarAccountId" : null,
               "id" : 2111948,
               "location" : "Salt Lake City office",
               "address1" : "9 Exchange Place",
               "address2" : " Suite 400",
               "address3" : " Salt Lake City, 84111",
               "locationId" : 126926,
               "sessionType" : "classroom",
               "tags" : [
                  {
                     "requiredAttendance" : true,
                     "name" : "Winter scheduling for office meeting rooms",
                     "id" : 392397,
                     "statusId" : 1,
                     "sequence" : 1
                  }
               ],
               "customSessionData" : [
                  {
                     "fieldLabel" : "Client code",
                     "customSessionDataDefinitionId" : 29950,
                     "fieldValue" : "External"
                  },
                  {
                     "customSessionDataDefinitionId" : 29949,
                     "fieldValue" : [
                        "Operations"
                     ],
                     "fieldLabel" : "Cost center"
                  }
               ],
            },
         ],
      }
   ]
}

The live learning webhooks have identical structures for the following webhook types:

For each event, LearnUpon sends a JSON payload to your designated URL end point, whenever someone creates, updates or cancels an event session series, from either the user interface or by using the API.

Live learning event session series attributes

Attribute Type Description
id integer Unique numeric identifier for the session series
portalId integer Unique numeric identifier for the portal where the session series is running
trainingId integer Unique numeric identifier for the event. One training_id can be associated with multiple session_series_ids
referenceName string Title for the event
title string Title for the session series
descriptionHtml string Event description in HTML
descriptionText string Event description in plain text
minCapacity integer Minimum number of attendees for a session series
maxCapacity integer Maximum number of attendees allowed for a session series
completionRequirement string One of: attendance required, attendance optional
minimumAttendanceThreshold integer For sessions with minimum attendance required only: percentage of a session learner must attend
numEnrolled integer Number of learners enrolled in a series
registerWaitlistEnabled boolean Indicates if the session series has a waitlist
waitlistExpiry date Date and time that the session series waitlist expires. After this time learners aren't notified of any cancellations or, for auto enrollment, added to any session series

sessionParts array attributes

Attribute Type Description
id integer Unique numeric identifier for the session part
sessionType string One of classroom or online
environmentType integer One of 0=virtual, 1=in person, 2=custom virtual
startTime date Date and time the session started UTC format
endTime date Date and time the session ended UTC format
timezone string Name of the timezone where the session is happening
customWebinarUrl string URL for webinars through extnernal providers, aka not through integrations
webinarTitle string Title for the webinar set up through an integration
webinarUrl string URL for a webinar through an integration
webinarAccountId integer Unique numeric identifier for a webinar account
locationId integer Unique identifier for a physical address for in-person sessions. Set to -1 for online sessions
location string Name of the physical location, or webinar
address1 string First line of the physical location address. null for webinar sessions
address2 string Second line of the physical location address. null for webinar sessions
address3 string Third line of the physical location address. null for webinar sessions
instructors array A list of session instructors and their unique identifiers
customSessionData array Optional: a list of customer-created session data fields
tags array Details about each session within a series

instructors data attributes

Attribute Type Description
userId integer Unique numeric identifier for each user
portaMembershipId integer Unique numeric identifier for instructors associated with a portal
firstName string Instructor first name
lastName string Instructor last name
email string Instructor email
isPrimary boolean Indicates if the instructor is the primary instructor, aka whose name appears on the notifications

customSessionData array attributes

Attribute Type Description
customSessionDataDefinitionId integer Unique numeric identifier for the custom session data field
fieldLabel string Customer-created name for the custom session data field
fieldValue One of string, string choice, integer, integer choice, decimal, decimal choice Customer-created entries for the field. Can be an array for multi-choice value entries

tags data attributes

Attribute Type Description
id integer Unique numeric identifier for each session tag
name string Title for an individual session within the session series
statusId integer Identifier for each session status
sequence integer Assigns the order in which the sessions run for learners. Numbers from 0 onward
requiredAttendance boolean Indicates if attendance is required to complete the series