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:
defaultProgresssets the starting progress, anddefaultCompletiondetermines 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_idof 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_idattribute 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_idattribute 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
forceNewproperty is used, OR - if no attempt yet exists, OR
- if the given
firstActivityAtis after thelastActivityAt/completedAtdate of all the existing attempts.
- if the
- Update the non-completed attempt(s) for which the given
firstActivityAtis before thelastActivityAt/completedAtdate.
Updated 10 days ago
