Skip to main content

Learning Path Endpoints

Queries for fetching learning paths and their milestones.

QueryCurrentUserLearningPathMilestoneCompletionsBySlug1 pt

Fetch 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

NameTypeDescription
slugSlug!The slug of the learning path for which to retrieve the current user's milestone completion records.

Returns

FieldTypeDescription
idID!Unique identifier for this learning path action record.
learningPathLearningPath!The learning path associated with this action.
milestoneMilestoneThe milestone that was completed as part of this action.
typeStringThe type of action recorded (e.g., milestone_completed).
sourceStringThe source or trigger that generated this action record.
userUserThe user who performed the action.
timestampDateThe 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.

QueryLearningPathBySlug1 pt

Fetch 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

NameTypeDescription
slugSlug!The slug for the Learning Path.

Returns

FieldTypeDescription
idID!Unique identifier of the learning path.
layoutIdIDID of the admin/detail layout used for this learning path.
layoutLayoutThe detail page layout configuration, including widgets and scripts.
learnerLayoutIdIDID of the learner-facing layout.
learnerLayoutLayoutThe learner-facing layout configuration.
nameString!Display name of the learning path.
skuStringOptional stock-keeping unit identifier.
ribbonRibbonPromotional ribbon displayed on the learning path card.
slugSlug!URL-friendly unique identifier.
clientClientThe tenant/client that owns this learning path, including licensing and settings.
createdAtDateTimestamp when the learning path was created.
metaTitleStringSEO meta title.
metaDescriptionStringSEO meta description.
assetURLURL of the primary thumbnail/card image.
assetAltTextStringAccessibility alt text for the primary image.
assetLibraryIdIDLibrary reference ID for the primary image asset.
detailAssetURLURL of the detail page image.
detailAssetAltTextStringAlt text for the detail page image.
detailAssetLibraryIdIDLibrary reference ID for the detail image asset.
heroAssetURLURL of the hero/banner image.
heroAssetAltTextStringAlt text for the hero image.
priceInCentsIntDefault price in cents (USD).
suggestedRetailPriceInCentsIntSuggested retail price in cents.
alternativePricingTypeAlternativePricingTypeAlternative pricing model, e.g., membership.
alternativePricingRefIntReference identifier for the alternative pricing configuration.
accessDaysIntNumber of days of access granted after enrollment.
shortDescriptionStringBrief marketing description.
longDescriptionStringFull HTML description.
tags[Tag]Tags associated with this learning path for categorization and filtering.
statusStatus!Publication status (e.g., published, draft, archived).
freeWithRegistrationBooleanWhether the learning path is free upon account registration.
hasMultipleCurrenciesBoolean!Whether multi-currency pricing is configured.
prices[ItemPrice!]!List of pricing objects for all available currencies and locales.
customFieldsJSONArbitrary custom field data stored as JSON.
contentTypeStringContent type label for display purposes.
confirmationHtmlStringHTML displayed to users upon enrollment confirmation.
startDateDateThe date the learning path content becomes available.
endDateDateThe date after which the learning path content is no longer accessible.
enrollmentStartDateDateThe date enrollment opens.
enrollmentEndDateDateThe date enrollment closes.
milestones[Milestone]Ordered list of milestones comprising the learning path.
availabilityStatusStringHuman-readable availability status string.
currentUserStartActionDateDateThe date the current user started this learning path.
isPayAsYouGoBooleanWhether pay-as-you-go purchasing is enabled.
languageStringLanguage code for the learning path content.
futurePublishDateDateScheduled future publish date, if set.
purchasableBoolean!Whether the learning path can be purchased.
taxableBooleanWhether the learning path is subject to tax.
fulfillmentCenterFulfillmentCenterFulfillment center used for physical or logistics-related delivery.
taxCategoryIDTax category identifier.
currentUserPendingCertificateBoolean!Whether the current user has a certificate pending issuance.
currentUserEarnedCertificateBoolean!Whether the current user has earned a certificate for this learning path.
currentUserDueDateDateDue date assigned to the current user for this learning path.
bulkPurchasingEnabledBoolean!Whether bulk/seat purchasing is enabled.
seatTiers[SeatTier!]Volume pricing tiers for seat purchases.
seatPackages[SeatPackage!]Available seat package configurations.
lastTierPriceInCentsIntPrice 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.
resourceTypeString!Resource type discriminator string.
seatsLimitIntMaximum number of enrollments allowed.
videoAssetIDLibrary ID of the promotional video asset.
relatedQueryStringElasticsearch query string for related content suggestions.
relatedQuerySignatureStringSignature hash for the related content query.
sourceStringSource/origin identifier for imported content.
authors[String!]List of author names associated with this learning path.
publishDateDateThe date the learning path was published.
externalDetailUrlStringExternal URL to redirect users for detail page viewing.
externalConditionalRedirectUrlStringConditional external redirect URL for enrollment flows.
kindStringKind discriminator for the learning path type.
tabsLearningPathTabsTab configuration for the learning path detail page.
updatedAtDateTimestamp of the last update.
dueDateDateGlobal due date for the learning path.
dueDateDaysIntNumber of days after enrollment before the due date is set.
allowUnorderedMilestoneAccessBooleanWhether learners can access milestones in any order.
authoringClientIDID of the client that originally authored this learning path.
isTemplateBooleanWhether this learning path is a reusable template.
externalPurchaseUrlStringExternal 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"
}
QueryMilestone1 pt

Fetch 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

NameTypeDescription
idID!The unique ID of the milestone to retrieve.

Returns

FieldTypeDescription
idID!Unique identifier of the milestone.
nameString!Display name of the milestone.
learningPathLearningPath!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.
milestoneCompetencyAssessmentMilestoneCompetencyAssessmentCompetency assessment configuration if this is a competency-based milestone.
kindMilestoneKind!The kind of milestone: either `content` (courses/content items) or `competencyAssessment`.
completionCriteriaDescriptionStringHuman-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.
releaseDateDateAbsolute date on which this milestone becomes accessible to learners.
releaseDaysIntNumber of days after enrollment before this milestone is released.
requirementMilestoneRequirement!Whether this milestone is `required` or an `elective` for learning path completion.
createdAtDateTimestamp when the milestone was created.
updatedAtDateTimestamp 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"
}
QueryPagesCompletedByCourse3 pts

Fetch 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

NameTypeDescription
courseIdID!The ID of the course.

Returns

FieldTypeDescription
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.

QueryUserCourseCompletionProgress5 pts

Fetch 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

NameTypeDescription
idID!The ID of the course for which to retrieve the user's completion criteria progress.

Returns

FieldTypeDescription
typeCourseCompletionCriteriaTypeThe 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.
percentInt!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.

QueryUserCourseProgress5 pts

Fetch 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

NameTypeDescription
idID!The unique identifier of the course for which to retrieve the user's progress.

Returns

FieldTypeDescription
totalViewsIntThe total number of content item views the user has recorded in this course.
totalTimeIntThe total time the user has spent in the course, expressed in seconds.
percentCompleteIntThe 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.

MutationArchiveUserCourse1 pt

Archive 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

NameTypeDescription
idID!The ID of the course to be archived.

Returns

FieldTypeDescription
ArchiveUserCourseIDThe 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.

MutationArchiveUserLearningPath1 pt

Archive 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

NameTypeDescription
idID!The ID of the learning path to archive for the user.

Returns

FieldTypeDescription
ArchiveUserLearningPathIDThe 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.

MutationCreateLearningPath1 pt

Create 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

NameTypeDescription
nameString!The display name for the new learning path.
languageStringThe BCP 47 language code for the learning path content (e.g., 'en', 'es').
clientIdIDThe ID of the client (sub-tenant) to associate this learning path with. Defaults to the root client if omitted.
milestones[MilestoneInput!]!An array of milestone input objects defining the content groupings and completion requirements for this learning path.

Returns

FieldTypeDescription
idID!The unique identifier of the newly created learning path.
nameString!The display name of the learning path.
slugSlug!The URL-friendly slug for the learning path.
statusStatus!The publication status of the learning path.
languageStringThe BCP 47 language code of the learning path content.
createdAtDateTimestamp when the learning path was created.
updatedAtDateTimestamp when the learning path was last updated.
milestones[Milestone]The ordered list of milestones that make up this learning path.
clientClientThe client organization this learning path belongs to.
layoutIdIDID of the layout template used for the learning path detail page.
layoutLayoutThe layout template used for the learning path detail page.
learnerLayoutIdIDID of the layout template used for the learner view.
learnerLayoutLayoutThe layout template used for the learner view of this path.
skuStringStock-keeping unit identifier for the learning path.
ribbonRibbonRibbon label displayed on the learning path catalog card.
priceInCentsIntThe price of the learning path in cents.
prices[ItemPrice!]!Multi-currency pricing options for the learning path.
purchasableBoolean!Whether the learning path can be purchased.
freeWithRegistrationBooleanWhether the learning path is accessible for free upon registration.
shortDescriptionStringA brief summary of the learning path shown in catalog listings.
longDescriptionStringA detailed description of the learning path.
tags[Tag]Tags associated with the learning path for categorization and search.
availabilityStatusStringA string describing the current enrollment availability state.
customFieldsJSONCustom field data associated with this learning path.
startDateDateThe date this learning path becomes active.
endDateDateThe date this learning path expires.
enrollmentStartDateDateWhen enrollment opens for this learning path.
enrollmentEndDateDateWhen enrollment closes for this learning path.
dueDateDateThe due date for completing this learning path.
dueDateDaysIntNumber of days after enrollment before the learning path is due.
allowUnorderedMilestoneAccessBooleanWhether learners can access milestones out of order.
isTemplateBooleanWhether 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.
currentUserPendingCertificateBoolean!Whether the current user has a pending certificate for this path.
currentUserEarnedCertificateBoolean!Whether the current user has earned a certificate for this path.
bulkPurchasingEnabledBoolean!Whether bulk seat purchasing is enabled for this learning path.
resourceTypeString!The resource type identifier for this learning path.
publishDateDateThe date the learning path was or will be published.
externalPurchaseUrlStringAn 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.

MutationReinstateUserCourse1 pt

Reinstate 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

NameTypeDescription
idID!The ID of the archived course to reinstate for the user.

Returns

FieldTypeDescription
ReinstateUserCourseIDThe 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.

MutationReinstateUserLearningPath1 pt

Reinstate 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

NameTypeDescription
idID!The ID of the archived learning path to reinstate for the user.

Returns

FieldTypeDescription
ReinstateUserLearningPathIDThe 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.

MutationUpdateCourseStatus1 pt

Update 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

NameTypeDescription
idIDThe unique ID of the course.
slugSlugThe slug of the course.
skuStringThe SKU of the course.
statusString!The status to set for the course. Must be one of: `started`, `not-completed`, `completed`.
statusChangeDateDateThe date and time the course status was changed (ISO 8601 format). If omitted, the current date and time is used.

Returns

FieldTypeDescription
UpdateCourseStatusBoolean!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.

MutationUpdateLearningPathAccess1 pt

Update 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

NameTypeDescription
slugSlug!The URL slug that uniquely identifies the learning path whose access status should be updated.
statusString!The new access status to assign to the user for this learning path. Accepted values are `'not-started'`, `'started'`, and `'not-completed'`.

Returns

FieldTypeDescription
UpdateLearningPathAccessBoolean!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
  }
}
MutationUpdateTopicAndCourseProgress1 pt

Update 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

NameTypeDescription
topicIdID!The id of the topic.
progressInt!A number between 0 - 100 where 100 represents the topic being completed fully.

Returns

FieldTypeDescription
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.

MutationUpdateUserCourseMeetingAttendance1 pt

Update 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

NameTypeDescription
userIdID!The ID of the user whose meeting attendance should be updated.
courseIdIDThe ID of the course associated with the meeting. Optional but may be required to uniquely identify the meeting in some configurations.
meetingIdID!The ID of the meeting to mark the user as having attended or not attended.
attendedBoolean!Set to true to record the user as having attended the meeting, or false to remove their attendance record.

Returns

FieldTypeDescription
idID!The unique identifier of the updated user.
emailStringThe user's email address.
firstNameStringThe user's first name.
lastNameStringThe user's last name.
nameStringThe 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.
activeLicenseLicenseThe 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
}