Learning Path Endpoints
Queries for fetching learning paths and their milestones.
CurrentUserLearningPathMilestoneCompletionsBySlug1 ptFetch current user's learning path milestone completions by slug
Returns a list of `LearningPathAction` records representing the milestones that the currently authenticated user has completed for the learning path identified by the given slug. Each action record includes the milestone details, a timestamp of completion, the action type and source, and the associated user. This is useful for tracking individual learner progress through a learning path, rendering progress indicators, or auditing completion history. Pass an `authToken` header to set the user context; without it, results will reflect the unauthenticated state.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| slug | Slug! | Yes | The slug of the learning path for which to retrieve the current user's milestone completion records. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | Unique identifier for this learning path action record. |
| learningPath | LearningPath! | The learning path associated with this action. |
| milestone | Milestone | The milestone that was completed as part of this action. |
| type | String | The type of action recorded (e.g., milestone_completed). |
| source | String | The source or trigger that generated this action record. |
| user | User | The user who performed the action. |
| timestamp | Date | The date and time when the action occurred. |
Example
query GetMilestoneCompletions($slug: Slug!) {
CurrentUserLearningPathMilestoneCompletionsBySlug(slug: $slug) {
id
type
source
timestamp
milestone {
id
name
kind
requirement
}
learningPath {
id
name
slug
}
user {
id
email
firstName
lastName
}
}
}Example Response
{
"data": {
"CurrentUserLearningPathMilestoneCompletionsBySlug": [
{
"id": "action_001",
"type": "milestone_completed",
"source": "learner",
"timestamp": "2024-04-10T14:22:00Z",
"milestone": {
"id": "milestone_001",
"name": "Module 1: Python Basics",
"kind": "content",
"requirement": "required"
},
"learningPath": {
"id": "lp_abc123",
"name": "Data Science Professional Certificate",
"slug": "data-science-professional-certificate"
},
"user": {
"id": "user_xyz789",
"email": "[email protected]",
"firstName": "Jane",
"lastName": "Learner"
}
}
]
},
"id": "abc-123",
"learningPath": null,
"milestone": null,
"type": "example",
"source": "example",
"user": null,
"timestamp": "2026-01-01T00:00:00Z"
}This query is user-scoped. Provide an `authToken` header to identify the learner. Without authentication, the result set will be empty or limited.
LearningPathBySlug1 ptFetch a learning path by slug
Retrieves the full details of a single learning path using its unique slug identifier. This is the primary query for displaying learning path detail pages, showing milestones, pricing, enrollment windows, prerequisite requirements, tags, and layout configuration. The returned object includes deeply nested information about the milestones, content items, prerequisite courses and paths, as well as client and license settings. Use this query whenever you need to render or process a learning path by its URL-friendly slug.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| slug | Slug! | Yes | The slug for the Learning Path. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | Unique identifier of the learning path. |
| layoutId | ID | ID of the admin/detail layout used for this learning path. |
| layout | Layout | The detail page layout configuration, including widgets and scripts. |
| learnerLayoutId | ID | ID of the learner-facing layout. |
| learnerLayout | Layout | The learner-facing layout configuration. |
| name | String! | Display name of the learning path. |
| sku | String | Optional stock-keeping unit identifier. |
| ribbon | Ribbon | Promotional ribbon displayed on the learning path card. |
| slug | Slug! | URL-friendly unique identifier. |
| client | Client | The tenant/client that owns this learning path, including licensing and settings. |
| createdAt | Date | Timestamp when the learning path was created. |
| metaTitle | String | SEO meta title. |
| metaDescription | String | SEO meta description. |
| asset | URL | URL of the primary thumbnail/card image. |
| assetAltText | String | Accessibility alt text for the primary image. |
| assetLibraryId | ID | Library reference ID for the primary image asset. |
| detailAsset | URL | URL of the detail page image. |
| detailAssetAltText | String | Alt text for the detail page image. |
| detailAssetLibraryId | ID | Library reference ID for the detail image asset. |
| heroAsset | URL | URL of the hero/banner image. |
| heroAssetAltText | String | Alt text for the hero image. |
| priceInCents | Int | Default price in cents (USD). |
| suggestedRetailPriceInCents | Int | Suggested retail price in cents. |
| alternativePricingType | AlternativePricingType | Alternative pricing model, e.g., membership. |
| alternativePricingRef | Int | Reference identifier for the alternative pricing configuration. |
| accessDays | Int | Number of days of access granted after enrollment. |
| shortDescription | String | Brief marketing description. |
| longDescription | String | Full HTML description. |
| tags | [Tag] | Tags associated with this learning path for categorization and filtering. |
| status | Status! | Publication status (e.g., published, draft, archived). |
| freeWithRegistration | Boolean | Whether the learning path is free upon account registration. |
| hasMultipleCurrencies | Boolean! | Whether multi-currency pricing is configured. |
| prices | [ItemPrice!]! | List of pricing objects for all available currencies and locales. |
| customFields | JSON | Arbitrary custom field data stored as JSON. |
| contentType | String | Content type label for display purposes. |
| confirmationHtml | String | HTML displayed to users upon enrollment confirmation. |
| startDate | Date | The date the learning path content becomes available. |
| endDate | Date | The date after which the learning path content is no longer accessible. |
| enrollmentStartDate | Date | The date enrollment opens. |
| enrollmentEndDate | Date | The date enrollment closes. |
| milestones | [Milestone] | Ordered list of milestones comprising the learning path. |
| availabilityStatus | String | Human-readable availability status string. |
| currentUserStartActionDate | Date | The date the current user started this learning path. |
| isPayAsYouGo | Boolean | Whether pay-as-you-go purchasing is enabled. |
| language | String | Language code for the learning path content. |
| futurePublishDate | Date | Scheduled future publish date, if set. |
| purchasable | Boolean! | Whether the learning path can be purchased. |
| taxable | Boolean | Whether the learning path is subject to tax. |
| fulfillmentCenter | FulfillmentCenter | Fulfillment center used for physical or logistics-related delivery. |
| taxCategory | ID | Tax category identifier. |
| currentUserPendingCertificate | Boolean! | Whether the current user has a certificate pending issuance. |
| currentUserEarnedCertificate | Boolean! | Whether the current user has earned a certificate for this learning path. |
| currentUserDueDate | Date | Due date assigned to the current user for this learning path. |
| bulkPurchasingEnabled | Boolean! | Whether bulk/seat purchasing is enabled. |
| seatTiers | [SeatTier!] | Volume pricing tiers for seat purchases. |
| seatPackages | [SeatPackage!] | Available seat package configurations. |
| lastTierPriceInCents | Int | Price in cents for the highest/last seat tier. |
| prerequisiteCourses | [Course] | Courses that must be completed before enrolling in this learning path. |
| prerequisiteLearningPaths | [LearningPath] | Learning paths that must be completed before enrolling. |
| resourceType | String! | Resource type discriminator string. |
| seatsLimit | Int | Maximum number of enrollments allowed. |
| videoAsset | ID | Library ID of the promotional video asset. |
| relatedQuery | String | Elasticsearch query string for related content suggestions. |
| relatedQuerySignature | String | Signature hash for the related content query. |
| source | String | Source/origin identifier for imported content. |
| authors | [String!] | List of author names associated with this learning path. |
| publishDate | Date | The date the learning path was published. |
| externalDetailUrl | String | External URL to redirect users for detail page viewing. |
| externalConditionalRedirectUrl | String | Conditional external redirect URL for enrollment flows. |
| kind | String | Kind discriminator for the learning path type. |
| tabs | LearningPathTabs | Tab configuration for the learning path detail page. |
| updatedAt | Date | Timestamp of the last update. |
| dueDate | Date | Global due date for the learning path. |
| dueDateDays | Int | Number of days after enrollment before the due date is set. |
| allowUnorderedMilestoneAccess | Boolean | Whether learners can access milestones in any order. |
| authoringClient | ID | ID of the client that originally authored this learning path. |
| isTemplate | Boolean | Whether this learning path is a reusable template. |
| externalPurchaseUrl | String | External URL to redirect users for purchasing. |
Example
query GetLearningPathBySlug($slug: Slug!) {
LearningPathBySlug(slug: $slug) {
id
name
slug
status
shortDescription
longDescription
priceInCents
purchasable
freeWithRegistration
availabilityStatus
createdAt
updatedAt
asset
milestones {
id
name
kind
requirement
releaseDate
completionCriteriaDescription
}
tags {
id
label
}
prices {
id
currencyCode
unitAmount
isDefault
}
}
}Example Response
{
"data": {
"LearningPathBySlug": {
"id": "lp_abc123",
"name": "Data Science Professional Certificate",
"slug": "data-science-professional-certificate",
"status": "published",
"shortDescription": "A comprehensive program covering data analysis, machine learning, and visualization.",
"longDescription": "<p>Master data science with our structured, milestone-based program.</p>",
"priceInCents": 49900,
"purchasable": true,
"freeWithRegistration": false,
"availabilityStatus": "available",
"createdAt": "2023-09-01T00:00:00Z",
"updatedAt": "2024-05-15T12:00:00Z",
"asset": "https://cdn.example.com/assets/ds-cert-thumbnail.jpg",
"milestones": [
{
"id": "milestone_001",
"name": "Module 1: Python Basics",
"kind": "content",
"requirement": "required",
"releaseDate": null,
"completionCriteriaDescription": "Complete all required courses in this milestone."
},
{
"id": "milestone_002",
"name": "Module 2: Data Wrangling",
"kind": "content",
"requirement": "required",
"releaseDate": "2024-02-01T00:00:00Z",
"completionCriteriaDescription": "Complete at least 2 of the 3 elective courses."
}
],
"tags": [
{
"id": "tag_001",
"label": "Data Science"
},
{
"id": "tag_002",
"label": "Python"
}
],
"prices": [
{
"id": "price_001",
"currencyCode": "USD",
"unitAmount": 49900,
"isDefault": true
}
]
}
},
"id": "abc-123",
"layoutId": "abc-123",
"layout": null,
"learnerLayoutId": "abc-123",
"learnerLayout": null,
"name": "example",
"sku": "example",
"ribbon": null,
"slug": "example",
"client": null,
"createdAt": "2026-01-01T00:00:00Z",
"metaTitle": "example",
"metaDescription": "example",
"asset": "https://example.com",
"assetAltText": "example",
"assetLibraryId": "abc-123",
"detailAsset": "https://example.com",
"detailAssetAltText": "example",
"detailAssetLibraryId": "abc-123",
"heroAsset": "https://example.com",
"heroAssetAltText": "example",
"priceInCents": 0,
"suggestedRetailPriceInCents": 0,
"alternativePricingType": "membership",
"alternativePricingRef": 0,
"accessDays": 0,
"shortDescription": "example",
"longDescription": "example",
"tags": null,
"status": "draft",
"freeWithRegistration": false,
"hasMultipleCurrencies": false,
"prices": null,
"customFields": {},
"contentType": "example",
"confirmationHtml": "example",
"startDate": "2026-01-01T00:00:00Z",
"endDate": "2026-01-01T00:00:00Z",
"enrollmentStartDate": "2026-01-01T00:00:00Z",
"enrollmentEndDate": "2026-01-01T00:00:00Z",
"milestones": null,
"availabilityStatus": "example",
"currentUserStartActionDate": "2026-01-01T00:00:00Z",
"isPayAsYouGo": false,
"language": "example",
"futurePublishDate": "2026-01-01T00:00:00Z",
"purchasable": false,
"taxable": false,
"fulfillmentCenter": null,
"taxCategory": "abc-123",
"currentUserPendingCertificate": false,
"currentUserEarnedCertificate": false,
"currentUserDueDate": "2026-01-01T00:00:00Z",
"bulkPurchasingEnabled": false,
"seatTiers": null,
"seatPackages": null,
"lastTierPriceInCents": 0,
"prerequisiteCourses": null,
"prerequisiteLearningPaths": null,
"resourceType": "example",
"seatsLimit": 0,
"videoAsset": "abc-123",
"relatedQuery": "example",
"relatedQuerySignature": "example",
"source": "example",
"authors": [
"example"
],
"publishDate": "2026-01-01T00:00:00Z",
"externalDetailUrl": "example",
"externalConditionalRedirectUrl": "example",
"kind": "example",
"tabs": null,
"updatedAt": "2026-01-01T00:00:00Z",
"dueDate": "2026-01-01T00:00:00Z",
"dueDateDays": 0,
"allowUnorderedMilestoneAccess": false,
"authoringClient": "abc-123",
"isTemplate": false,
"externalPurchaseUrl": "example"
}Milestone1 ptFetch a learning path milestone by ID
Retrieves a single milestone from a learning path using its unique ID. The response includes the milestone's name, kind (`content` or `competencyAssessment`), requirement level (`required` or `elective`), completion criteria, release scheduling, and the list of content items or competency assessments associated with it. This query is useful for rendering milestone detail views, checking completion criteria before granting access, or programmatically inspecting the structure of a learning path segment.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| id | ID! | Yes | The unique ID of the milestone to retrieve. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | Unique identifier of the milestone. |
| name | String! | Display name of the milestone. |
| learningPath | LearningPath! | The learning path this milestone belongs to. |
| contentItems | [Content!] | Catalog-level content items associated with this milestone. |
| milestoneCourses | [MilestoneCourse!] | Structured course assignments within the milestone, including requirement levels. |
| milestoneCompetencyAssessment | MilestoneCompetencyAssessment | Competency assessment configuration if this is a competency-based milestone. |
| kind | MilestoneKind! | The kind of milestone: either `content` (courses/content items) or `competencyAssessment`. |
| completionCriteriaDescription | String | Human-readable description of what learners must do to complete this milestone. |
| completionCriteria | [MilestoneCompletionCriteria!] | Structured completion criteria objects, including type, threshold, and optional award type requirements. |
| releaseDate | Date | Absolute date on which this milestone becomes accessible to learners. |
| releaseDays | Int | Number of days after enrollment before this milestone is released. |
| requirement | MilestoneRequirement! | Whether this milestone is `required` or an `elective` for learning path completion. |
| createdAt | Date | Timestamp when the milestone was created. |
| updatedAt | Date | Timestamp when the milestone was last updated. |
Example
query GetMilestone($id: ID!) {
Milestone(id: $id) {
id
name
kind
requirement
releaseDate
releaseDays
completionCriteriaDescription
createdAt
updatedAt
completionCriteria {
id
type
threshold
awardType {
id
label
}
}
milestoneCourses {
id
contentId
contentTitle
requirement
contentGrouping
}
learningPath {
id
name
slug
}
}
}Example Response
{
"data": {
"Milestone": {
"id": "milestone_001",
"name": "Module 1: Python Basics",
"kind": "content",
"requirement": "required",
"releaseDate": null,
"releaseDays": null,
"completionCriteriaDescription": "Complete all required courses in this module.",
"createdAt": "2023-09-01T00:00:00Z",
"updatedAt": "2024-03-10T09:00:00Z",
"completionCriteria": [
{
"id": "criteria_001",
"type": "requiredCourses",
"threshold": 2,
"awardType": null
}
],
"milestoneCourses": [
{
"id": "mc_001",
"contentId": "course_abc123",
"contentTitle": "Intro to Python",
"requirement": "required",
"contentGrouping": "courseGroup"
},
{
"id": "mc_002",
"contentId": "course_def456",
"contentTitle": "Python for Data Analysis",
"requirement": "required",
"contentGrouping": "courseGroup"
}
],
"learningPath": {
"id": "lp_abc123",
"name": "Data Science Professional Certificate",
"slug": "data-science-professional-certificate"
}
}
},
"id": "abc-123",
"name": "example",
"learningPath": null,
"contentItems": null,
"milestoneCourses": null,
"milestoneCompetencyAssessment": null,
"kind": "content",
"completionCriteriaDescription": "example",
"completionCriteria": null,
"releaseDate": "2026-01-01T00:00:00Z",
"releaseDays": 0,
"requirement": "required",
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z"
}PagesCompletedByCourse3 ptsFetch pages completed by a user in a course
Returns the list of pages that the current user has already completed within the specified course. This is useful for tracking learner progress, rendering progress indicators, or conditionally unlocking downstream content. The results are scoped to the authenticated user — provide an `authToken` header to control which user's completion data is returned. The response is a union of typed page objects, so use inline fragments to access page-specific fields. This query carries an additional cost of 3 points.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| courseId | ID! | Yes | The ID of the course. |
Returns
| Field | Type | Description |
|---|---|---|
| PagesCompletedByCourse | [PageResource!]! | An array of page resource objects representing all pages the current user has completed in the specified course. Each item resolves to a concrete page type union member such as TextPage, QuizPage, VideoPage, etc. |
Example
query PagesCompletedByCourse($courseId: ID!) {
PagesCompletedByCourse(courseId: $courseId) {
__typename
... on TextPage {
id
title
type
lessonId
updatedAt
}
... on QuizPage {
id
title
type
lessonId
updatedAt
minPassingPercent
}
... on VideoPage {
id
title
type
lessonId
updatedAt
asset
}
... on AssignmentPage {
id
title
type
lessonId
updatedAt
}
}
}Example Response
{
"data": {
"PagesCompletedByCourse": [
{
"__typename": "TextPage",
"id": "page_text_001",
"title": "Course Overview",
"type": "text",
"lessonId": "lesson_101",
"updatedAt": "2024-03-01T09:00:00Z"
},
{
"__typename": "VideoPage",
"id": "page_video_002",
"title": "Welcome Video",
"type": "video",
"lessonId": "lesson_101",
"updatedAt": "2024-03-01T09:15:00Z",
"asset": "wistia_abc123xyz"
},
{
"__typename": "QuizPage",
"id": "page_quiz_003",
"title": "Pre-Assessment",
"type": "quiz",
"lessonId": "lesson_102",
"updatedAt": "2024-03-02T11:00:00Z",
"minPassingPercent": 70
}
]
},
"members": null
}This query has an additional cost of 3 points. Results are user-scoped — supply an `authToken` header to specify the learner whose completions should be returned. Use `__typename` and inline fragments to access type-specific fields from the `PageResource` union.
UserCourseCompletionProgress5 ptsFetch a user's course completion criteria progress
Returns the progress of the current user against each completion criteria configured for a specific course. Each entry describes a criterion type (such as percentage viewed, assessment passed, or topic viewed), the set of required item IDs, the set of completed item IDs, and an overall completion percentage. This is useful for building custom progress dashboards or triggering downstream workflows when completion milestones are reached. The user context can be overridden with an `authToken` header. This query carries an additional API cost of 5 points.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| id | ID! | Yes | The ID of the course for which to retrieve the user's completion criteria progress. |
Returns
| Field | Type | Description |
|---|---|---|
| type | CourseCompletionCriteriaType | The type of completion criterion (e.g., `coursePercentViewed`, `courseAssessmentPassed`). |
| required | [ID] | List of item IDs (e.g., topic IDs) required to satisfy this criterion. |
| completed | [ID] | List of item IDs that the user has already completed toward this criterion. |
| percent | Int! | The user's percentage completion for this criterion, from 0 to 100. |
Example
query UserCourseCompletionProgress($id: ID!) {
UserCourseCompletionProgress(id: $id) {
type
required
completed
percent
}
}
# Variables:
# { "id": "course_456" }Example Response
{
"data": {
"UserCourseCompletionProgress": [
{
"type": "coursePercentViewed",
"required": null,
"completed": null,
"percent": 75
},
{
"type": "courseAssessmentPassed",
"required": [
"topic_789"
],
"completed": [
"topic_789"
],
"percent": 100
},
{
"type": "courseTopicViewed",
"required": [
"topic_101",
"topic_102",
"topic_103"
],
"completed": [
"topic_101",
"topic_102"
],
"percent": 66
}
]
},
"type": "coursePercentViewed",
"required": [
"abc-123"
],
"completed": [
"abc-123"
],
"percent": 0
}This query has an additional cost of 5 API points.
UserCourseProgress5 ptsFetch user course progress
Returns aggregate progress metrics for a specific user on a given course, including the total number of content views, total time spent (in seconds), and the percentage of the course completed. The user context is determined by the `authToken` header supplied with the request — omitting or changing this header will affect whose progress data is returned. Use this query to power learner progress dashboards, completion tracking, or reporting workflows.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| id | ID! | Yes | The unique identifier of the course for which to retrieve the user's progress. |
Returns
| Field | Type | Description |
|---|---|---|
| totalViews | Int | The total number of content item views the user has recorded in this course. |
| totalTime | Int | The total time the user has spent in the course, expressed in seconds. |
| percentComplete | Int | The percentage of the course the user has completed, as an integer from 0 to 100. |
Example
query UserCourseProgress {
UserCourseProgress(id: "course_abc123") {
totalViews
totalTime
percentComplete
}
}Example Response
{
"data": {
"UserCourseProgress": {
"totalViews": 42,
"totalTime": 7320,
"percentComplete": 75
}
},
"totalViews": 0,
"totalTime": 0,
"percentComplete": 0
}This query has an additional cost of 5 points against your API rate-limit quota. The user whose progress is returned is determined by the `authToken` request header; ensure the correct token is provided to fetch the intended user's data.
ArchiveUserCourse1 ptArchive a course for a user
Archives a course for the current user, hiding it from their active course list without deleting enrollment or progress data. Archived courses can be restored using the `ReinstateUserCourse` mutation. On success, the mutation returns the ID of the archived course. The acting user can be controlled by passing an `authToken` header.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| id | ID! | Yes | The ID of the course to be archived. |
Returns
| Field | Type | Description |
|---|---|---|
| ArchiveUserCourse | ID | The ID of the course that was archived, or null if the operation did not succeed. |
Example
mutation ArchiveUserCourse($id: ID!) {
ArchiveUserCourse(id: $id)
}Example Response
{
"data": {
"ArchiveUserCourse": "course_789"
}
}Returns `null` if the course could not be archived. Archiving is a soft operation — user progress is retained and can be restored. The acting user can be overridden via the `authToken` header.
ArchiveUserLearningPath1 ptArchive a learning path for a user
Archives a learning path for the current user, removing it from their active learning path list without permanently deleting their enrollment or progress data. Archived learning paths can be restored using the `ReinstateUserLearningPath` mutation. On success, the mutation returns the ID of the archived learning path. The acting user can be controlled by passing an `authToken` header.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| id | ID! | Yes | The ID of the learning path to archive for the user. |
Returns
| Field | Type | Description |
|---|---|---|
| ArchiveUserLearningPath | ID | The ID of the learning path that was archived, or null if the operation did not succeed. |
Example
mutation ArchiveUserLearningPath($id: ID!) {
ArchiveUserLearningPath(id: $id)
}Example Response
{
"data": {
"ArchiveUserLearningPath": "lp_456"
}
}Returns `null` if the learning path could not be archived. Archiving is a soft operation — user progress is retained and can be restored. The acting user can be overridden via the `authToken` header.
CreateLearningPath1 ptCreate a learning path
Creates a new learning path with one or more milestones. A learning path is a curated sequence of content items organized into milestones that learners must complete. Use this mutation to programmatically build structured curricula, such as onboarding tracks or certification programs. The `milestones` argument defines the content groupings and their completion requirements. You can optionally associate the learning path with a specific client (sub-tenant) by providing `clientId`. An `authToken` header can be used to scope the operation to a particular user.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| name | String! | Yes | The display name for the new learning path. |
| language | String | No | The BCP 47 language code for the learning path content (e.g., 'en', 'es'). |
| clientId | ID | No | The ID of the client (sub-tenant) to associate this learning path with. Defaults to the root client if omitted. |
| milestones | [MilestoneInput!]! | Yes | An array of milestone input objects defining the content groupings and completion requirements for this learning path. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | The unique identifier of the newly created learning path. |
| name | String! | The display name of the learning path. |
| slug | Slug! | The URL-friendly slug for the learning path. |
| status | Status! | The publication status of the learning path. |
| language | String | The BCP 47 language code of the learning path content. |
| createdAt | Date | Timestamp when the learning path was created. |
| updatedAt | Date | Timestamp when the learning path was last updated. |
| milestones | [Milestone] | The ordered list of milestones that make up this learning path. |
| client | Client | The client organization this learning path belongs to. |
| layoutId | ID | ID of the layout template used for the learning path detail page. |
| layout | Layout | The layout template used for the learning path detail page. |
| learnerLayoutId | ID | ID of the layout template used for the learner view. |
| learnerLayout | Layout | The layout template used for the learner view of this path. |
| sku | String | Stock-keeping unit identifier for the learning path. |
| ribbon | Ribbon | Ribbon label displayed on the learning path catalog card. |
| priceInCents | Int | The price of the learning path in cents. |
| prices | [ItemPrice!]! | Multi-currency pricing options for the learning path. |
| purchasable | Boolean! | Whether the learning path can be purchased. |
| freeWithRegistration | Boolean | Whether the learning path is accessible for free upon registration. |
| shortDescription | String | A brief summary of the learning path shown in catalog listings. |
| longDescription | String | A detailed description of the learning path. |
| tags | [Tag] | Tags associated with the learning path for categorization and search. |
| availabilityStatus | String | A string describing the current enrollment availability state. |
| customFields | JSON | Custom field data associated with this learning path. |
| startDate | Date | The date this learning path becomes active. |
| endDate | Date | The date this learning path expires. |
| enrollmentStartDate | Date | When enrollment opens for this learning path. |
| enrollmentEndDate | Date | When enrollment closes for this learning path. |
| dueDate | Date | The due date for completing this learning path. |
| dueDateDays | Int | Number of days after enrollment before the learning path is due. |
| allowUnorderedMilestoneAccess | Boolean | Whether learners can access milestones out of order. |
| isTemplate | Boolean | Whether this learning path is marked as a template. |
| prerequisiteCourses | [Course] | Courses that must be completed before enrolling in this path. |
| prerequisiteLearningPaths | [LearningPath] | Learning paths that must be completed before enrolling in this path. |
| currentUserPendingCertificate | Boolean! | Whether the current user has a pending certificate for this path. |
| currentUserEarnedCertificate | Boolean! | Whether the current user has earned a certificate for this path. |
| bulkPurchasingEnabled | Boolean! | Whether bulk seat purchasing is enabled for this learning path. |
| resourceType | String! | The resource type identifier for this learning path. |
| publishDate | Date | The date the learning path was or will be published. |
| externalPurchaseUrl | String | An external URL for purchasing this learning path outside the platform. |
Example
mutation CreateLearningPath($milestones: [MilestoneInput!]!) {
CreateLearningPath(
name: "New Employee Onboarding Track"
language: "en"
clientId: "clt_9876543210"
milestones: $milestones
) {
id
name
slug
status
language
createdAt
milestones {
id
name
kind
requirement
milestoneCourses {
id
contentId
contentTitle
requirement
}
}
client {
id
name
}
}
}
# Variables:
# {
# "milestones": [
# {
# "name": "Foundations",
# "kind": "content",
# "requirement": "required",
# "courseIds": ["crs_01ABC", "crs_01DEF"]
# }
# ]
# }Example Response
{
"data": {
"CreateLearningPath": {
"id": "lp_01HX5T6U7V8W9X0Y",
"name": "New Employee Onboarding Track",
"slug": "new-employee-onboarding-track",
"status": "draft",
"language": "en",
"createdAt": "2024-05-01T12:00:00Z",
"milestones": [
{
"id": "ms_01HX5T6U7V8W9X1Z",
"name": "Foundations",
"kind": "content",
"requirement": "required",
"milestoneCourses": [
{
"id": "mc_01HX5T6U7V8W9X2A",
"contentId": "crs_01ABC",
"contentTitle": "Company Culture & Values",
"requirement": "required"
}
]
}
],
"client": {
"id": "clt_9876543210",
"name": "Acme Corp"
}
}
},
"id": "abc-123",
"layoutId": "abc-123",
"layout": null,
"learnerLayoutId": "abc-123",
"learnerLayout": null,
"name": "example",
"sku": "example",
"ribbon": null,
"slug": "example",
"client": null,
"createdAt": "2026-01-01T00:00:00Z",
"metaTitle": "example",
"metaDescription": "example",
"asset": "https://example.com",
"assetAltText": "example",
"assetLibraryId": "abc-123",
"detailAsset": "https://example.com",
"detailAssetAltText": "example",
"detailAssetLibraryId": "abc-123",
"heroAsset": "https://example.com",
"heroAssetAltText": "example",
"priceInCents": 0,
"suggestedRetailPriceInCents": 0,
"alternativePricingType": "membership",
"alternativePricingRef": 0,
"accessDays": 0,
"shortDescription": "example",
"longDescription": "example",
"tags": null,
"status": "draft",
"freeWithRegistration": false,
"hasMultipleCurrencies": false,
"prices": null,
"customFields": {},
"contentType": "example",
"confirmationHtml": "example",
"startDate": "2026-01-01T00:00:00Z",
"endDate": "2026-01-01T00:00:00Z",
"enrollmentStartDate": "2026-01-01T00:00:00Z",
"enrollmentEndDate": "2026-01-01T00:00:00Z",
"milestones": null,
"availabilityStatus": "example",
"currentUserStartActionDate": "2026-01-01T00:00:00Z",
"isPayAsYouGo": false,
"language": "example",
"futurePublishDate": "2026-01-01T00:00:00Z",
"purchasable": false,
"taxable": false,
"fulfillmentCenter": null,
"taxCategory": "abc-123",
"currentUserPendingCertificate": false,
"currentUserEarnedCertificate": false,
"currentUserDueDate": "2026-01-01T00:00:00Z",
"bulkPurchasingEnabled": false,
"seatTiers": null,
"seatPackages": null,
"lastTierPriceInCents": 0,
"prerequisiteCourses": null,
"prerequisiteLearningPaths": null,
"resourceType": "example",
"seatsLimit": 0,
"videoAsset": "abc-123",
"relatedQuery": "example",
"relatedQuerySignature": "example",
"source": "example",
"authors": [
"example"
],
"publishDate": "2026-01-01T00:00:00Z",
"externalDetailUrl": "example",
"externalConditionalRedirectUrl": "example",
"kind": "example",
"tabs": null,
"updatedAt": "2026-01-01T00:00:00Z",
"dueDate": "2026-01-01T00:00:00Z",
"dueDateDays": 0,
"allowUnorderedMilestoneAccess": false,
"authoringClient": "abc-123",
"isTemplate": false,
"externalPurchaseUrl": "example"
}The learning path is created in `draft` status and must be published separately. An `authToken` header can scope the operation to a specific user.
ReinstateUserCourse1 ptReinstate an archived course for a user
Re-adds a course to the current user's active list after they have previously archived it. This is the inverse of the `ArchiveUserCourse` mutation. On success, the mutation returns the ID of the reinstated course. The acting user can be controlled by passing an `authToken` header.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| id | ID! | Yes | The ID of the archived course to reinstate for the user. |
Returns
| Field | Type | Description |
|---|---|---|
| ReinstateUserCourse | ID | The ID of the course that was reinstated, or null if the operation did not succeed. |
Example
mutation ReinstateUserCourse($id: ID!) {
ReinstateUserCourse(id: $id)
}Example Response
{
"data": {
"ReinstateUserCourse": "course_789"
}
}Returns `null` if the course was not previously archived by the user or the reinstatement could not be completed. The acting user can be overridden via the `authToken` header.
ReinstateUserLearningPath1 ptReinstate an archived learning path for a user
Re-adds a learning path to the current user's active list after they have previously archived it. This is the inverse of the `ArchiveUserLearningPath` mutation. On success, the mutation returns the ID of the reinstated learning path. The acting user can be controlled by passing an `authToken` header.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| id | ID! | Yes | The ID of the archived learning path to reinstate for the user. |
Returns
| Field | Type | Description |
|---|---|---|
| ReinstateUserLearningPath | ID | The ID of the learning path that was reinstated, or null if the operation did not succeed. |
Example
mutation ReinstateUserLearningPath($id: ID!) {
ReinstateUserLearningPath(id: $id)
}Example Response
{
"data": {
"ReinstateUserLearningPath": "lp_456"
}
}Returns `null` if the learning path was not previously archived by the user or the reinstatement could not be completed. The acting user can be overridden via the `authToken` header.
UpdateCourseStatus1 ptUpdate course status for current user
Changes the completion status of a course for the currently authenticated user. You must supply exactly one of `id`, `slug`, or `sku` to identify the course, and set `status` to one of `started`, `not-completed`, or `completed`. An optional `statusChangeDate` (ISO 8601) can be provided to backdate the event; it cannot be a future date. If omitted, the current date and time is used automatically. Pass an `authToken` header to perform the update on behalf of a specific user.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| id | ID | No | The unique ID of the course. |
| slug | Slug | No | The slug of the course. |
| sku | String | No | The SKU of the course. |
| status | String! | Yes | The status to set for the course. Must be one of: `started`, `not-completed`, `completed`. |
| statusChangeDate | Date | No | The date and time the course status was changed (ISO 8601 format). If omitted, the current date and time is used. |
Returns
| Field | Type | Description |
|---|---|---|
| UpdateCourseStatus | Boolean! | Returns `true` if the course status was successfully updated for the current user. |
Example
mutation UpdateCourseStatus {
UpdateCourseStatus(
slug: "intro-to-graphql"
status: "completed"
statusChangeDate: "2024-03-15T10:30:00Z"
)
}Example Response
{
"data": {
"UpdateCourseStatus": true
}
}Exactly one of `id`, `slug`, or `sku` must be provided. The `statusChangeDate` must not be a future date. Supply an `authToken` request header to target a specific user instead of the caller.
UpdateLearningPathAccess1 ptUpdate learning path access status for a user
Changes the access status of a learning path for the current user. Accepted values for `status` are `'not-started'`, `'started'`, and `'not-completed'`. This mutation is typically used to reset or re-open a learner's progress on a learning path, or to mark it as started programmatically. Provide an `authToken` header to target a specific user — without it, the operation applies to the authenticated caller.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| slug | Slug! | Yes | The URL slug that uniquely identifies the learning path whose access status should be updated. |
| status | String! | Yes | The new access status to assign to the user for this learning path. Accepted values are `'not-started'`, `'started'`, and `'not-completed'`. |
Returns
| Field | Type | Description |
|---|---|---|
| UpdateLearningPathAccess | Boolean! | Returns `true` if the learning path access status was successfully updated, `false` otherwise. |
Example
mutation UpdateLearningPathAccess($slug: Slug!, $status: String!) {
UpdateLearningPathAccess(slug: $slug, status: $status)
}Example Response
{
"data": {
"UpdateLearningPathAccess": true
}
}UpdateTopicAndCourseProgress1 ptUpdate topic and course progress
Records a learner's progress on a specific topic (page) within a course. The `progress` value is an integer between 0 and 100, where 100 indicates the topic has been fully completed. This mutation is typically called by a custom front-end or integration layer to synchronize progress from an external system (such as a SCORM player or a custom video player) back into the Thought Industries platform. The operation affects the currently authenticated user unless an `authToken` header is supplied to impersonate a different user. Returns `true` on success.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| topicId | ID! | Yes | The id of the topic. |
| progress | Int! | Yes | A number between 0 - 100 where 100 represents the topic being completed fully. |
Returns
| Field | Type | Description |
|---|---|---|
| Boolean! | Boolean! | Returns true if the progress update was applied successfully. |
Example
mutation UpdateTopicAndCourseProgress {
UpdateTopicAndCourseProgress(
topicId: "tpc_01HX3Q4R5S6T7U8V"
progress: 100
)
}Example Response
{
"data": {
"UpdateTopicAndCourseProgress": true
}
}Setting `progress` to 100 marks the topic as complete, which may trigger course completion logic, certificates, or downstream webhook events. An `authToken` header can scope the update to a specific learner rather than the API caller.
UpdateUserCourseMeetingAttendance1 ptUpdate user course meeting attendance
Records or updates whether a specific user attended a given course meeting. Pass `attended: true` to mark the user as having attended, or `false` to remove their attendance record. You can identify the target meeting by providing `meetingId` alone; `courseId` is optional context that may be used to disambiguate meetings. The mutation returns the full updated `User` object, including their `attendedMeetings` list, so you can confirm the change in a single round-trip.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| userId | ID! | Yes | The ID of the user whose meeting attendance should be updated. |
| courseId | ID | No | The ID of the course associated with the meeting. Optional but may be required to uniquely identify the meeting in some configurations. |
| meetingId | ID! | Yes | The ID of the meeting to mark the user as having attended or not attended. |
| attended | Boolean! | Yes | Set to true to record the user as having attended the meeting, or false to remove their attendance record. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | The unique identifier of the updated user. |
| String | The user's email address. | |
| firstName | String | The user's first name. |
| lastName | String | The user's last name. |
| name | String | The user's full display name. |
| attendedMeetings | [UserAttendedMeeting!] | List of meetings the user has attended, including attendance dates and meeting details. |
| purchasedCourses | [PurchasedCourse!] | Courses the user has purchased or enrolled in. |
| activeLicense | License | The user's currently active license. |
Example
mutation UpdateUserCourseMeetingAttendance {
UpdateUserCourseMeetingAttendance(
userId: "usr_def456"
courseId: "crs_789xyz"
meetingId: "mtg_111aaa"
attended: true
) {
id
name
email
attendedMeetings {
attendanceDate
meeting {
id
title
startDate
endDate
}
}
}
}Example Response
{
"data": {
"UpdateUserCourseMeetingAttendance": {
"id": "usr_def456",
"name": "Jane Smith",
"email": "[email protected]",
"attendedMeetings": [
{
"attendanceDate": "2024-03-15",
"meeting": {
"id": "mtg_111aaa",
"title": "Introduction Session",
"startDate": "2024-03-15T10:00:00Z",
"endDate": "2024-03-15T11:00:00Z"
}
}
]
}
},
"id": "abc-123",
"email": "example",
"firstName": "example",
"abbreviatedName": "example",
"asset": "example",
"lastName": "example",
"name": "example",
"lastActiveAt": "2026-01-01T00:00:00Z",
"bio": "example",
"twoFactorEnabled": false,
"firstInitial": "example",
"lastInitial": "example",
"invitedByName": "example",
"shouldHighlight": false,
"purchasedCourses": null,
"purchasedBundles": null,
"activeLicense": null,
"allocatedLicenses": null,
"allocatedLearningPaths": null,
"attendedMeetings": null,
"waitlistedCourses": null,
"adminClients": null,
"roleKey": "example",
"address1": "example",
"address2": "example",
"city": "example",
"state": "example",
"zipCode": "example",
"country": "example",
"telephone": "example",
"stripeCustomerId": "abc-123",
"externalCustomerId": "abc-123",
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"sfAccountId": "abc-123",
"sfContactId": "abc-123",
"shippingName": "example",
"client": null,
"clientId": "abc-123",
"ref1": "example",
"ref2": "example",
"ref3": "example",
"ref4": "example",
"ref5": "example",
"ref6": "example",
"ref7": "example",
"ref8": "example",
"ref9": "example",
"ref10": "example",
"lang": "example",
"preferredCurrency": "example",
"customFields": {},
"recommendedTags": null,
"recommendedSlugs": null,
"accessedFlows": [
"example"
],
"disabled": false,
"learnerUserId": "abc-123",
"managerUserId": "abc-123",
"balance": 0,
"mustVerifyEmail": false,
"certificatesCount": 0,
"collaborationsCount": 0,
"availableCoursesCount": 0,
"startedCoursesCount": 0,
"completedCoursesCount": 0
}