openapi: 3.1.0 info: title: Bulk Authentication Integrations API description: '' version: 1.0.0 contact: {} servers: - url: https://app.360learning.com description: Production EU - url: https://app.us.360learning.com description: Production US tags: - name: Integrations paths: /api/v2/bulk/integrations/{integrationId}/courses: delete: description: '> πŸ”‘ > > Required OAuth scope: `integrations:bulk`. > 🚜 > > This endpoint processes up to 1,000 objects asynchronously. For more information, see the [Bulk operations guide](doc:bulk-operations-1). Archives multiple external courses in bulk based on the provided integration ID. Upon submission, the request is queued. Use the provided URL in the response header to check the status of the bulk operation.' operationId: v2.bulk.integrations.ArchiveExternalCoursesController_archiveExternalCourses parameters: - name: 360-api-version in: header description: The version of the API. required: true schema: type: string enum: - v2.0 - name: integrationId required: true in: path description: The unique ID of the integration. schema: format: ObjectId pattern: ^[a-fA-F0-9]{24}$ example: 507f1f77bcf86cd799439011 type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ArchiveExternalCoursesBody' responses: '202': description: The operation is successfully created. headers: Location: schema: type: string description: 'The URL to retrieve the status of the bulk operation using its operation ID. Example: `https://app.360learning.com/api/v2/bulk/operations/507f1f77bcf86cd799439011`.' example: https://app.360learning.com/api/v2/bulk/operations/507f1f77bcf86cd799439011 '400': description: The server cannot or will not process the request due to something that is perceived to be a client error. content: application/json: schema: oneOf: - description: The input of a bulk operation must be an array. title: Invalid Input type: object properties: error: type: object properties: code: type: string enum: - invalidInput message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error - description: The input array size exceeds the maximum limit of 1,000 objects. title: Input Too Long type: object properties: error: type: object properties: code: type: string enum: - inputTooLong message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error - description: The platform is one of the reserved ones. title: Reserved Platform Name type: object properties: error: type: object properties: code: type: string enum: - reservedPlatformName message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '401': description: The given access token is either missing, invalid, has expired, or has been revoked. content: application/json: schema: type: object properties: error: type: string enum: - invalid_token required: - error '403': description: The given access token does not have the required OAuth scope to execute the request. content: application/json: schema: title: Invalid Scope type: object properties: error: type: object properties: code: type: string enum: - invalid_scope message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '404': description: The given `integrationId` does not correspond to any existing integration. content: application/json: schema: title: Integration Not Found type: object properties: error: type: object properties: code: type: string enum: - integrationNotFound message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '429': description: The maximum number of concurrent operations has been reached. content: application/json: schema: title: Bulk Operations Concurrency Limit Reached type: object properties: error: type: object properties: code: type: string enum: - bulkOperationsConcurrencyLimitReached message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '503': description: The bulk API is temporarily disabled. content: application/json: schema: title: Bulk API Disabled type: object properties: error: type: object properties: code: type: string enum: - bulkAPIDisabled message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error security: - oauth2: [] summary: Archive external courses tags: - Integrations put: description: '> πŸ”‘ > > Required OAuth scope: `integrations:bulk`. > 🚜 > > This endpoint processes up to 10,000 objects asynchronously. For more information, see the [Bulk operations guide](doc:bulk-operations-1). Adds or replaces multiple external courses based on the given `integrationId` and the courses''s `externalId`. - If a provided `externalId` matches an existing external course, the course is replaced with the new data. - If no match is found, a new course is created and added to the group catalog and library. Upon submission, the request is queued. Use the provided URL in the response header to check the status of the bulk operation.' operationId: v2.bulk.integrations.ImportExternalCoursesController_importExternalCourses parameters: - name: 360-api-version in: header description: The version of the API. required: true schema: type: string enum: - v2.0 - name: integrationId required: true in: path description: The unique ID of the integration. schema: format: ObjectId pattern: ^[a-fA-F0-9]{24}$ example: 507f1f77bcf86cd799439011 type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ImportExternalCoursesBody' responses: '202': description: The operation is successfully created. headers: Location: schema: type: string description: 'The URL to retrieve the status of the bulk operation using its operation ID. Example: `https://app.360learning.com/api/v2/bulk/operations/507f1f77bcf86cd799439011`.' example: https://app.360learning.com/api/v2/bulk/operations/507f1f77bcf86cd799439011 '400': description: The server cannot or will not process the request due to something that is perceived to be a client error. content: application/json: schema: oneOf: - description: The input of a bulk operation must be an array. title: Invalid Input type: object properties: error: type: object properties: code: type: string enum: - invalidInput message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error - description: The input array size exceeds the maximum limit of 10,000 objects. title: Input Too Long type: object properties: error: type: object properties: code: type: string enum: - inputTooLong message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error - description: The platform is one of the reserved ones. title: Reserved Platform Name type: object properties: error: type: object properties: code: type: string enum: - reservedPlatformName message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '401': description: The given access token is either missing, invalid, has expired, or has been revoked. content: application/json: schema: type: object properties: error: type: string enum: - invalid_token required: - error '403': description: The given access token does not have the required OAuth scope to execute the request. content: application/json: schema: title: Invalid Scope type: object properties: error: type: object properties: code: type: string enum: - invalid_scope message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '404': description: The given `integrationId` does not correspond to any existing integration. content: application/json: schema: title: Integration Not Found type: object properties: error: type: object properties: code: type: string enum: - integrationNotFound message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '429': description: The maximum number of concurrent operations has been reached. content: application/json: schema: title: Bulk Operations Concurrency Limit Reached type: object properties: error: type: object properties: code: type: string enum: - bulkOperationsConcurrencyLimitReached message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '503': description: The bulk API is temporarily disabled. content: application/json: schema: title: Bulk API Disabled type: object properties: error: type: object properties: code: type: string enum: - bulkAPIDisabled message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error security: - oauth2: [] summary: Upsert external courses tags: - Integrations /api/v2/bulk/integrations/{integrationId}/stats: post: description: '> πŸ”‘ > > Required OAuth scope: `integrations:bulk`. > 🚜 > > This endpoint processes up to 10,000 objects asynchronously. For more information, see the [Bulk operations guide](doc:bulk-operations-1). Imports multiple integration statistics in bulk based on the provided `integrationId`. This endpoint will: - Create a new attempt if any of the following is true: `forceNew` is set to `true`; no attempt currently exists for the course and user; or `firstActivityAt` is later than the `lastActivityAt` or `completedAt` of all existing attempts. - Update existing non-completed attempts if `firstActivityAt` is earlier than the `lastActivityAt` or `completedAt` of those attempts. Upon submission, the request is queued. Use the provided URL in the response header to check the status of the bulk operation.' operationId: v2.bulk.integrations.ImportExternalStatisticsController_importExternalStatistics parameters: - name: 360-api-version in: header description: The version of the API. required: true schema: type: string enum: - v2.0 - name: integrationId required: true in: path description: The unique ID of the integration. schema: format: ObjectId pattern: ^[a-fA-F0-9]{24}$ example: 507f1f77bcf86cd799439011 type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ImportExternalStatisticsBody' responses: '202': description: The operation is successfully created. headers: Location: schema: type: string description: 'The URL to retrieve the status of the bulk operation using its operation ID. Example: `https://app.360learning.com/api/v2/bulk/operations/507f1f77bcf86cd799439011`.' example: https://app.360learning.com/api/v2/bulk/operations/507f1f77bcf86cd799439011 '400': description: The server cannot or will not process the request due to something that is perceived to be a client error. content: application/json: schema: oneOf: - description: The input of a bulk operation must be an array. title: Invalid Input type: object properties: error: type: object properties: code: type: string enum: - invalidInput message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error - description: The input array size exceeds the maximum limit of 10,000 objects. title: Input Too Long type: object properties: error: type: object properties: code: type: string enum: - inputTooLong message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error - description: The platform is one of the reserved ones. title: Reserved Platform Name type: object properties: error: type: object properties: code: type: string enum: - reservedPlatformName message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '401': description: The given access token is either missing, invalid, has expired, or has been revoked. content: application/json: schema: type: object properties: error: type: string enum: - invalid_token required: - error '403': description: The given access token does not have the required OAuth scope to execute the request. content: application/json: schema: title: Invalid Scope type: object properties: error: type: object properties: code: type: string enum: - invalid_scope message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '404': description: The given `integrationId` does not correspond to any existing integration. content: application/json: schema: title: Integration Not Found type: object properties: error: type: object properties: code: type: string enum: - integrationNotFound message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '429': description: The maximum number of concurrent operations has been reached. content: application/json: schema: title: Bulk Operations Concurrency Limit Reached type: object properties: error: type: object properties: code: type: string enum: - bulkOperationsConcurrencyLimitReached message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '503': description: The bulk API is temporarily disabled. content: application/json: schema: title: Bulk API Disabled type: object properties: error: type: object properties: code: type: string enum: - bulkAPIDisabled message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error security: - oauth2: [] summary: Import integration statistics tags: - Integrations /api/v2/integrations: post: description: '> πŸ”‘ > > Required OAuth scope: `integrations:write`. Create an integration configuration.' operationId: v2.integrations.CreateIntegrationController_createIntegration parameters: - name: 360-api-version in: header description: The version of the API. required: true schema: type: string enum: - v2.0 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BaseIntegrationDTO' responses: '201': description: Returns the created integration configuration. content: application/json: schema: $ref: '#/components/schemas/IntegrationDTO' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error. content: application/json: schema: oneOf: - description: The given `externalPlatform` already has an integration defined for this group. title: Duplicate External Platform type: object properties: error: type: object properties: code: type: string enum: - duplicateExternalPlatform message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error - description: The maximum number of integration configurations has been reached. title: Integrations Limit Reached type: object properties: error: type: object properties: code: type: string enum: - integrationsLimitReached message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error - description: The platform is one of the reserved ones. title: Reserved Platform Name type: object properties: error: type: object properties: code: type: string enum: - reservedPlatformName message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '401': description: The given access token is either missing, invalid, has expired, or has been revoked. content: application/json: schema: type: object properties: error: type: string enum: - invalid_token required: - error '403': description: The given access token does not have the required OAuth scope to execute the request. content: application/json: schema: title: Invalid Scope type: object properties: error: type: object properties: code: type: string enum: - invalid_scope message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '404': description: The server cannot find the requested resource. content: application/json: schema: oneOf: - description: The given `groupId` does not correspond to any existing group. title: Group Not Found type: object properties: error: type: object properties: code: type: string enum: - groupNotFound message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error - description: The given `authorId` does not correspond to any existing user. title: User Not Found type: object properties: error: type: object properties: code: type: string enum: - userNotFound message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '429': description: 'The client has sent too many requests in a short amount of time. ' content: application/json: schema: type: object properties: error: type: string enum: - tooManyRequests required: - error security: - oauth2: [] summary: Create an integration configuration tags: - Integrations get: description: '> πŸ”‘ > > Required OAuth scope: `integrations:read`. > πŸ“– > > This endpoint is paginated with a page size of 100 integration configurations. For more information, see the [Pagination guide](doc:pagination). Lists all integration configurations.' operationId: v2.integrations.GetIntegrationsController_getIntegrations parameters: - name: 360-api-version in: header description: The version of the API. required: true schema: type: string enum: - v2.0 - name: externalPlatform required: false in: query style: deepObject explode: true description: 'Filter on **externalPlatform** property with LHS bracket notation. Expected value format is a string.' schema: properties: eq: type: string description: Filter on values equal to the given one example: loremIpsum ne: type: string description: Filter on values not equal to the given one example: loremIpsum in: type: array description: Filter on values including the given ones items: type: string example: loremIpsum nin: type: array description: Filter on values excluding the given ones items: type: string example: loremIpsum responses: '200': description: Returns one page of 100 integration configurations. headers: Link: schema: type: string description: 'URL (between `<` `>`) to fetch the immediate next page of results. For more information, see our [Pagination guide](doc:pagination). ⚠️ Only included if there is another page of results.' example: ; rel="next" content: application/json: schema: type: array items: $ref: '#/components/schemas/IntegrationDTO' '401': description: The given access token is either missing, invalid, has expired, or has been revoked. content: application/json: schema: type: object properties: error: type: string enum: - invalid_token required: - error '403': description: The given access token does not have the required OAuth scope to execute the request. content: application/json: schema: title: Invalid Scope type: object properties: error: type: object properties: code: type: string enum: - invalid_scope message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '429': description: 'The client has sent too many requests in a short amount of time. ' content: application/json: schema: type: object properties: error: type: string enum: - tooManyRequests required: - error security: - oauth2: [] summary: List integration configurations tags: - Integrations /api/v2/integrations/{integrationId}: delete: description: '> πŸ”‘ > > Required OAuth scope: `integrations:write`. Deletes a specific configuration given its unique ID and archives all its related content.' operationId: v2.integrations.DeleteIntegrationController_deleteIntegration parameters: - name: 360-api-version in: header description: The version of the API. required: true schema: type: string enum: - v2.0 - name: integrationId required: true in: path description: The unique ID of the integration. schema: format: ObjectId pattern: ^[a-fA-F0-9]{24}$ example: 507f1f77bcf86cd799439011 type: string responses: '204': description: Deletes a specific integration configuration. '400': description: The platform is one of the reserved ones. content: application/json: schema: title: Reserved Platform Name type: object properties: error: type: object properties: code: type: string enum: - reservedPlatformName message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '401': description: The given access token is either missing, invalid, has expired, or has been revoked. content: application/json: schema: type: object properties: error: type: string enum: - invalid_token required: - error '403': description: The given access token does not have the required OAuth scope to execute the request. content: application/json: schema: title: Invalid Scope type: object properties: error: type: object properties: code: type: string enum: - invalid_scope message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '404': description: The given `integrationId` does not correspond to any existing integration. content: application/json: schema: title: Integration Not Found type: object properties: error: type: object properties: code: type: string enum: - integrationNotFound message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '429': description: 'The client has sent too many requests in a short amount of time. ' content: application/json: schema: type: object properties: error: type: string enum: - tooManyRequests required: - error security: - oauth2: [] summary: Delete an integration configuration tags: - Integrations patch: description: '> πŸ”‘ > > Required OAuth scope: `integrations:write`. Edits specific fields of an existing integration configuration. Fields not included in the request payload remain unchanged.' operationId: v2.integrations.EditIntegrationController_editIntegration parameters: - name: 360-api-version in: header description: The version of the API. required: true schema: type: string enum: - v2.0 - name: integrationId required: true in: path description: The unique ID of the integration. schema: format: ObjectId pattern: ^[a-fA-F0-9]{24}$ example: 507f1f77bcf86cd799439011 type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PatchIntegrationDTO' responses: '200': description: Returns the updated integration. content: application/json: schema: $ref: '#/components/schemas/BaseIntegrationDTO' '400': description: The server cannot or will not process the request due to something that is perceived to be a client error. content: application/json: schema: oneOf: - description: The given `externalPlatform` already has an integration defined for this group. title: Duplicate External Platform type: object properties: error: type: object properties: code: type: string enum: - duplicateExternalPlatform message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error - description: The platform is one of the reserved ones. title: Reserved Platform Name type: object properties: error: type: object properties: code: type: string enum: - reservedPlatformName message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '401': description: The given access token is either missing, invalid, has expired, or has been revoked. content: application/json: schema: type: object properties: error: type: string enum: - invalid_token required: - error '403': description: The given access token does not have the required OAuth scope to execute the request. content: application/json: schema: title: Invalid Scope type: object properties: error: type: object properties: code: type: string enum: - invalid_scope message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '404': description: The server cannot find the requested resource. content: application/json: schema: oneOf: - description: The given `integrationId` does not correspond to any existing integration. title: Integration Not Found type: object properties: error: type: object properties: code: type: string enum: - integrationNotFound message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error - description: The given `groupId` does not correspond to any existing group. title: Group Not Found type: object properties: error: type: object properties: code: type: string enum: - groupNotFound message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error - description: The given `authorId` does not correspond to any existing user. title: User Not Found type: object properties: error: type: object properties: code: type: string enum: - userNotFound message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '429': description: 'The client has sent too many requests in a short amount of time. ' content: application/json: schema: type: object properties: error: type: string enum: - tooManyRequests required: - error security: - oauth2: [] summary: Edit an integration configuration tags: - Integrations /api/v2/integrations/{integrationId}/courses/{externalId}: get: description: '> πŸ”‘ > > Required OAuth scope: `integrations:read`. Retrieves the details of a specific course with the provided external platform course ID.' operationId: v2.integrations.GetExternalCourseController_getExternalCourse parameters: - name: 360-api-version in: header description: The version of the API. required: true schema: type: string enum: - v2.0 - name: integrationId required: true in: path description: The unique ID of the integration the course has been imported for. schema: format: ObjectId pattern: ^[a-fA-F0-9]{24}$ example: 507f1f77bcf86cd799439011 type: string - name: externalId required: true in: path description: The unique external ID of the course. schema: minLength: 1 example: a3215H-7 type: string responses: '200': description: Returns the details of the given external course. content: application/json: schema: $ref: '#/components/schemas/ExternalCourseResponseDTO' '400': description: The given `externalId` does not belong to the given integration. content: application/json: schema: title: Course Not Belong To Integration type: object properties: error: type: object properties: code: type: string enum: - courseNotBelongToIntegration message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '401': description: The given access token is either missing, invalid, has expired, or has been revoked. content: application/json: schema: type: object properties: error: type: string enum: - invalid_token required: - error '403': description: The given access token does not have the required OAuth scope to execute the request. content: application/json: schema: title: Invalid Scope type: object properties: error: type: object properties: code: type: string enum: - invalid_scope message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '404': description: The given `integrationId` does not correspond to any existing integration. content: application/json: schema: title: Integration Not Found type: object properties: error: type: object properties: code: type: string enum: - integrationNotFound message: type: string example: A human-readable message to help with debugging. required: - code - message required: - error '429': description: 'The client has sent too many requests in a short amount of time. ' content: application/json: schema: type: object properties: error: type: string enum: - tooManyRequests required: - error security: - oauth2: [] summary: Retrieve an external course tags: - Integrations components: schemas: ExternalCourseSourceDTO: title: External Course Source type: object properties: name: type: string example: Wikipedia description: The name of the source. minLength: 1 logoUrl: type: string example: https://en.wikipedia.org/static/images/icons/wikipedia.png description: The logo URL of the source. minLength: 1 required: - name ExternalCourseTranslatedFields: title: External Course Translated Fields type: object properties: description: type: string description: The translation of the field `description` for this language. example: Apprenez les bases de l'apprentissage automatique. minLength: 1 launchUrl: type: string description: The URL to launch and play the external course in this language. example: https://player.mylearningplatform.com/launch/l3ssup3rh3r0s/fr minLength: 1 mobileLaunchUrl: type: string description: The URL to launch and play the external course from a mobile in this language. example: https://player.mylearningplatform.com/mobile/launch/l3ssup3rh3r0s/fr minLength: 1 name: type: string description: The translation of the field `name` for this language. example: Cours intensif sur l'apprentissage automatique minLength: 1 subjects: description: The translation of the field `subjects` for this language. example: - Apprentissage automatique - TI type: array items: type: string minLength: 1 ExternalCourseResponseDTO: title: External Course Response type: object properties: defaultLang: type: string enum: - bg - cs - da - de - el - en - es - fi - fr - hr - ht_HT - hu - id - it - ja - kar_MM - ko - lt - mh_MH - nl - nl_BE - 'no' - pl - pt - ro - ru - rw_RW - sk - sl - so_SO - sv - sw_KE - th - ti_ET - tr - uk - zh - am_ET - bn - bs - ca - cy - en_CA - en_GB - es_AR - es_MX - et - fr_CA - gu - he_IL - hy - kk - km - lo - lv - mi - mn_MN - mr - ms - my_MM - nn_NO - or - pa - pt_BR - pt_MZ - rn_BI - si - ta - te - tl_PH - ur - uz - yo_NG - zh_tw - el - hi - sr - ar - vi - zh_HANT description: The language of the external course which is displayed by default when the learner’s profile language is not available. The `name`, `description`, `subjects`, `launchUrl`, and `mobileLaunchUrl` values must be coherent with this language. externalId: type: string example: l3ssup3rh3r0s description: The unique external ID of the external course. minLength: 1 launchUrl: type: string example: https://player.mylearningplatform.com/launch/l3ssup3rh3r0s description: The URL to launch and play the external course. minLength: 1 name: type: string example: Machine Learning Crash Course description: The title of the external course. minLength: 1 sources: description: The list of sources of the external course. type: array items: $ref: '#/components/schemas/ExternalCourseSourceDTO' subjects: example: - Machine Learning - IT description: The list of subjects of the external course. type: array items: type: string minLength: 1 contentType: type: string enum: - article - assessment - audiobook - book - certificate - channel - course - curriculum - interactive - journey - labs - linkedContent - mooc - podcast - program - roleplay - specialization - topvoice - video description: The type of the external course. If not set, `course` type is used. description: type: string example: Learn the basics of machine learning. description: The description of the external course. minLength: 1 difficultyLevel: type: string enum: - advanced - beginner - intermediate description: The level of difficulty of the external course. duration: type: integer minimum: 1 maximum: 100000 example: 45 description: The duration of the external course, in minutes. imageUrl: type: string example: https://player.mylearningplatform.com/image/l3ssup3rh3r0s description: The URL of the image of the external course. minLength: 1 mobileLaunchUrl: type: string example: https://player.mylearningplatform.com/mobile/launch/l3ssup3rh3r0s description: The URL to launch and play the external course from a mobile. If not set, the `launchUrl` is used. minLength: 1 authorId: type: string description: The unique ID of the author. format: ObjectId example: 507f1f77bcf86cd799439011 pattern: ^[a-fA-F0-9]{24}$ courseId: type: string description: The unique ID of the course created from this external course. format: ObjectId example: 507f1f77bcf86cd799439011 pattern: ^[a-fA-F0-9]{24}$ translations: description: The different translations available for the external course. type: array items: $ref: '#/components/schemas/ExternalCourseTranslationDTO' required: - defaultLang - externalId - launchUrl - name - sources - subjects - authorId - courseId - translations ImportExternalCoursesBody: title: Import External Courses Body type: object properties: input: description: An array of objects, each specifying details for external course to be imported. maxItems: 10000 type: array items: $ref: '#/components/schemas/ExternalCourseDTO' required: - input ArchiveExternalCoursesBody: title: Archive External Courses Body type: object properties: input: description: An array of objects, each specifying details for external course to be archived. maxItems: 1000 type: array items: $ref: '#/components/schemas/ArchiveExternalCourseDTO' required: - input UserIdentifierDTO: title: User Identifier type: object properties: type: type: string enum: - mail - internalId description: 'Type of user identifier. `mail`: learner mail. `internalId`: learner internal identifier used on 360Learning platform.' value: type: string description: Value of the user identifier given the type provided. example: j.doe@hotmail.com minLength: 1 required: - type - value BaseIntegrationDTO: title: Base Integration type: object properties: defaultCompletion: type: boolean description: True if the content is auto-completed at launch; false otherwise. defaultProgress: type: integer description: The completion rate at launch as a percentage. minimum: 0 maximum: 100 noGroupPropagation: type: boolean description: If true, the content is visible only within the integration group and is not propagated to subgroups. If false, the content is propagated to all subgroups. externalPlatformLogoUrl: type: string description: The URL of the logo of the external platform this integration is created for. The URL must be a valid HTTPS URL pointing to a logo with transparent background. externalPlatformUnicolorLogoUrl: type: string description: The URL of the unicolor logo of the external platform this integration is created for. The URL must be a valid HTTPS URL pointing to a logo with transparent background. If none is provided, the externalPlatformLogoUrl logo will be used. externalPlatform: type: string description: The identifier of the external platform this integration is created for. example: My Platform minLength: 1 authorId: type: string description: The unique ID of the author of the imported content. format: ObjectId example: 507f1f77bcf86cd799439011 pattern: ^[a-fA-F0-9]{24}$ groupId: type: string description: The unique ID of the group to which the content is imported. format: ObjectId example: 507f1f77bcf86cd799439011 pattern: ^[a-fA-F0-9]{24}$ required: - externalPlatform - authorId - groupId ArchiveExternalCourseDTO: title: Archive External Course type: object properties: externalId: type: string description: Unique external identifier of the course to archive. example: l3ssup3rh3r0s minLength: 1 required: - externalId PatchIntegrationDTO: title: Patch Integration type: object properties: defaultCompletion: type: boolean description: True if the content is auto-completed at launch; false otherwise. defaultProgress: type: integer description: The completion rate at launch as a percentage. minimum: 0 maximum: 100 noGroupPropagation: type: boolean description: If true, the content is visible only within the integration group and is not propagated to subgroups. If false, the content is propagated to all subgroups. externalPlatformLogoUrl: type: string description: The URL of the logo of the external platform this integration is created for. The URL must be a valid HTTPS URL pointing to a logo with transparent background. externalPlatformUnicolorLogoUrl: type: string description: The URL of the unicolor logo of the external platform this integration is created for. The URL must be a valid HTTPS URL pointing to a logo with transparent background. If none is provided, the externalPlatformLogoUrl logo will be used. externalPlatform: type: string description: The identifier of the external platform this integration is created for. example: My Platform minLength: 1 authorId: type: string description: The unique ID of the author of the imported content. format: ObjectId example: 507f1f77bcf86cd799439011 pattern: ^[a-fA-F0-9]{24}$ groupId: type: string description: The unique ID of the group to which the content is imported. format: ObjectId example: 507f1f77bcf86cd799439011 pattern: ^[a-fA-F0-9]{24}$ IntegrationDTO: title: Integration type: object properties: defaultCompletion: type: boolean description: True if the content is auto-completed at launch; false otherwise. defaultProgress: type: integer description: The completion rate at launch as a percentage. minimum: 0 maximum: 100 noGroupPropagation: type: boolean description: If true, the content is visible only within the integration group and is not propagated to subgroups. If false, the content is propagated to all subgroups. externalPlatformLogoUrl: type: string description: The URL of the logo of the external platform this integration is created for. The URL must be a valid HTTPS URL pointing to a logo with transparent background. externalPlatformUnicolorLogoUrl: type: string description: The URL of the unicolor logo of the external platform this integration is created for. The URL must be a valid HTTPS URL pointing to a logo with transparent background. If none is provided, the externalPlatformLogoUrl logo will be used. externalPlatform: type: string description: The identifier of the external platform this integration is created for. example: My Platform minLength: 1 authorId: type: string description: The unique ID of the author of the imported content. format: ObjectId example: 507f1f77bcf86cd799439011 pattern: ^[a-fA-F0-9]{24}$ groupId: type: string description: The unique ID of the group to which the content is imported. format: ObjectId example: 507f1f77bcf86cd799439011 pattern: ^[a-fA-F0-9]{24}$ _id: type: string description: The unique ID of the integration. format: ObjectId example: 507f1f77bcf86cd799439011 pattern: ^[a-fA-F0-9]{24}$ required: - externalPlatform - authorId - groupId - _id ExternalCourseDTO: title: External Course type: object properties: defaultLang: type: string enum: - bg - cs - da - de - el - en - es - fi - fr - hr - ht_HT - hu - id - it - ja - kar_MM - ko - lt - mh_MH - nl - nl_BE - 'no' - pl - pt - ro - ru - rw_RW - sk - sl - so_SO - sv - sw_KE - th - ti_ET - tr - uk - zh - am_ET - bn - bs - ca - cy - en_CA - en_GB - es_AR - es_MX - et - fr_CA - gu - he_IL - hy - kk - km - lo - lv - mi - mn_MN - mr - ms - my_MM - nn_NO - or - pa - pt_BR - pt_MZ - rn_BI - si - ta - te - tl_PH - ur - uz - yo_NG - zh_tw - el - hi - sr - ar - vi - zh_HANT description: The language of the external course which is displayed by default when the learner’s profile language is not available. The `name`, `description`, `subjects`, `launchUrl`, and `mobileLaunchUrl` values must be coherent with this language. externalId: type: string example: l3ssup3rh3r0s description: The unique external ID of the external course. minLength: 1 launchUrl: type: string example: https://player.mylearningplatform.com/launch/l3ssup3rh3r0s description: The URL to launch and play the external course. minLength: 1 name: type: string example: Machine Learning Crash Course description: The title of the external course. minLength: 1 sources: description: The list of sources of the external course. type: array items: $ref: '#/components/schemas/ExternalCourseSourceDTO' subjects: example: - Machine Learning - IT description: The list of subjects of the external course. type: array items: type: string minLength: 1 contentType: type: string enum: - article - assessment - audiobook - book - certificate - channel - course - curriculum - interactive - journey - labs - linkedContent - mooc - podcast - program - roleplay - specialization - topvoice - video description: The type of the external course. If not set, `course` type is used. description: type: string example: Learn the basics of machine learning. description: The description of the external course. minLength: 1 difficultyLevel: type: string enum: - advanced - beginner - intermediate description: The level of difficulty of the external course. duration: type: integer minimum: 1 maximum: 100000 example: 45 description: The duration of the external course, in minutes. imageUrl: type: string example: https://player.mylearningplatform.com/image/l3ssup3rh3r0s description: The URL of the image of the external course. minLength: 1 mobileLaunchUrl: type: string example: https://player.mylearningplatform.com/mobile/launch/l3ssup3rh3r0s description: The URL to launch and play the external course from a mobile. If not set, the `launchUrl` is used. minLength: 1 authorId: type: string description: The unique ID of the author. If not set, the `authorId` from the integration is used. format: ObjectId example: 507f1f77bcf86cd799439011 pattern: ^[a-fA-F0-9]{24}$ translations: description: The different translations available for the external course. type: array items: $ref: '#/components/schemas/ExternalCourseTranslationDTO' required: - defaultLang - externalId - launchUrl - name - sources - subjects ImportExternalStatisticsBody: title: Import External Statistics Body type: object properties: input: description: An array of objects, each specifying details for external statistics to be imported. maxItems: 10000 type: array items: $ref: '#/components/schemas/ImportExternalStatisticsDTO' required: - input ImportExternalStatisticsDTO: title: Import External Statistics type: object properties: courseIdentifier: description: Unique course identifier for the statistics. allOf: - $ref: '#/components/schemas/CourseIdentifierDTO' forceNew: type: boolean description: Determine whether the statistics should force the creation of a new attempt (`true`) or update any existing one based on the couple `(courseIdentifier.value, userIdentifier.value)` (`false`). Default to `false`. userIdentifier: description: Unique learner identifier for the statistics. allOf: - $ref: '#/components/schemas/UserIdentifierDTO' lang: type: string enum: - bg - cs - da - de - el - en - es - fi - fr - hr - ht_HT - hu - id - it - ja - kar_MM - ko - lt - mh_MH - nl - nl_BE - 'no' - pl - pt - ro - ru - rw_RW - sk - sl - so_SO - sv - sw_KE - th - ti_ET - tr - uk - zh - am_ET - bn - bs - ca - cy - en_CA - en_GB - es_AR - es_MX - et - fr_CA - gu - he_IL - hy - kk - km - lo - lv - mi - mn_MN - mr - ms - my_MM - nn_NO - or - pa - pt_BR - pt_MZ - rn_BI - si - ta - te - tl_PH - ur - uz - yo_NG - zh_tw - el - hi - sr - ar - vi - zh_HANT description: The language in which the learner played the course. example: fr progress: type: number minimum: 0 maximum: 100 description: The progress percentage of the learner, expressed as an integer (0-100). example: 100 score: type: number minimum: 0 maximum: 100 description: The score (0-100) of the learner for the external course. example: 90 result: type: string enum: - success - failed description: 'The result of the learner on the course: `failed` or `success`.' timeSpent: type: number minimum: 1 description: The total time in milliseconds the learner spent playing the external course. example: 3600000 firstActivityAt: format: date-time type: string description: The date when the learner first interacted with the external course, expressed in ISO 8601 format. example: '2025-07-08T22:00:00.000Z' lastActivityAt: format: date-time type: string description: The date when the learner last interacted with the external course, expressed in ISO 8601 format. If progress is set to 100%, this will be the completion date of the course. example: '2025-07-08T22:00:00.000Z' required: - courseIdentifier - userIdentifier - progress - timeSpent - firstActivityAt - lastActivityAt CourseIdentifierDTO: title: Course Identifier type: object properties: type: type: string enum: - externalId - internalId description: 'Type of course identifier. `externalId`: identifier used on the external platform. `internalId`: internal identifier used on 360Learning platform.' value: type: string description: Value of the course identifier given the type provided. example: l3ssup3rh3r0s minLength: 1 required: - type - value ExternalCourseTranslationDTO: title: External Course Translation type: object properties: lang: type: string enum: - bg - cs - da - de - el - en - es - fi - fr - hr - ht_HT - hu - id - it - ja - kar_MM - ko - lt - mh_MH - nl - nl_BE - 'no' - pl - pt - ro - ru - rw_RW - sk - sl - so_SO - sv - sw_KE - th - ti_ET - tr - uk - zh - am_ET - bn - bs - ca - cy - en_CA - en_GB - es_AR - es_MX - et - fr_CA - gu - he_IL - hy - kk - km - lo - lv - mi - mn_MN - mr - ms - my_MM - nn_NO - or - pa - pt_BR - pt_MZ - rn_BI - si - ta - te - tl_PH - ur - uz - yo_NG - zh_tw - el - hi - sr - ar - vi - zh_HANT description: The language of the translation. example: fr translatedFields: description: The translations of the external course fields for this language. If a field is not defined, the value from the default language is used. allOf: - $ref: '#/components/schemas/ExternalCourseTranslatedFields' required: - lang - translatedFields securitySchemes: oauth2: type: oauth2 flows: {} description: 'Use the token from the authentication endpoint in the Authorization header. Example: `Authorization: Bearer `'