Step 4: Synchronize statistics

Before diving deeper into this step, consider a few important points:

  • 360Learning learning history relies on the concept of attempts:
    • When a learner launches an external course from 360Learning, a new attempt is created.
    • The attempt's initial state depends on your integration configuration: defaultProgress sets the starting progress, and defaultCompletion determines whether it is initially considered complete.
    • Synchronizing statistics updates the attempt to reflect the learner's most up-to-date state progress (either in progress or completed).
  • The statistics synchronization endpoint has been designed to give you the most possible flexibility: as you'll see in the explanation below and in the related endpoint's interface contract, you have a fine-grained level of control over the statistics/attempts.

Import statistics

🕑

The frequency of this step is up to you. It depends on how often you want to sync learners' progresses to 360Learning. You can rely on daily stats sync only, or decide to do it on a more frequent basis. The only limitations you'll be subject to are:

  • There can't be more than 3 concurrent bulk operations running at the same time for a given platform (once again, keep in mind that the platform here is the customer one, so you're subject to their thresholds).
  • One single statistics import allows you to import up to 10,000 statistics at once.
  • The rate-limiting on API v2 POST operations is 10 operations / second for the same companyId (embedded in the API credentials)

To import statistics in the 360Learning platform, use the Import integration statistics endpoint.

Request example

curl --request POST \
     --url https://app.360learning.com/api/v2/bulk/integrations/integrationId/stats \
     --header '360-api-version: v2.0' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
    {
      "input": [
        {
          "courseIdentifier": {
            "type": "externalId",
            "value": "l3ssup3rh3r0s"
          },
          "forceNew": false,
          "userIdentifier": {
            "type": "mail",
            "value": "[email protected]"
          },
          "progress": 100,
          "score": 90,
          "result": "success",
          "timeSpent": 3600000,
          "firstActivityAt": "2025-07-08T22:00:00.000Z",
          "lastActivityAt": "2025-07-08T22:00:00.000Z"
        }
      ]
    }
    '

Request parameters

  • integrationId: This path parameter should point to the unique _id of the previously created integration.
  • courseIdentifier: Defines which identifier is used to link the statistics to a course:
    • internalId: Use 360Learning's internal course identifier (the _id attribute of the response when retrieving a course, see Step 3 > Retrieve courses).
    • externalId: Use your own internal and unique identifier.
  • userIdentifier: Choose which identifier is use to link a user to the stats:
    • internalId: Use 360Learning's internal user identifier (the _id attribute of the response when calling the endpoint Retrieve a user).
    • mail: Use the user's email.
  • forceNew: This parameter forces the creation of a new attempt, regardless of the state of already existing attempts for this user and course.

 Response

Upon submission of this operation, you will receive a link pointing to the bulk operation that has been created. Use this link to check the status of your import.

About the endpoint behavior

The Import integration statistics can create new attempts or update existing ones:

  • Create a new attempt:
    • if the forceNew property is used, OR
    • if no attempt yet exists, OR
    • if the given firstActivityAt is after the lastActivityAt/completedAt date of all the existing attempts.
  • Update the non-completed attempt(s) for which the given firstActivityAt is before the lastActivityAt/completedAt date.