Migrate getExternalCourse (using external ID)

This guide details how to migrate from the v1 getExternalCourse (using external ID) endpoint to the new v2 architecture. To replicate the v1 response, your integration must now perform a two-step "join" operation.

💡

Key changes

Decoupled data model: In API v2, you must call 2 endpoints to retrieve the full dataset previously available in a single v1 call.

Documentation links

Here are the links to the API reference for:

Step 1: Retrieve an external course metadata

The first step is to call the Retrieve an external course v2 endpoint. This identifies the content via its integration and external IDs and retrieves the internal 360Learning course ID required for the second step.

Endpoint mapping (Step 1):

  • API v1: /api/v1/externalContents/groups/:groupId/externalPlatforms/:externalPlatform/courses/:externalId
  • API v2: /api/v2/integrations/{integrationId}/courses/{externalId}

Input changes (Step 1)

API v1 input example

curl --location -g 'https://app.360learning.com/api/v1/externalContents/groups/62be0535045424d93edaad7b/externalPlatforms/myPlatform/courses/l3ssup3rh3r0s'

API v2 input example (Step 1)

curl --request GET \
     --url https://app.360learning.com/api/v2/integrations/507f1f77bcf86cd799439011/courses/a3215H-7 \
     --header '360-api-version: v2.0' \
     --header 'accept: application/json' \
     --header 'authorization: Bearer access_token'

Main input differences (Step 1)

Change typeAPI v1API v2
Removed
Path parameter
groupId: ID of the group where external contents were imported.

Removed
Path parameter
externalPlatform: Name of the external platform to which the external content is attached.

Added
Path parameter

integrationId (Required): The unique ID of the specific integration. This replaces the group/platform context logic.
Added
Header parameter

360-api-version (Required): API version identifier. Example: v2.0.

Output changes (Step 1)

API v1 output example

{
  "id": "6463973f9b19ff7b9ca674e9",
  "authorId": "62bdbc00293a604543f44386",
  "archived": false,
  "title": "Machine Learning Crash Course",
  "description": "Learn the basics of machine learning.",
  "language": "en",
  "courseDuration": 10,
  "skills": [
    "63970d8ec2675a57f2b3f509"
  ],
  "externalId": "l3ssup3rh3r0s",
  "externalPlatform": "myPlatform",
  "groupId": "62be0535045424d93edaad7b",
  "authors": [
    "John Doe"
  ],
  "alternativeLanguages": [
    "fr"
  ],
  "launchUrl": "https://player.mylearningplatform.com/ql/fg-q6dfax2e_6ys",
  "mobileLaunchUrl": "https://player.mylearningplatform.com/mobile/fg-q6dfax2e_6ys",
  "thumbnailUrl": "https://upload.wikimedia.org/wikipedia/commons/0/07/Wikipedia_logo_%28svg%29.svg",
  "difficultyLevel": "beginner",
  "contentType": "course",
  "numberOfVideos": 1,
  "sources": [
    {
      "name": "Wikipedia",
      "logo": "https://en.wikipedia.org/static/images/icons/wikipedia.png"
    }
  ],
  "subjects": [
    "Machine learning"
  ]
}

API v2 output example (Step 1)

{
  "defaultLang": "en",
  "externalId": "l3ssup3rh3r0s",
  "launchUrl": "https://player.mylearningplatform.com/ql/fg-q6dfax2e_6ys",
  "name": "Machine Learning Crash Course",
  "sources": [
    {
      "name": "Wikipedia",
      "logoUrl": "https://en.wikipedia.org/static/images/icons/wikipedia.png"
    }
  ],
  "subjects": [
    "Machine Learning",
    "IT"
  ],
  "contentType": "course",
  "description": "Learn the basics of machine learning.",
  "difficultyLevel": "beginner",
  "duration": 10,
  "imageUrl": "https://player.mylearningplatform.com/image/l3ssup3rh3r0s",
  "mobileLaunchUrl": "https://player.mylearningplatform.com/mobile/launch/l3ssup3rh3r0s",
  "authorId": "62bdbc00293a604543f44386",
  "courseId": "6463973f9b19ff7b9ca674e9",
  "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"
        ]
      }
    }
  ]
}

Main output differences (Step 1)

After calling Retrieve an external course, you must extract the courseId from the response body. This ID is the unique 360Learning identifier required to call Retrieve a course.

Change typeAPI v1API v2
Removed
Output property
archived: true if the external course has been deleted, otherwise false.Found in Step 2.
Removed
Output property
skills: Array of IDs of skills the external course refers to.Use List all tags in a course to get the list of tags (previously known as skills) associated with the course.
Removed
Output property
externalPlatform: Name of the external platform to which the external content is attached.Found in Step 2.
Removed
Output property
groupId: ID of the group where external contents are imported.Found in Step 2.
Removed
Output property
authors: Array with the authors of the external courseReplaced by users' internal IDs in v2. Use Retrieve a user to get full users' information.
Removed
Output property
numberOfVideos: The number of videos / activities in the external course.

Modified
Output property
id: The unique ID of the course created from this external course.courseId: Renamed.
Modified
Output property
thumbnailUrl: URL of the image of the external courseimageUrl: Renamed.
Modified
Output property
title: Title of the external coursename: Renamed.
Modified
Output property
language: Main default language of the external coursedefaultLang: Renamed.
Modified
Output property
courseDuration: Duration of the external course (in minutes)duration: Renamed.
Modified
Output property
alternativeLanguagestranslations: Array of objects with the different translations available for the external course.
Modified
Output property
sources.logo: URL of the source's logosources.logoUrl: Renamed.

Step 2: Retrieve a course metadata

Once you have the courseId from the Step 1 response, call the Courses endpoint to retrieve platform-specific attributes

Endpoint mapping (Step 2)

  • API v1: /api/v1/externalContents/groups/:groupId/externalPlatforms/:externalPlatform/courses/:externalId
  • API v2: /api/v2/courses/{courseId}

Input changes (Step 2)

API v1 input example

curl --location -g 'https://app.360learning.com/api/v1/externalContents/groups/62be0535045424d93edaad7b/externalPlatforms/myPlatform/courses/l3ssup3rh3r0s'

API v2 input example (Step 2)

curl --request GET \
     --url https://app.360learning.com/api/v2/courses/6463973f9b19ff7b9ca674e9 \
     --header '360-api-version: v2.0' \
     --header 'accept: application/json' \
     --header 'authorization: Bearer access_token'

Main input differences (Step 2)

Change typeAPI v1API v2
Removed
Path parameter
groupId: ID of the group where external contents were imported.

Removed
Path parameter
externalPlatform: Name of the external platform to which the external content is attached.

Added
Path parameter

courseId (Required): The unique ID of the course.
Added
Header parameter

360-api-version (Required): API version identifier. Example: v2.0.

Output changes (Step 2)

API v1 output example

{
  "id": "6463973f9b19ff7b9ca674e9",
  "authorId": "62bdbc00293a604543f44386",
  "archived": false,
  "title": "Machine Learning Crash Course",
  "description": "Learn the basics of machine learning.",
  "language": "en",
  "courseDuration": 10,
  "skills": [
    "63970d8ec2675a57f2b3f509"
  ],
  "externalId": "l3ssup3rh3r0s",
  "externalPlatform": "myPlatform",
  "groupId": "62be0535045424d93edaad7b",
  "authors": [
    "John Doe"
  ],
  "alternativeLanguages": [
    "fr"
  ],
  "launchUrl": "https://player.mylearningplatform.com/ql/fg-q6dfax2e_6ys",
  "mobileLaunchUrl": "https://player.mylearningplatform.com/mobile/fg-q6dfax2e_6ys",
  "thumbnailUrl": "https://upload.wikimedia.org/wikipedia/commons/0/07/Wikipedia_logo_%28svg%29.svg",
  "difficultyLevel": "beginner",
  "contentType": "course",
  "numberOfVideos": 1,
  "sources": [
    {
      "name": "Wikipedia",
      "logo": "https://en.wikipedia.org/static/images/icons/wikipedia.png"
    }
  ],
  "subjects": [
    "Machine learning"
  ]
}

API v2 output example (Step 2)

{
  "name": "Machine Learning Crash Course",
  "sourceLang": "en",
  "authorId": "62bdbc00293a604543f44386",
  "groupId": "62be0535045424d93edaad7b",
  "coAuthorIds": [
    "507f1f77bcf86cd799439011"
  ],
  "description": "Learn the basics of machine learning.",
  "duration": 10,
  "_id": "6463973f9b19ff7b9ca674e9",
  "createdAt": "2026-04-22T15:04:00.725Z",
  "defaultLang": "en",
  "modifiedAt": "2026-04-22T15:04:00.725Z",
  "status": "published",
  "translations": [
    {
      "lang": "fr",
      "published": true,
      "translatorIds": [
        "507f1f77bcf86cd799439011"
      ],
      "translatedFields": {
        "name": "Machine Learning",
        "description": "Ce module vous apprend les bases de Machine Learning !"
      }
    }
  ],
  "type": "external",
  "externalPlatform": "myPlatform",
  "currentVersionNumber": 0,
  "collaborativeLearning": true
}

Main output differences (Step 2)

Change typeAPI v1API v2
Removed
Output property
authors: Author names.Replaced by coAuthorIds (IDs instead of names).
Removed
Output property
launchUrl and mobileLaunchUrlFound in Step 1.
Removed
Output property
externalIdFound in Step 1.
Removed
Output property
sourcesFound in Step 1.
Removed
Output property
thumbnailUrlFound in Step 1 as imageUrl.
Removed
Output property
difficultyLevelFound in Step 1.
Removed
Output property
contentTypeFound in Step 1.
Removed
Output property
skills: Array of IDs of skills the external course refers to.

Removed
Output property
numberOfVideos: The number of videos / activities in the external course.

Modified
Output property
archived: Boolean. true if the external course has been deleted, otherwise false.status: The status of the course. Possible values: archived, deleted, published.
Modified
Output property
id: The unique ID of the course created from this external course._id: Renamed. (Also found in the output of Step 1)
Modified
Output property
title: Title of the external coursename: Renamed. (Also found in the output of Step 1)
Modified
Output property
courseDuration: Duration of the external course (in minutes)duration: Renamed. (Also found in the output of Step 1)
Modified
Output property
language: Defines the original language in which the course was created.sourceLang: Renamed.
Modified
Output property
alternativeLanguagestranslations
Added
Output property

coAuthorIds: Array of IDs instead of authors names.
Added
Output property

type: Identifies if the course is external, native, or elearning standard.
Added
Output property

createdAt: Timestamp.
Added
Output property

modifiedAt: Timestamp.
Added
Output property

collaborativeLearning: A boolean indicating if social features (reactions/comments) are enabled.
Added
Output property

currentVersionNumber: Tracks the iteration of the content.


Did this page help you?