Step 3: Synchronize content

Before diving into the content synchronization process, keep in mind:

  • All content imported through integrations is created as a external course in 360Learning: Each external content item becomes a standalone course in the 360Learning group catalog.
  • API-based integrations rely on remotely hosted courses and content: Learners will be redirected to your platform when launching a course on 360Learning. Launch URLs should be HTTPS links.
  • For a given integration, courses are uniquely identified by the externalId attribute: This should be the unique identifier of the content within your platform and should be immutable.
  • Most content synchronization endpoints are bulk endpoints: They are asynchronous endpoints designed to allow massive data processing capabilities. Refer to Bulk operations to learn how to work with the bulk framework.

Integrations can create courses only. It is not possible to create or manage more complex learning objects—such as paths or classrooms—through the API. These must be created and managed directly in 360Learning.

1. Import courses

🕑

The frequency of this step is up to you. It depends on how often your content changes. You can schedule it daily or call it multiple times per day if needed.

Now that you have created your integration configuration, use the Upsert external courses endpoint to start importing courses.

⚠️ You can import up to 10,000 courses at once. We recommend importing large batches rather than multiple smaller ones, since the customer platform allows no more than 3 concurrent bulk operations at a time.

Example request

curl --request PUT \
     --url https://app.360learning.com/api/v2/bulk/integrations/integrationId/courses \
     --header '360-api-version: v2.0' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
    {
      "input": [
        {
          "defaultLang": "bg",
          "externalId": "l3ssup3rh3r0s",
          "launchUrl": "https://player.mylearningplatform.com/launch/l3ssup3rh3r0s",
          "name": "Machine Learning Crash Course",
          "sources": [
            {
              "name": "Wikipedia",
              "logoUrl": "https://en.wikipedia.org/static/images/icons/wikipedia.png"
            }
          ],
          "subjects": [
            "Machine Learning",
            "IT"
          ],
          "contentType": "article",
          "description": "Learn the basics of machine learning.",
          "difficultyLevel": "advanced",
          "duration": 45,
          "imageUrl": "https://player.mylearningplatform.com/image/l3ssup3rh3r0s",
          "mobileLaunchUrl": "https://player.mylearningplatform.com/mobile/launch/l3ssup3rh3r0s",
          "authorId": "507f1f77bcf86cd799439011",
          "translations": [
            {
              "lang": "fr",
              "translatedFields": {
                "description": "Apprenez les bases de l\'apprentissage automatique.",
                "launchUrl": "https://player.mylearningplatform.com/launch/l3ssup3rh3r0s/fr",
                "mobileLaunchUrl": "https://player.mylearningplatform.com/mobile/launch/l3ssup3rh3r0s/fr",
                "name": "Cours intensif sur l\'apprentissage automatique",
                "subjects": [
                  "Apprentissage automatique",
                  "TI"
                ]
              }
            }
          ]
        }
      ]
    }
    '

Request parameters

  • integrationId: This path parameter should point to the unique _id of the previously created integration.
  • externalId: The unique identifier of the course within your platform. If a course already exists in 360Learning for the same integration and with the same externalId, this course will be updated with the provided values (others will remain unchanged). Otherwise, a new course will be created.
  • launchURL: This is the URL (on your platform) to which the learner will be redirected on web browsers.
  • mobileLaunchURL: This is the URL (on your platform) to which the learner will be redirected on mobile devices. If not set, launchURL will be used on mobile devices.
  • translations: Contains the translations of your course. If your customer has the Globalization solution, course translations must be provided in the same object as the course’s default version; otherwise, they will be treated as separate courses rather than translated versions of the same course. Launch URLs can differ between translations.
    • If the payload includes translations but the customer does not have the Globalization solution enabled, the API returns a 400 error with the code globalizationSolutionNotEnabled.

Response

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

2. Update courses

🕑

The frequency of this step is up to you. As with course import, this depends on your specific workflow. What we are seeing is that most of our partners/integrators perform course import and update on the same frequency, during a generic "Catalog sync" step.

To update courses, also use the Upsert external courses endpoint.

Provide the externalId of already imported courses, and they will be updated with the values in your payload. Any attributes not included in the payload will remain unchanged.

⚠️ You can update up to 10,000 courses at once. Updating a course does not affect any previously imported statistics.

3. Archive courses

🕑

The frequency of this step is up to you. It depends on how often your content changes. You can schedule it daily or call it multiple times per day if needed.

To massively archive courses, use the Archive external courses endpoint.

Example request

curl --request DELETE \
     --url https://app.360learning.com/api/v2/bulk/integrations/integrationId/courses \
     --header '360-api-version: v2.0' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
      {
        "input": [
          {
            "externalId": "l3ssup3rh3r0s"
          }
        ]
      }
      '

The interface contract is straightforward: Input a list of externalIds you want to archive, and let the bulk framework do the rest!

⚠️ When archiving a course in the 360Learning platform:

  • Learning history and statistics will be preserved.
  • The course will no longer be accessible to learners.
  • It will not be possible to add the course to a path anymore.

4. (Optional) Retrieve courses

🕑

This step is optional. While not required for a basic integration, retrieving a course provides its internal _id, which is needed for subsequent API operations such as listing tags or fetching statistics.

Use the Retrieve an external course endpoint. Provide the integrationId and the course's externalId to receive the full course entity, including its _id.

Example response

{
  "defaultLang": "bg",
  "externalId": "l3ssup3rh3r0s",
  "launchUrl": "https://player.mylearningplatform.com/launch/l3ssup3rh3r0s",
  "name": "Machine Learning Crash Course",
  "sources": [
    {
      "name": "Wikipedia",
      "logoUrl": "https://en.wikipedia.org/static/images/icons/wikipedia.png"
    }
  ],
  "subjects": [
    "Machine Learning",
    "IT"
  ],
  "contentType": "article",
  "description": "Learn the basics of machine learning.",
  "difficultyLevel": "advanced",
  "duration": 45,
  "imageUrl": "https://player.mylearningplatform.com/image/l3ssup3rh3r0s",
  "mobileLaunchUrl": "https://player.mylearningplatform.com/mobile/launch/l3ssup3rh3r0s",
  "authorId": "507f1f77bcf86cd799439011",
  "courseId": "507f1f77bcf86cd799439011",
  "translations": [
    {
      "lang": "fr",
      "translatedFields": {
        "description": "Apprenez les bases de l'apprentissage automatique.",
        "launchUrl": "https://player.mylearningplatform.com/launch/l3ssup3rh3r0s/fr",
        "mobileLaunchUrl": "https://player.mylearningplatform.com/mobile/launch/l3ssup3rh3r0s/fr",
        "name": "Cours intensif sur l'apprentissage automatique",
        "subjects": [
          "Apprentissage automatique",
          "TI"
        ]
      }
    }
  ]
}