Skip to main content

Content Endpoints

Core queries for fetching catalog, courses, and lesson topics.

QueryCatalogContent3 pts

Fetch catalog content items

Returns a paginated list of catalog content items along with metadata for the current learning instance. When an `authToken` header is provided, results are personalized for the authenticated user; otherwise, the public catalog profile is used. You can filter results by content type, apply custom field aggregation filters via `labels` and `values`, search with a `query`, and control sorting and display type. This query is useful for powering catalog pages, search experiences, and content discovery widgets. Note that this query has an additional cost of 3 points.

Arguments

NameTypeDescription
layoutIdIDThe id of the custom catalog widget layout.
widgetIdIDThe id of the custom catalog widget.
sortdeprecatedStringA legacy sort string used to specify the sort order. Prefer using `sortColumn` and `sortDirection` instead.
sortColumnSortColumnThe content data column used to sort the collection. Defaults to the value configured for catalog from the user's Thought Industries instance. If the catalog is not configured, it falls back to value `createdAt`. When the value is `relevance`, it requires the argument `query` also to be set, or it falls back to value `courseStartDate`.
sortDirectionSortDirectionThe direction used to sort the collection. Defaults to the value configured for catalog from the user's Thought Industries instance. If the catalog is not configured, it falls back to value `desc`. When the argument `sortColumn` is `relevance`, it requires the argument `query` also to be set, or it falls back to value `desc`.
resultsDisplayTypeContentItemDisplayTypeThe display type. Defaults to the value configured for catalog from the user's Thought Industries instance. If the catalog is not configured, it falls back to value `grid`. When the value is `calendar`, it overrides the values for argument `sortColumn` to be `displayDate` and `sortDirection` to be `asc`.
pageInt!The page number to return within the collection.
tokenStringThe secure catalog query. The value is encoded by the secret key of user's Thought Industries instance.
labels[String!]The list of aggregation labels. The order of list items will match with argument `labels`. Labels are custom fields.
values[String!]The list of aggregation values. The order of list items will match with argument `values`. Values are custom fields.
contentTypes[String!]The list of content types to be queried.
queryStringThe search query.

Returns

FieldTypeDescription
contentItems[Content!]The paginated list of catalog content items matching the specified filters and sorting criteria.
metaCatalogMeta!Metadata about the catalog query result, including pagination info, available sort options, display configuration, aggregations, and total count.

Example

query CatalogContent {
  CatalogContent(
    page: 1
    sortColumn: createdAt
    sortDirection: desc
    resultsDisplayType: grid
    contentTypes: ["course", "webinar"]
    query: "leadership"
  ) {
    contentItems {
      id
      title
      slug
      kind
      status
      priceInCents
      description
      asset
      isActive
      publishDate
      waitlistingEnabled
      waitlistingTriggered
      tags {
        id
        label
      }
      prices {
        id
        currencyCode
        unitAmount
        isDefault
      }
    }
    meta {
      total
      hasMore
      resultsDisplayType
      selectedSortColumn
      selectedSortDirection
      contentTypes
      contentTypeFilterEnabled
      displayAuthorsEnabled
      isCurated
    }
  }
}

Example Response

{
  "data": {
    "CatalogContent": {
      "contentItems": [
        {
          "id": "content_001",
          "title": "Leadership Fundamentals",
          "slug": "leadership-fundamentals",
          "kind": "course",
          "status": "published",
          "priceInCents": 4999,
          "description": "An introductory course on leadership skills.",
          "asset": "https://cdn.acme.com/leadership.jpg",
          "isActive": true,
          "publishDate": "2024-01-15",
          "waitlistingEnabled": false,
          "waitlistingTriggered": false,
          "tags": [
            {
              "id": "tag_001",
              "label": "Leadership"
            }
          ],
          "prices": [
            {
              "id": "price_001",
              "currencyCode": "USD",
              "unitAmount": 4999,
              "isDefault": true
            }
          ]
        }
      ],
      "meta": {
        "total": 42,
        "hasMore": true,
        "resultsDisplayType": "grid",
        "selectedSortColumn": "createdAt",
        "selectedSortDirection": "desc",
        "contentTypes": [
          "course",
          "webinar"
        ],
        "contentTypeFilterEnabled": true,
        "displayAuthorsEnabled": true,
        "isCurated": false
      }
    }
  },
  "contentItems": null,
  "meta": null
}

This query has an additional cost of 3 points. Results are affected by providing an `authToken` header to set a user context.

QueryCatalogQuery3 pts × queryLimit

Search catalog content with a query signature

Performs a search across catalog content items using a free-text query and optional query signature for secure or pre-configured searches. This query is well-suited for search bars and programmatic content discovery where you need to control pagination, result limits, and exclude specific content items from results. Unlike `CatalogContent`, this query offers a simpler interface focused on text-based search and exclusion filtering rather than aggregation-based filtering.

Arguments

NameTypeDescription
queryStringThe free-text search string used to find matching catalog content items.
querySignatureStringA cryptographically signed string representing a pre-configured or secured search query.
querySortStringA string specifying the sort order for the search results (e.g., `title_asc`, `createdAt_desc`).
pageIntThe page number to return within the collection.
queryExclusions[String!]A list of content item IDs to exclude from the search results.
queryLimitIntThe maximum number of content items to return per page.

Returns

FieldTypeDescription
contentItems[Content!]The list of catalog content items matching the search query and filters.
metaCatalogMeta!Metadata about the search result, including total count, pagination status, and active sort configuration.

Example

query CatalogQuery {
  CatalogQuery(
    query: "project management"
    page: 1
    queryLimit: 10
    queryExclusions: ["content_999"]
    querySort: "title_asc"
  ) {
    contentItems {
      id
      title
      slug
      kind
      status
      priceInCents
      description
      asset
      isActive
      publishDate
      waitlistingEnabled
      waitlistingTriggered
    }
    meta {
      total
      hasMore
      selectedSortColumn
      selectedSortDirection
      resultsDisplayType
    }
  }
}

Example Response

{
  "data": {
    "CatalogQuery": {
      "contentItems": [
        {
          "id": "content_042",
          "title": "Project Management Essentials",
          "slug": "project-management-essentials",
          "kind": "course",
          "status": "published",
          "priceInCents": 2999,
          "description": "Master the fundamentals of project management.",
          "asset": "https://cdn.acme.com/pm-essentials.jpg",
          "isActive": true,
          "publishDate": "2023-09-01",
          "waitlistingEnabled": false,
          "waitlistingTriggered": false
        }
      ],
      "meta": {
        "total": 5,
        "hasMore": false,
        "selectedSortColumn": "title",
        "selectedSortDirection": "asc",
        "resultsDisplayType": "grid"
      }
    }
  },
  "contentItems": null,
  "meta": null
}
QueryCourseById1 pt

Fetch course by ID

Retrieves the full metadata and structural outline of a single course by its unique identifier. Use this query when you need detailed information about a specific course, including its sections, lessons, pricing, enrollment windows, seat availability, prerequisite requirements, webinar details, and feature flags. The response is shaped by the authenticated user context — passing an `authToken` header will tailor certain fields (such as `currentUserHasAccess` and `currentUserDueDate`) to that user's perspective.

Arguments

NameTypeDescription
idID!The ID of the course. This can fetched from CatalogContent > displayCourse.

Returns

FieldTypeDescription
idID!The unique identifier of the course.
createdAtDateThe date and time when the course was created.
updatedAtDateThe date and time when the course was last updated.
slugSlug!The URL-friendly slug for the course.
statusStatusThe publication status of the course (e.g., draft, published, archived).
titleStringThe display title of the course.
sessionIsTitledBoolean!Whether individual sessions within the course have titles.
sampleLessonLessonAn optional free preview lesson associated with the course.
sampleLessonIdIDThe ID of the sample/preview lesson.
sections[Section]The list of sections (modules) that organize lessons within the course.
appearanceBlockIDReference to the appearance configuration block for the course.
appearanceHashStringA hash representing the current appearance configuration state.
paywallsBlockIDReference to the paywall configuration block for the course.
termsBlockIDReference to the terms and conditions block for the course.
confirmationBlockIDReference to the enrollment confirmation block for the course.
courseStartDateDateThe date when the course content becomes available to learners.
courseEndDateDateThe date when learner access to course content ends.
enrollmentStartDateDateThe date when enrollment opens for this course.
enrollmentEndDateDateThe date when enrollment closes for this course.
gracePeriodEndDateDateThe date after which access is fully revoked following course end.
seatsLimitIntThe maximum number of learners allowed to enroll.
waitlistCountIntThe number of learners currently on the waitlist.
seatsLimitMetBoolean!Whether the enrollment seat limit has been reached.
waitlistingEnabledBoolean!Whether waitlisting is enabled for this course.
waitlistingTriggeredBoolean!Whether the waitlist has been activated due to seats being full.
taxableBooleanWhether the course is subject to tax.
purchasableBoolean!Whether the course can be purchased.
taxCategoryIDReference to the tax category applied to this course.
fulfillmentCenterIDReference to the fulfillment center associated with this course.
courseGroupCourseGroupThe CourseGroup this course belongs to, containing catalog-level metadata.
syllabusTitlesEnabledBooleanWhether syllabus section titles are displayed to learners.
galleryEnabledBooleanWhether the media gallery feature is enabled for this course.
workbookEnabledBooleanWhether the workbook feature is enabled.
linkedWorkbookEnabledBooleanWhether a linked workbook is enabled.
linkedWorkbookSkipEnabledBooleanWhether learners can skip the linked workbook.
superquizEnabledBooleanWhether the super quiz feature is enabled.
discussionsEnabledBooleanWhether discussions/comments are enabled for this course.
resourcesEnabledBooleanWhether the resources tab is enabled.
meetingsOverviewEnabledBooleanWhether the meetings overview page is enabled.
recurrenceRuleStringAn iCal RRULE string describing the recurrence schedule for the course.
recurrenceJSONJSON object representing the recurrence configuration.
readableRecurrenceStringStringA human-readable description of the recurrence schedule.
instructorAccessEnabledBooleanWhether instructor-level access purchases are enabled.
instructorEmails[String]List of instructor email addresses associated with the course.
freeWithRegistrationBooleanWhether the course is free upon site registration.
priceInCentsIntThe course price in the smallest currency unit (e.g., cents for USD).
instructorAccessPriceInCentsIntThe price for instructor-level access, in cents.
suggestedRetailPriceInCentsIntThe suggested retail price before any discounts, in cents.
alternativePricingTypeAlternativePricingTypeThe alternative pricing model applied (e.g., membership).
alternativePricingRefIntA reference identifier for the alternative pricing configuration.
accessDaysIntThe number of days a learner retains access after enrollment.
showProgressBooleanWhether the progress indicator is shown to learners.
annotationsEnabledBooleanWhether learners can add annotations to course content.
forceLinearProgressBooleanWhether learners must complete lessons in order.
completionTimePerPageIntMinimum time (in seconds) a learner must spend on each page.
askLearnerPasswordBooleanWhether learners are prompted to set a password upon enrollment.
rosterBooleanWhether roster management is enabled for this course.
topicGroupIdIDReference to the topic group used to categorize course topics.
skuStringThe stock-keeping unit identifier for the course.
prerequisiteCourses[Course]Courses that must be completed before this course can be accessed.
prerequisiteLearningPaths[LearningPath]Learning paths that must be completed before this course can be accessed.
parentCourseIdIDThe ID of the parent course, if this is a child/session course.
isChildBooleanWhether this course is a child session of a parent course.
hasMultipleCurrenciesBoolean!Whether the course has pricing configured in multiple currencies.
prices[ItemPrice!]!List of price objects for the course, supporting multiple currencies.
enrollmentActiveBooleanWhether enrollment is currently active based on dates and seat availability.
waitlistActiveBooleanWhether the waitlist is currently accepting sign-ups.
webinarDates[DateRange]Date ranges for scheduled webinar sessions.
webinarTimeZoneStringThe time zone used for webinar scheduling.
meetings[Meeting!]Scheduled in-person or virtual meeting sessions associated with the course.
inPersonEventInfoInPersonEventInfoAdditional details specific to in-person event courses.
currentUserHasAccessBoolean!Whether the currently authenticated user has access to the course.
locationLocationThe physical location associated with this course, if applicable.
displayMapBoolean!Whether a map of the location should be displayed.
publishDateDateThe date this course was published.
isActiveBoolean!Whether the course is currently active and accessible.
futurePublishDateDateA scheduled future date when the course will be published.
balanceRequirementFloatThe credit balance required to access this course.
awardClaimingOptions[CourseAwardClaimingOption!]Award types and amounts learners can claim upon course completion.
availabilityStatusStringA string describing the current availability state of the course.
embeddedEnabledBooleanWhether the course can be embedded in external pages.
displayResultsBoolean!Whether quiz or assessment results are displayed to learners.
bulkPurchasingEnabledBoolean!Whether bulk seat purchasing is enabled for this course.
seatTiers[SeatTier!]Tiered pricing options for bulk seat purchases.
seatPackages[SeatPackage!]Pre-defined seat packages available for purchase.
lastTierPriceInCentsIntThe price per seat in the highest bulk pricing tier, in cents.
webinarIdStringExternal identifier for the associated webinar session.
hasChildrenBoolean!Whether this course has child session courses.
customFieldsJSONA JSON object containing any custom metadata fields configured for the course.
kindCourseGroupKindThe content kind of the course (e.g., microCourse, webinar, inPersonEvent).
rosterSubmittedDateDateThe date when the attendance roster was submitted.
finalAssessmentStringIdentifier or reference for the course's final assessment.
scormCollectUserDetailsBooleanWhether user details are collected for SCORM reporting.
seatsUsedCountInt!The number of seats currently in use.
seatsAllocatedCountInt!The number of seats that have been allocated.
webinarDetailsWebinarBlockDetailed webinar configuration including provider, dates, and dial-in info.
showSyllabusWhileUnenrolledBooleanWhether unenrolled users can view the course syllabus.
topicGroupTopicGroupThe topic group taxonomy associated with this course.
courseGroupTitleStringThe title of the parent CourseGroup.
currentUserDueDateDateThe due date for the currently authenticated user to complete this course.

Example

query GetCourseById {
  CourseById(id: "a1b2c3d4-e5f6-7890-abcd-ef1234567890") {
    id
    title
    slug
    status
    createdAt
    updatedAt
    priceInCents
    purchasable
    enrollmentActive
    seatsLimit
    seatsLimitMet
    waitlistingEnabled
    waitlistCount
    currentUserHasAccess
    isActive
    kind
    sections {
      id
      title
      slug
      status
      lessons {
        id
        title
        slug
        accessLevel
      }
    }
    courseGroup {
      id
      title
      slug
    }
    prices {
      id
      currencyCode
      unitAmount
      isDefault
    }
  }
}

Example Response

{
  "data": {
    "CourseById": {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "title": "Introduction to GraphQL",
      "slug": "intro-to-graphql",
      "status": "published",
      "createdAt": "2023-01-15T10:00:00Z",
      "updatedAt": "2024-03-20T14:30:00Z",
      "priceInCents": 4999,
      "purchasable": true,
      "enrollmentActive": true,
      "seatsLimit": 100,
      "seatsLimitMet": false,
      "waitlistingEnabled": false,
      "waitlistCount": 0,
      "currentUserHasAccess": false,
      "isActive": true,
      "kind": "courseGroup",
      "sections": [
        {
          "id": "sec-001",
          "title": "Getting Started",
          "slug": "getting-started",
          "status": "published",
          "lessons": [
            {
              "id": "les-001",
              "title": "What is GraphQL?",
              "slug": "what-is-graphql",
              "accessLevel": "open"
            }
          ]
        }
      ],
      "courseGroup": {
        "id": "cg-001",
        "title": "Introduction to GraphQL",
        "slug": "intro-to-graphql"
      },
      "prices": [
        {
          "id": "price-001",
          "currencyCode": "USD",
          "unitAmount": 4999,
          "isDefault": true
        }
      ]
    }
  },
  "id": "abc-123",
  "createdAt": "2026-01-01T00:00:00Z",
  "updatedAt": "2026-01-01T00:00:00Z",
  "slug": "example",
  "status": "draft",
  "title": "example",
  "sessionIsTitled": false,
  "sampleLesson": null,
  "sampleLessonId": "abc-123",
  "sections": null,
  "appearanceBlock": "abc-123",
  "appearanceHash": "example",
  "paywallsBlock": "abc-123",
  "termsBlock": "abc-123",
  "confirmationBlock": "abc-123",
  "courseStartDate": "2026-01-01T00:00:00Z",
  "courseEndDate": "2026-01-01T00:00:00Z",
  "enrollmentStartDate": "2026-01-01T00:00:00Z",
  "enrollmentEndDate": "2026-01-01T00:00:00Z",
  "gracePeriodEndDate": "2026-01-01T00:00:00Z",
  "seatsLimit": 0,
  "waitlistCount": 0,
  "seatsLimitMet": false,
  "waitlistingEnabled": false,
  "waitlistingTriggered": false,
  "taxable": false,
  "purchasable": false,
  "taxCategory": "abc-123",
  "fulfillmentCenter": "abc-123",
  "courseGroup": null,
  "syllabusTitlesEnabled": false,
  "galleryEnabled": false,
  "workbookEnabled": false,
  "linkedWorkbookEnabled": false,
  "linkedWorkbookSkipEnabled": false,
  "superquizEnabled": false,
  "discussionsEnabled": false,
  "resourcesEnabled": false,
  "meetingsOverviewEnabled": false,
  "recurrenceRule": "example",
  "recurrence": {},
  "readableRecurrenceString": "example",
  "instructorAccessEnabled": false,
  "instructorEmails": [
    "example"
  ],
  "freeWithRegistration": false,
  "priceInCents": 0,
  "instructorAccessPriceInCents": 0,
  "suggestedRetailPriceInCents": 0,
  "alternativePricingType": "membership",
  "alternativePricingRef": 0,
  "accessDays": 0,
  "showProgress": false,
  "annotationsEnabled": false,
  "forceLinearProgress": false,
  "completionTimePerPage": 0,
  "askLearnerPassword": false,
  "roster": false,
  "topicGroupId": "abc-123",
  "sku": "example",
  "prerequisiteCourses": null,
  "prerequisiteLearningPaths": null,
  "parentCourseId": "abc-123",
  "isChild": false,
  "hasMultipleCurrencies": false,
  "prices": null,
  "enrollmentActive": false,
  "waitlistActive": false,
  "webinarDates": null,
  "webinarTimeZone": "example",
  "meetings": null,
  "inPersonEventInfo": null,
  "currentUserHasAccess": false,
  "location": null,
  "displayMap": false,
  "publishDate": "2026-01-01T00:00:00Z",
  "isActive": false,
  "futurePublishDate": "2026-01-01T00:00:00Z",
  "balanceRequirement": 0,
  "awardClaimingOptions": null,
  "availabilityStatus": "example",
  "embeddedEnabled": false,
  "displayResults": false,
  "bulkPurchasingEnabled": false,
  "seatTiers": null,
  "seatPackages": null,
  "lastTierPriceInCents": 0,
  "webinarId": "example",
  "hasChildren": false,
  "customFields": {},
  "kind": "microCourse",
  "rosterSubmittedDate": "2026-01-01T00:00:00Z",
  "finalAssessment": "example",
  "scormCollectUserDetails": false,
  "seatsUsedCount": 0,
  "seatsAllocatedCount": 0,
  "webinarDetails": null,
  "showSyllabusWhileUnenrolled": false,
  "topicGroup": null,
  "courseGroupTitle": "example",
  "currentUserDueDate": "2026-01-01T00:00:00Z"
}

Providing an `authToken` header scopes user-specific fields such as `currentUserHasAccess` and `currentUserDueDate` to the identified learner. Without an auth token, those fields reflect the anonymous/default state.

QueryCourseGroupBySlug1 pt

Fetch course group by slug

Retrieves a CourseGroup and all of its associated metadata by its URL slug. A CourseGroup is the catalog-level container that groups one or more course sessions together and holds display information such as title, description, asset images, pricing, tags, layout, and related content. Use this query when building catalog detail pages or when you need to resolve a content item from a slug found in a URL. The query returns `null` if no CourseGroup matches the provided slug.

Arguments

NameTypeDescription
slugSlug!The slug for the Course Group being retrieved.

Returns

FieldTypeDescription
idID!The unique identifier of the CourseGroup.
authoringClientIdIDThe ID of the client that originally authored this CourseGroup.
createdAtDateThe date and time the CourseGroup was created.
displayCourseCourseThe primary course instance used for display and enrollment purposes.
displayBundleDisplayBundleThe subscription bundle associated with this CourseGroup for display purposes.
courses[Course]All course sessions belonging to this CourseGroup.
assetStringURL of the card/thumbnail image for the CourseGroup.
assetAltTextStringAccessibility alt text for the card image.
assetLibraryIdIDReference to the media library entry for the card image.
detailAssetStringURL of the hero/detail page image.
detailAssetAltTextStringAccessibility alt text for the detail image.
detailAssetLibraryIdIDReference to the media library entry for the detail image.
videoAssetStringURL of the promotional video asset.
tabs[CourseTab]Configurable content tabs shown on the course detail page.
descriptionStringThe marketing description of the CourseGroup.
titleStringThe display title of the CourseGroup.
archivedBooleanWhether the CourseGroup has been archived.
metaTitleStringSEO meta title for the CourseGroup detail page.
metaDescriptionStringSEO meta description for the CourseGroup detail page.
languageStringThe language code for the CourseGroup content.
slugSlug!The URL-friendly slug for the CourseGroup.
ratingIntThe average learner rating (typically 1–5).
ratingsCountIntThe total number of learner ratings submitted.
relatedCourseGroups[CourseGroup]Other CourseGroups related to or recommended alongside this one.
relatedQueryStringA catalog search query string used to dynamically populate related content.
relatedQuerySortStringThe sort order applied to the related content query.
relatedQueryLimitIntThe maximum number of results returned by the related content query.
relatedQuerySignatureStringA signature hash for caching or validating the related content query.
relatedShowImageAssetBooleanWhether to show image assets in the related content display.
relatedShowDescriptionBooleanWhether to show descriptions in the related content display.
externalPurchaseUrlStringA URL to an external checkout or purchase page.
externalDetailUrlStringA URL to an external detail/landing page for this content.
layoutLayoutThe layout configuration used to render the CourseGroup detail page.
hasParentCourseGroupBooleanWhether this CourseGroup is nested under a parent CourseGroup.
tags[Tag]Tags associated with this CourseGroup for filtering and discovery.
customFieldsJSONCustom metadata fields configured for this CourseGroup.
authors[String]List of author names credited for this content.
sourceStringThe originating source or publisher of the content.
isbnStringISBN identifier, applicable for book-type content.
ribbonSlugA slug identifying a ribbon/badge to display on the content card.
contentTypeContentTypeThe content type classification for this CourseGroup.
kindCourseGroupKindThe content kind (e.g., courseGroup, webinar, article, inPersonEvent).
availabilityStatusStringA string indicating whether the content is available, coming soon, etc.
ownedByActiveScopeBoolean!Whether this CourseGroup is owned by the currently active client scope.
allowReschedulingBooleanWhether learners are permitted to reschedule their enrollment.
currentUserMayRescheduleBooleanWhether the currently authenticated user is eligible to reschedule.
isTemplateBooleanWhether this CourseGroup is a template used to create other content.

Example

query GetCourseGroupBySlug {
  CourseGroupBySlug(slug: "intro-to-graphql") {
    id
    title
    slug
    description
    status: kind
    language
    rating
    ratingsCount
    asset
    metaTitle
    metaDescription
    tags {
      id
      label
    }
    displayCourse {
      id
      priceInCents
      purchasable
      enrollmentActive
      currentUserHasAccess
    }
    layout {
      id
      kind
      hasEnrollmentWidget
    }
    contentType {
      label
      kind
    }
    authors
    customFields
  }
}

Example Response

{
  "data": {
    "CourseGroupBySlug": {
      "id": "cg-abc123",
      "title": "Introduction to GraphQL",
      "slug": "intro-to-graphql",
      "description": "Learn the fundamentals of GraphQL in this hands-on course.",
      "kind": "courseGroup",
      "language": "en",
      "rating": 4,
      "ratingsCount": 32,
      "asset": "https://cdn.example.com/images/intro-graphql.jpg",
      "metaTitle": "Introduction to GraphQL | Example Academy",
      "metaDescription": "Master GraphQL queries, mutations, and schema design.",
      "tags": [
        {
          "id": "tag-001",
          "label": "API Development"
        },
        {
          "id": "tag-002",
          "label": "Backend"
        }
      ],
      "displayCourse": {
        "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "priceInCents": 4999,
        "purchasable": true,
        "enrollmentActive": true,
        "currentUserHasAccess": false
      },
      "layout": {
        "id": "layout-001",
        "kind": "courseDetailSidebarLayout",
        "hasEnrollmentWidget": true
      },
      "contentType": {
        "label": "Course",
        "kind": "course"
      },
      "authors": [
        "Jane Smith"
      ],
      "customFields": {
        "difficulty": "beginner"
      }
    }
  },
  "id": "abc-123",
  "authoringClientId": "abc-123",
  "createdAt": "2026-01-01T00:00:00Z",
  "displayCourse": null,
  "displayBundle": null,
  "courses": null,
  "asset": "example",
  "assetAltText": "example",
  "assetLibraryId": "abc-123",
  "detailAsset": "example",
  "detailAssetAltText": "example",
  "detailAssetLibraryId": "abc-123",
  "videoAsset": "example",
  "tabs": null,
  "description": "example",
  "title": "example",
  "archived": false,
  "metaTitle": "example",
  "metaDescription": "example",
  "language": "example",
  "slug": "example",
  "rating": 0,
  "ratingsCount": 0,
  "relatedCourseGroups": null,
  "relatedQuery": "example",
  "relatedQuerySort": "example",
  "relatedQueryLimit": 0,
  "relatedQuerySignature": "example",
  "relatedShowImageAsset": false,
  "relatedShowDescription": false,
  "externalPurchaseUrl": "example",
  "externalDetailUrl": "example",
  "layout": null,
  "hasParentCourseGroup": false,
  "tags": null,
  "customFields": {},
  "authors": [
    "example"
  ],
  "source": "example",
  "isbn": "example",
  "ribbon": "example",
  "contentType": null,
  "kind": "microCourse",
  "availabilityStatus": "example",
  "ownedByActiveScope": false,
  "allowRescheduling": false,
  "currentUserMayReschedule": false,
  "isTemplate": false
}

Returns `null` if no CourseGroup exists for the given slug. The `displayCourse` field is the recommended starting point for enrollment and pricing data.

QueryCourseGroupTestimonials1 pt

Fetch testimonials for a course group

Returns all learner testimonials submitted for a specific CourseGroup, identified by its UUID. Each testimonial includes the review body text, a numerical rating, the date it was created, and the full profile of the user who submitted it. Use this query to populate social proof sections on course detail pages or to aggregate learner feedback for reporting purposes.

Arguments

NameTypeDescription
idUUID!The ID of the course group.

Returns

FieldTypeDescription
idIDThe unique identifier of the testimonial.
createdAtDateThe date and time the testimonial was submitted.
userUserThe user who submitted the testimonial, including their profile details.
bodyStringThe text content of the testimonial review.
ratingIntThe numerical rating given by the reviewer (typically 1–5).

Example

query GetCourseGroupTestimonials {
  CourseGroupTestimonials(id: "cg-abc123-def456-7890") {
    id
    createdAt
    rating
    body
    user {
      id
      name
      firstName
      lastName
      asset
    }
  }
}

Example Response

{
  "data": {
    "CourseGroupTestimonials": [
      {
        "id": "test-001",
        "createdAt": "2024-02-10T09:15:00Z",
        "rating": 5,
        "body": "This course completely changed how I think about API design. Highly recommended!",
        "user": {
          "id": "user-001",
          "name": "Alex Johnson",
          "firstName": "Alex",
          "lastName": "Johnson",
          "asset": "https://cdn.example.com/avatars/alex-johnson.jpg"
        }
      },
      {
        "id": "test-002",
        "createdAt": "2024-01-28T16:40:00Z",
        "rating": 4,
        "body": "Very well structured with practical examples. A few topics could be covered in more depth.",
        "user": {
          "id": "user-002",
          "name": "Maria Chen",
          "firstName": "Maria",
          "lastName": "Chen",
          "asset": null
        }
      }
    ]
  },
  "id": "abc-123",
  "createdAt": "2026-01-01T00:00:00Z",
  "user": null,
  "body": "example",
  "rating": 0
}
QueryPages1 pt × identifiers

Fetch page resources by identifiers

Returns detailed data for one or more content pages by their identifier strings. The response is a union of strongly-typed page objects (e.g., `TextPage`, `QuizPage`, `VideoPage`, `AssignmentPage`) so you must use inline fragments to access type-specific fields. This query is useful when you need to render or inspect specific pages within a course without loading the full course structure. If an `authToken` header is provided, some fields — such as a learner's previous quiz responses — may be personalized to the authenticated user.

Arguments

NameTypeDescription
identifiers[String!]!An array of page identifier strings (typically topic IDs or slugs) for the pages to retrieve.

Returns

FieldTypeDescription
Pages[PageResource]!An array of page resource objects. Each item is one of many concrete page types (TextPage, QuizPage, VideoPage, etc.) resolved as a union. Use `__typename` and inline fragments to access type-specific fields.

Example

query Pages($identifiers: [String!]!) {
  Pages(identifiers: $identifiers) {
    __typename
    ... on TextPage {
      id
      title
      type
      lessonId
      createdAt
      updatedAt
      body
      sidebarIsHidden
    }
    ... on QuizPage {
      id
      title
      type
      lessonId
      createdAt
      updatedAt
      minPassingPercent
      maxAttempts
      timerEnabled
      timeLimitInSeconds
      questions {
        questionId
        body
        type
        choices {
          choiceId
          value
          correct
        }
      }
    }
    ... on VideoPage {
      id
      title
      type
      lessonId
      createdAt
      updatedAt
      asset
    }
  }
}

Example Response

{
  "data": {
    "Pages": [
      {
        "__typename": "QuizPage",
        "id": "page_quiz_789",
        "title": "Chapter 2 Knowledge Check",
        "type": "quiz",
        "lessonId": "lesson_456",
        "createdAt": "2024-01-10T08:00:00Z",
        "updatedAt": "2024-02-20T14:30:00Z",
        "minPassingPercent": 75,
        "maxAttempts": 3,
        "timerEnabled": false,
        "timeLimitInSeconds": null,
        "questions": [
          {
            "questionId": "q_001",
            "body": "What does HTTP stand for?",
            "type": "multipleChoice",
            "choices": [
              {
                "choiceId": "c_1",
                "value": "HyperText Transfer Protocol",
                "correct": true
              },
              {
                "choiceId": "c_2",
                "value": "High Traffic Transport Process",
                "correct": false
              }
            ]
          }
        ]
      },
      {
        "__typename": "TextPage",
        "id": "page_text_123",
        "title": "Introduction to Networking",
        "type": "text",
        "lessonId": "lesson_456",
        "createdAt": "2024-01-10T08:00:00Z",
        "updatedAt": "2024-01-15T09:00:00Z",
        "body": "<p>Welcome to the networking module...</p>",
        "sidebarIsHidden": false
      }
    ]
  },
  "members": null
}

The return type is a GraphQL union. Always include `__typename` and use inline fragments (e.g., `... on QuizPage { }`) to access fields specific to each page type.

QueryQueryContents3 pts

Fetch multiple content items by ID

Retrieves detailed information for one or more content items by their IDs in a single request. This is useful when you already know the IDs of specific pieces of content — for example, when rendering a curated list, a learning path's contents, or a shopping cart — and need to fetch their full details including pricing, tags, enrollment data, and availability. This query has an additional cost of 3 points.

Arguments

NameTypeDescription
ids[ID!]!A required list of content item IDs to retrieve. At least one ID must be provided.

Returns

FieldTypeDescription
idID!Unique identifier for the content item.
titleStringDisplay title of the content item.
slugSlug!URL-friendly identifier for the content item.
kindContentKindThe type of content (e.g., course, webinar, learningPath, inPersonEvent).
statusStatusThe publication status of the content item.
priceInCentsIntPrice of the content item in cents.
prices[ItemPrice!]Detailed pricing information including currency, amounts, and bulk purchase tiers.
tags[Tag]Tags associated with the content item.
locationLocationPhysical location details for in-person events.
isActiveBoolean!Whether the content item is currently active.
hasChildrenBoolean!Whether the content item has child items.
enrollmentCountIntNumber of users currently enrolled in the content item.
seatsLimitIntMaximum number of seats available for this content item.
waitlistingEnabledBoolean!Whether waitlisting is enabled for this content item.
waitlistingTriggeredBoolean!Whether the waitlist has been triggered due to capacity.

Example

query QueryContents {
  QueryContents(ids: ["content_001", "content_002", "content_003"]) {
    id
    title
    slug
    kind
    status
    description
    asset
    priceInCents
    isActive
    hasChildren
    publishDate
    courseStartDate
    courseEndDate
    enrollmentCount
    seatsLimit
    waitlistingEnabled
    waitlistingTriggered
    tags {
      id
      label
      isFolder
    }
    prices {
      id
      currencyCode
      unitAmount
      isDefault
      variations {
        label
        unitAmount
      }
    }
    location {
      id
      name
      address1
      city
      state
      country
    }
  }
}

Example Response

{
  "data": {
    "QueryContents": [
      {
        "id": "content_001",
        "title": "Leadership Fundamentals",
        "slug": "leadership-fundamentals",
        "kind": "course",
        "status": "published",
        "description": "An introductory course on leadership skills.",
        "asset": "https://cdn.acme.com/leadership.jpg",
        "priceInCents": 4999,
        "isActive": true,
        "hasChildren": false,
        "publishDate": "2024-01-15",
        "courseStartDate": null,
        "courseEndDate": null,
        "enrollmentCount": 312,
        "seatsLimit": null,
        "waitlistingEnabled": false,
        "waitlistingTriggered": false,
        "tags": [
          {
            "id": "tag_001",
            "label": "Leadership",
            "isFolder": false
          }
        ],
        "prices": [
          {
            "id": "price_001",
            "currencyCode": "USD",
            "unitAmount": 4999,
            "isDefault": true,
            "variations": []
          }
        ],
        "location": null
      },
      {
        "id": "content_002",
        "title": "In-Person Workshop: Agile Methods",
        "slug": "agile-methods-workshop",
        "kind": "inPersonEvent",
        "status": "published",
        "description": "A hands-on Agile workshop held in-person.",
        "asset": "https://cdn.acme.com/agile.jpg",
        "priceInCents": 29900,
        "isActive": true,
        "hasChildren": false,
        "publishDate": "2024-03-01",
        "courseStartDate": "2024-06-10",
        "courseEndDate": "2024-06-11",
        "enrollmentCount": 18,
        "seatsLimit": 25,
        "waitlistingEnabled": true,
        "waitlistingTriggered": false,
        "tags": [],
        "prices": [
          {
            "id": "price_002",
            "currencyCode": "USD",
            "unitAmount": 29900,
            "isDefault": true,
            "variations": []
          }
        ],
        "location": {
          "id": "loc_001",
          "name": "Acme Conference Center",
          "address1": "123 Main St",
          "city": "Austin",
          "state": "TX",
          "country": "US"
        }
      }
    ]
  },
  "id": "abc-123",
  "createdAt": "2026-01-01T00:00:00Z",
  "updatedAt": "2026-01-01T00:00:00Z",
  "expiresAt": "2026-01-01T00:00:00Z",
  "courseGroup": "example",
  "title": "example",
  "sessionTitle": "example",
  "ribbon": null,
  "slug": "example",
  "kind": "courseGroup",
  "metaTitle": "example",
  "language": "example",
  "metaDescription": "example",
  "displayCourse": "abc-123",
  "displayCourseSlug": "example",
  "displayDate": "2026-01-01T00:00:00Z",
  "availabilityStatus": "example",
  "asset": "example",
  "assetAltText": "example",
  "freeWithRegistration": false,
  "priceInCents": 0,
  "suggestedRetailPriceInCents": 0,
  "alternativePricingType": "membership",
  "alternativePricingRef": 0,
  "rating": 0,
  "description": "example",
  "sku": "example",
  "hasChildren": false,
  "tags": null,
  "status": "draft",
  "customFields": {},
  "authors": [
    "example"
  ],
  "authorsAndInstructors": [
    "example"
  ],
  "contentTypeLabel": "example",
  "contentTypeAssetAspectRatio": "example",
  "waitlistCount": 0,
  "seatsLimit": 0,
  "enrollmentCount": 0,
  "source": "example",
  "publishDate": "2026-01-01T00:00:00Z",
  "courseStartDate": "2026-01-01T00:00:00Z",
  "courseEndDate": "2026-01-01T00:00:00Z",
  "enrollmentStartDate": "2026-01-01T00:00:00Z",
  "enrollmentEndDate": "2026-01-01T00:00:00Z",
  "timeZone": "example",
  "meetingStartDate": "2026-01-01T00:00:00Z",
  "coursePresold": false,
  "courseGracePeriodEnded": false,
  "currentUserMayReschedule": false,
  "isActive": false,
  "embeddedEnabled": false,
  "altDescriptionBody": "example",
  "hideCourseDescription": false,
  "annotationsEnabled": false,
  "currentUserUnmetCoursePrerequisites": [
    "abc-123"
  ],
  "currentUserUnmetLearningPathPrerequisites": [
    "abc-123"
  ],
  "currentUserDueDate": "2026-01-01T00:00:00Z",
  "url": "example",
  "waitlistingEnabled": false,
  "waitlistingTriggered": false,
  "canAddToQueue": false,
  "bulkPurchasingEnabled": false,
  "prices": null,
  "location": null,
  "state": "example",
  "acceptBadgeUrl": "example",
  "issuedAt": "2026-01-01T00:00:00Z",
  "badgeUrl": "example",
  "credlyBadgeExpiresAt": "2026-01-01T00:00:00Z",
  "imageUrl": "example",
  "badgeName": "example",
  "completedPassedDueDate": false
}

This query has an additional cost of 3 points.

QueryRelatedProducts1 pt

Fetch products related to courses and products

Returns a list of products that are related to a given set of courses and products. Related products are configured per-course in the course authoring interface under Design → Edit Catalog Settings → Detail Page. Use this query to power "you might also like" or "related content" sections on course detail pages. Both `productIds` and `courseIds` are required; supply empty arrays if you only want to filter by one dimension. Each returned product includes pricing, status, imagery, and its own nested related products.

Arguments

NameTypeDescription
productIds[ID!]!An array of product IDs to use as the basis for finding related products. Pass an empty array if filtering only by course IDs.
courseIds[ID!]!An array of course IDs whose configured related products should be returned. Pass an empty array if filtering only by product IDs.

Returns

FieldTypeDescription
idID!The unique identifier of the product.
assetURLThe URL of the product's cover image or thumbnail asset.
assetAltTextStringAccessibility alt text for the product's image asset.
assetLibraryIdIDThe ID of the asset in the media library, if applicable.
statusStatusThe publication status of the product (e.g., `published`, `draft`, `archived`).
purchasableBooleanIndicates whether the product is available for purchase.
nameStringThe display name of the product.
longDescriptionStringA detailed description of the product.
priceInCentsIntThe sale price of the product in cents (e.g., 4999 = $49.99).
languageStringThe language code of the product's content.
suggestedRetailPriceInCentsIntThe suggested retail price of the product in cents, used for displaying a crossed-out "original" price.
alternativePricingTypeAlternativePricingTypeAn alternative pricing model applied to the product, such as `membership`.
alternativePricingRefIntA reference identifier for the alternative pricing configuration (e.g., membership tier ID).
relatedProducts[Product]A nested list of products related to this product, following the same structure.

Example

query RelatedProducts {
  RelatedProducts(
    productIds: ["prod_abc123", "prod_def456"]
    courseIds: ["course_789xyz"]
  ) {
    id
    name
    status
    purchasable
    priceInCents
    suggestedRetailPriceInCents
    alternativePricingType
    alternativePricingRef
    language
    asset
    assetAltText
    assetLibraryId
    longDescription
    relatedProducts {
      id
      name
      status
      priceInCents
      purchasable
    }
  }
}

Example Response

{
  "data": {
    "RelatedProducts": [
      {
        "id": "prod_abc123",
        "name": "Advanced GraphQL Masterclass",
        "status": "published",
        "purchasable": true,
        "priceInCents": 4999,
        "suggestedRetailPriceInCents": 7999,
        "alternativePricingType": "membership",
        "alternativePricingRef": 12,
        "language": "en",
        "asset": "https://cdn.example.com/images/graphql-masterclass.jpg",
        "assetAltText": "Abstract network diagram representing GraphQL",
        "assetLibraryId": "lib_img_001",
        "longDescription": "Take your GraphQL skills to the next level with hands-on exercises and real-world projects.",
        "relatedProducts": [
          {
            "id": "prod_ghi789",
            "name": "REST to GraphQL Migration Guide",
            "status": "published",
            "priceInCents": 2999,
            "purchasable": true
          }
        ]
      }
    ]
  },
  "id": "abc-123",
  "asset": "https://example.com",
  "assetAltText": "example",
  "assetLibraryId": "abc-123",
  "status": "draft",
  "purchasable": false,
  "name": "example",
  "longDescription": "example",
  "priceInCents": 0,
  "language": "example",
  "suggestedRetailPriceInCents": 0,
  "alternativePricingType": "membership",
  "alternativePricingRef": 0,
  "relatedProducts": null
}
QueryRusticiLaunchScorm1 pt

Launch a Rustici SCORM course

Generates a launch URL and associated metadata for playing a SCORM or xAPI content object managed by the Rustici SCORM engine. Provide the ID of the topic or course and specify whether the launch is a preview. When `isPreview` is `true`, the current user must have an admin or manager role. The response includes the launch URL, embed dimensions, a registration ID, a JWT for checking registration status, and the endpoint to poll for completion updates. Use this query when building custom SCORM player integrations.

Arguments

NameTypeDescription
iddeprecatedIDOptional ID of a related content or enrollment record to associate with the launch.
topicOrCourseIdID!The ID of the topic or course containing the SCORM content to launch.
typeContentOrTopicEnumThe type of the Topic Or Course.
isPreviewBoolean!Requests the preview URL to launch SCORM content. This requires the current user to be in admin or manager role.

Returns

FieldTypeDescription
isRusticiCourseBoolean!Indicates whether the content is managed by the Rustici SCORM engine.
urlAbsoluteOrRelativeURL!The URL used to launch the SCORM content in a player.
fullscreenEmbedBoolean!Whether the SCORM content should be launched in fullscreen embed mode.
heightIntRecommended embed height in pixels for the SCORM player iframe.
widthIntRecommended embed width in pixels for the SCORM player iframe.
registrationIdID!The Rustici registration ID associated with this user's launch session.
courseTitleStringThe title of the SCORM course being launched.
registrationCheckerJWTString!A JWT used to authenticate polling requests to the registration checker endpoint.
registrationCheckerEndpointURL!The endpoint URL to poll for updates on the user's registration and completion status.
currentUserDueDateDateThe due date by which the current user must complete the content, if applicable.

Example

query RusticiLaunchScorm {
  RusticiLaunchScorm(
    topicOrCourseId: "topic_abc789"
    type: topic
    isPreview: false
  ) {
    isRusticiCourse
    url
    fullscreenEmbed
    height
    width
    registrationId
    courseTitle
    registrationCheckerJWT
    registrationCheckerEndpoint
    currentUserDueDate
  }
}

Example Response

{
  "data": {
    "RusticiLaunchScorm": {
      "isRusticiCourse": true,
      "url": "https://cloud.scorm.com/ScormEngineInterface/defaultui/launch.htm?registration=reg_001&redirectOnExitUrl=https%3A%2F%2Facme.thoughtindustries.com",
      "fullscreenEmbed": false,
      "height": 768,
      "width": 1024,
      "registrationId": "reg_001abc",
      "courseTitle": "Workplace Safety 101",
      "registrationCheckerJWT": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.placeholder",
      "registrationCheckerEndpoint": "https://api.acme.thoughtindustries.com/rustici/registration-status",
      "currentUserDueDate": "2025-12-31"
    }
  },
  "isRusticiCourse": false,
  "url": "example",
  "fullscreenEmbed": false,
  "height": 0,
  "width": 0,
  "registrationId": "abc-123",
  "courseTitle": "example",
  "registrationCheckerJWT": "example",
  "registrationCheckerEndpoint": "https://example.com",
  "currentUserDueDate": "2026-01-01T00:00:00Z"
}

When `isPreview` is `true`, the requesting user must have admin or manager role. Preview launches do not record completion data.

MutationAddResourceToQueue1 pt

Add resource to current user's queue

Adds a content resource (such as a course) to the current user's watch queue so they can return to it later. The user must already have access to the content before it can be queued. Returns `true` on success. Pass an `authToken` header to add content to the queue of a specific user rather than the caller.

Arguments

NameTypeDescription
resourceTypeContentKindThe type of content that is to be added to the queue of the current user.
resourceIdID!The ID for the resource that is to be added to the queue of the current user. For example, this could be a course ID that the user would like to view at a later time.

Returns

FieldTypeDescription
AddResourceToQueueBoolean!Returns `true` if the resource was successfully added to the current user's queue.

Example

mutation AddResourceToQueue {
  AddResourceToQueue(
    resourceType: course
    resourceId: "abc123def456"
  )
}

Example Response

{
  "data": {
    "AddResourceToQueue": true
  }
}

The user must have been granted access to the content item before it can be added to their queue. Supply an `authToken` request header to target a specific user.

MutationCopyCourse1 pt

Copy a course to create a new session

Creates a new course session by copying an existing course identified by `idToCopy`. The resulting course is a new independent record with the provided title and optional start/end dates. This is useful for scheduling recurring sessions of the same course content without rebuilding the curriculum from scratch. The copied course inherits content structure from the source but is otherwise independent.

Arguments

NameTypeDescription
idToCopyUUID!The UUID of the existing course to use as the source for the copy.
titleString!The display title for the newly created course session.
startDateDateOptional start date to set on the new course session.
endDateDateOptional end date to set on the new course session.

Returns

FieldTypeDescription
idID!Unique identifier of the newly created course copy.
titleStringDisplay title of the new course session.
statusStatusPublication status of the new course (typically 'draft' upon creation).
slugSlug!URL-friendly slug for the new course.
createdAtDateTimestamp when the course copy was created.
courseStartDateDateThe scheduled start date of the new session.
courseEndDateDateThe scheduled end date of the new session.
courseGroupCourseGroupThe course group this session belongs to.

Example

mutation CopyCourse($idToCopy: UUID!, $title: String!, $startDate: Date, $endDate: Date) {
  CopyCourse(
    idToCopy: $idToCopy
    title: $title
    startDate: $startDate
    endDate: $endDate
  ) {
    id
    title
    status
    slug
    createdAt
    courseStartDate
    courseEndDate
    courseGroup {
      id
      title
    }
  }
}

Example Response

{
  "data": {
    "CopyCourse": {
      "id": "course_00000002-0000-0000-0000-000000000001",
      "title": "Advanced API Development – Fall 2025",
      "status": "draft",
      "slug": "advanced-api-development-fall-2025",
      "createdAt": "2024-05-15T08:00:00Z",
      "courseStartDate": "2025-09-01",
      "courseEndDate": "2025-11-30",
      "courseGroup": {
        "id": "coursegroup_001",
        "title": "Advanced API Development"
      }
    }
  },
  "id": "abc-123",
  "createdAt": "2026-01-01T00:00:00Z",
  "updatedAt": "2026-01-01T00:00:00Z",
  "slug": "example",
  "status": "draft",
  "title": "example",
  "sessionIsTitled": false,
  "sampleLesson": null,
  "sampleLessonId": "abc-123",
  "sections": null,
  "appearanceBlock": "abc-123",
  "appearanceHash": "example",
  "paywallsBlock": "abc-123",
  "termsBlock": "abc-123",
  "confirmationBlock": "abc-123",
  "courseStartDate": "2026-01-01T00:00:00Z",
  "courseEndDate": "2026-01-01T00:00:00Z",
  "enrollmentStartDate": "2026-01-01T00:00:00Z",
  "enrollmentEndDate": "2026-01-01T00:00:00Z",
  "gracePeriodEndDate": "2026-01-01T00:00:00Z",
  "seatsLimit": 0,
  "waitlistCount": 0,
  "seatsLimitMet": false,
  "waitlistingEnabled": false,
  "waitlistingTriggered": false,
  "taxable": false,
  "purchasable": false,
  "taxCategory": "abc-123",
  "fulfillmentCenter": "abc-123",
  "courseGroup": null,
  "syllabusTitlesEnabled": false,
  "galleryEnabled": false,
  "workbookEnabled": false,
  "linkedWorkbookEnabled": false,
  "linkedWorkbookSkipEnabled": false,
  "superquizEnabled": false,
  "discussionsEnabled": false,
  "resourcesEnabled": false,
  "meetingsOverviewEnabled": false,
  "recurrenceRule": "example",
  "recurrence": {},
  "readableRecurrenceString": "example",
  "instructorAccessEnabled": false,
  "instructorEmails": [
    "example"
  ],
  "freeWithRegistration": false,
  "priceInCents": 0,
  "instructorAccessPriceInCents": 0,
  "suggestedRetailPriceInCents": 0,
  "alternativePricingType": "membership",
  "alternativePricingRef": 0,
  "accessDays": 0,
  "showProgress": false,
  "annotationsEnabled": false,
  "forceLinearProgress": false,
  "completionTimePerPage": 0,
  "askLearnerPassword": false,
  "roster": false,
  "topicGroupId": "abc-123",
  "sku": "example",
  "prerequisiteCourses": null,
  "prerequisiteLearningPaths": null,
  "parentCourseId": "abc-123",
  "isChild": false,
  "hasMultipleCurrencies": false,
  "prices": null,
  "enrollmentActive": false,
  "waitlistActive": false,
  "webinarDates": null,
  "webinarTimeZone": "example",
  "meetings": null,
  "inPersonEventInfo": null,
  "currentUserHasAccess": false,
  "location": null,
  "displayMap": false,
  "publishDate": "2026-01-01T00:00:00Z",
  "isActive": false,
  "futurePublishDate": "2026-01-01T00:00:00Z",
  "balanceRequirement": 0,
  "awardClaimingOptions": null,
  "availabilityStatus": "example",
  "embeddedEnabled": false,
  "displayResults": false,
  "bulkPurchasingEnabled": false,
  "seatTiers": null,
  "seatPackages": null,
  "lastTierPriceInCents": 0,
  "webinarId": "example",
  "hasChildren": false,
  "customFields": {},
  "kind": "microCourse",
  "rosterSubmittedDate": "2026-01-01T00:00:00Z",
  "finalAssessment": "example",
  "scormCollectUserDetails": false,
  "seatsUsedCount": 0,
  "seatsAllocatedCount": 0,
  "webinarDetails": null,
  "showSyllabusWhileUnenrolled": false,
  "topicGroup": null,
  "courseGroupTitle": "example",
  "currentUserDueDate": "2026-01-01T00:00:00Z"
}

The newly created course starts in draft status. Content structure (sections, lessons, topics) is copied from the source course. Enrollment records and learner progress are not copied.

MutationCreateCourseMeetings1 pt

Create meetings for a course in-person event

This mutation creates one or more meeting sessions for an existing non-recurring in-person event course. Each meeting requires at minimum a `title`, `startDate`, and `endDate` (provided via the `meetings` input array). You can optionally instruct the API to automatically create a meeting completion criterion for the course by passing `createMeetingCompletionCriteria: true`. The mutation returns the full list of newly created `Meeting` objects, each containing scheduling details, location, instructor info, and a reference back to the parent course. The behavior may be influenced by the `authToken` header used to set the acting user.

Arguments

NameTypeDescription
courseIdUUID!The UUID of the in-person event course to which the meetings will be added.
createMeetingCompletionCriteriaBooleanWhen set to true, automatically creates a completion criterion requiring attendance at this meeting.
meetings[MeetingFields!]All meetings you want to add to the event. `title`, `startDate`, and `endDate` are required for each meeting.

Returns

FieldTypeDescription
idID!The unique identifier of the meeting.
titleStringThe display title of the meeting.
courseIdID!The ID of the course (in-person event) this meeting belongs to.
courseCourse!The full course object associated with this meeting.
locationIdIDThe ID of the location associated with this meeting, if any.
locationLocationThe physical location details for this meeting.
joinUrlStringA URL attendees can use to join the meeting (e.g. a virtual meeting link).
attendeeInfoStringAdditional information provided to attendees about this meeting.
instructors[String!]A list of instructor email addresses or names associated with this meeting.
startDateDate!The date and time when the meeting begins.
endDateDate!The date and time when the meeting ends.
timeZoneStringThe time zone in which the meeting's start and end dates are expressed.
attendees[User!]The list of users who have attended or are registered for this meeting.

Example

mutation CreateCourseMeetings {
  CreateCourseMeetings(
    courseId: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    createMeetingCompletionCriteria: true
    meetings: [
      {
        title: "Day 1 Session"
        startDate: "2024-09-15T09:00:00Z"
        endDate: "2024-09-15T17:00:00Z"
        instructors: ["[email protected]"]
        joinUrl: "https://meet.example.com/session-1"
      }
    ]
  ) {
    id
    title
    courseId
    startDate
    endDate
    timeZone
    instructors
    joinUrl
    attendeeInfo
    location {
      id
      name
      address1
      city
      state
      country
    }
  }
}

Example Response

{
  "data": {
    "CreateCourseMeetings": [
      {
        "id": "meet-uuid-001",
        "title": "Day 1 Session",
        "courseId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "startDate": "2024-09-15T09:00:00Z",
        "endDate": "2024-09-15T17:00:00Z",
        "timeZone": "America/Chicago",
        "instructors": [
          "[email protected]"
        ],
        "joinUrl": "https://meet.example.com/session-1",
        "attendeeInfo": null,
        "location": null
      }
    ]
  },
  "id": "abc-123",
  "title": "example",
  "courseId": "abc-123",
  "course": null,
  "locationId": "abc-123",
  "location": null,
  "joinUrl": "example",
  "attendeeInfo": "example",
  "instructors": [
    "example"
  ],
  "startDate": "2026-01-01T00:00:00Z",
  "endDate": "2026-01-01T00:00:00Z",
  "timeZone": "example",
  "attendees": null
}

This mutation only works on non-recurring in-person event courses. Attempting to use it on a recurring event will result in an error. The `authToken` header can be used to perform the operation as a specific user.

MutationCreateInPersonEvent1 pt

Create an in-person event

Creates a new in-person event course with the specified title, date range, and one or more meeting sessions. Use this mutation when you need to programmatically provision instructor-led, physical training events. The `meetings` argument defines the individual session schedule. An optional `recurrence` argument accepts an iCalendar RRULE string to generate recurring sessions. The `contentType` argument allows you to classify the event under a specific content type label. An `authToken` header can be used to scope the operation to a particular user.

Arguments

NameTypeDescription
titleString!The display title of the in-person event.
languageStringThe BCP 47 language code for the event content (e.g., 'en', 'fr').
startDateDate!The start date and time of the event.
endDateDate!The end date and time of the event.
contentTypeStringA string identifying the content type label to assign to this event.
meetings[MeetingFields!]!An array of meeting session objects defining the schedule of individual sessions within the event.
recurrenceStringRRULE string in the format defined by the iCalendar RFC. For example, these would be valid strings: `FREQ=DAILY;INTERVAL=2;COUNT=4`, `FREQ=WEEKLY;COUNT=5`, `FREQ=YEARLY;COUNT=10`. To get more information on formatting, see the documentation here [https://datatracker.ietf.org/doc/html/rfc5545]

Returns

FieldTypeDescription
idID!The unique identifier of the newly created in-person event course.
createdAtDateTimestamp when the event was created.
updatedAtDateTimestamp when the event was last updated.
slugSlug!The URL-friendly slug for the event.
statusStatusPublication status of the event (e.g., draft, published).
titleStringThe display title of the event.
courseStartDateDateThe date and time when the event begins.
courseEndDateDateThe date and time when the event ends.
enrollmentStartDateDateWhen enrollment for the event opens.
enrollmentEndDateDateWhen enrollment for the event closes.
seatsLimitIntMaximum number of attendees allowed.
meetings[Meeting!]The scheduled meeting sessions associated with this event.
inPersonEventInfoInPersonEventInfoAdditional in-person event metadata such as subtitle and hero image.
locationLocationThe physical location where the event takes place.
displayMapBoolean!Whether to display a map for the event location.
isActiveBoolean!Whether the event is currently active and accessible.
kindCourseGroupKindThe kind of course group, which will be inPersonEvent or inPersonEventCourse.
recurrenceRuleStringThe RRULE string defining recurrence for the event.
recurrenceJSONStructured recurrence configuration as a JSON object.
readableRecurrenceStringStringA human-readable description of the recurrence pattern.
courseGroupCourseGroupThe parent course group this event session belongs to.
purchasableBoolean!Whether the event can be purchased by learners.
priceInCentsIntThe price of the event in cents.
prices[ItemPrice!]!Multi-currency pricing options for the event.
seatsLimitMetBoolean!Whether the event has reached its seat capacity.
waitlistingEnabledBoolean!Whether waitlisting is enabled for this event.
currentUserHasAccessBoolean!Whether the currently authenticated user has access to the event.
availabilityStatusStringA string describing the current enrollment availability state.
customFieldsJSONCustom field data associated with this event.

Example

mutation CreateInPersonEvent {
  CreateInPersonEvent(
    title: "Advanced Leadership Workshop"
    language: "en"
    startDate: "2024-09-15T09:00:00Z"
    endDate: "2024-09-15T17:00:00Z"
    contentType: "in-person-event"
    meetings: [
      {
        title: "Morning Session"
        startDate: "2024-09-15T09:00:00Z"
        endDate: "2024-09-15T12:00:00Z"
        timeZone: "America/New_York"
        instructors: ["Dr. Alice Johnson"]
        attendeeInfo: "Please bring a laptop and your workbook."
      }
    ]
  ) {
    id
    title
    status
    courseStartDate
    courseEndDate
    meetings {
      id
      title
      startDate
      endDate
      timeZone
      instructors
    }
    location {
      id
      name
      address1
      city
      state
      country
    }
    kind
    isActive
  }
}

Example Response

{
  "data": {
    "CreateInPersonEvent": {
      "id": "crs_01HX9Z8Y7W6V5U4T",
      "title": "Advanced Leadership Workshop",
      "status": "draft",
      "courseStartDate": "2024-09-15T09:00:00Z",
      "courseEndDate": "2024-09-15T17:00:00Z",
      "meetings": [
        {
          "id": "mtg_01HX9Z8Y7W6V5U4U",
          "title": "Morning Session",
          "startDate": "2024-09-15T09:00:00Z",
          "endDate": "2024-09-15T12:00:00Z",
          "timeZone": "America/New_York",
          "instructors": [
            "Dr. Alice Johnson"
          ]
        }
      ],
      "location": null,
      "kind": "inPersonEvent",
      "isActive": false
    }
  },
  "id": "abc-123",
  "createdAt": "2026-01-01T00:00:00Z",
  "updatedAt": "2026-01-01T00:00:00Z",
  "slug": "example",
  "status": "draft",
  "title": "example",
  "sessionIsTitled": false,
  "sampleLesson": null,
  "sampleLessonId": "abc-123",
  "sections": null,
  "appearanceBlock": "abc-123",
  "appearanceHash": "example",
  "paywallsBlock": "abc-123",
  "termsBlock": "abc-123",
  "confirmationBlock": "abc-123",
  "courseStartDate": "2026-01-01T00:00:00Z",
  "courseEndDate": "2026-01-01T00:00:00Z",
  "enrollmentStartDate": "2026-01-01T00:00:00Z",
  "enrollmentEndDate": "2026-01-01T00:00:00Z",
  "gracePeriodEndDate": "2026-01-01T00:00:00Z",
  "seatsLimit": 0,
  "waitlistCount": 0,
  "seatsLimitMet": false,
  "waitlistingEnabled": false,
  "waitlistingTriggered": false,
  "taxable": false,
  "purchasable": false,
  "taxCategory": "abc-123",
  "fulfillmentCenter": "abc-123",
  "courseGroup": null,
  "syllabusTitlesEnabled": false,
  "galleryEnabled": false,
  "workbookEnabled": false,
  "linkedWorkbookEnabled": false,
  "linkedWorkbookSkipEnabled": false,
  "superquizEnabled": false,
  "discussionsEnabled": false,
  "resourcesEnabled": false,
  "meetingsOverviewEnabled": false,
  "recurrenceRule": "example",
  "recurrence": {},
  "readableRecurrenceString": "example",
  "instructorAccessEnabled": false,
  "instructorEmails": [
    "example"
  ],
  "freeWithRegistration": false,
  "priceInCents": 0,
  "instructorAccessPriceInCents": 0,
  "suggestedRetailPriceInCents": 0,
  "alternativePricingType": "membership",
  "alternativePricingRef": 0,
  "accessDays": 0,
  "showProgress": false,
  "annotationsEnabled": false,
  "forceLinearProgress": false,
  "completionTimePerPage": 0,
  "askLearnerPassword": false,
  "roster": false,
  "topicGroupId": "abc-123",
  "sku": "example",
  "prerequisiteCourses": null,
  "prerequisiteLearningPaths": null,
  "parentCourseId": "abc-123",
  "isChild": false,
  "hasMultipleCurrencies": false,
  "prices": null,
  "enrollmentActive": false,
  "waitlistActive": false,
  "webinarDates": null,
  "webinarTimeZone": "example",
  "meetings": null,
  "inPersonEventInfo": null,
  "currentUserHasAccess": false,
  "location": null,
  "displayMap": false,
  "publishDate": "2026-01-01T00:00:00Z",
  "isActive": false,
  "futurePublishDate": "2026-01-01T00:00:00Z",
  "balanceRequirement": 0,
  "awardClaimingOptions": null,
  "availabilityStatus": "example",
  "embeddedEnabled": false,
  "displayResults": false,
  "bulkPurchasingEnabled": false,
  "seatTiers": null,
  "seatPackages": null,
  "lastTierPriceInCents": 0,
  "webinarId": "example",
  "hasChildren": false,
  "customFields": {},
  "kind": "microCourse",
  "rosterSubmittedDate": "2026-01-01T00:00:00Z",
  "finalAssessment": "example",
  "scormCollectUserDetails": false,
  "seatsUsedCount": 0,
  "seatsAllocatedCount": 0,
  "webinarDetails": null,
  "showSyllabusWhileUnenrolled": false,
  "topicGroup": null,
  "courseGroupTitle": "example",
  "currentUserDueDate": "2026-01-01T00:00:00Z"
}

The `recurrence` argument accepts an iCalendar RFC 5545 RRULE string (e.g., `FREQ=WEEKLY;COUNT=5`). The created event starts in `draft` status and must be published separately. An `authToken` header can scope the operation to a specific user.

MutationCreateLocation1 pt

Create a location for in-person events

Creates a new physical location record that can be attached to in-person event (ILT) sessions and meetings. Required fields include the location name, street address, and city. Optional fields cover room/suite, secondary address line, state, zip code, country, and time zone. The time zone should be a valid IANA time zone ID (e.g., `America/Chicago`), and the country should be a two-letter ISO 3166 code.

Arguments

NameTypeDescription
nameString!The display name for the location, such as a venue or building name.
roomStringAn optional room, suite, or floor designation within the location.
address1String!The primary street address for the location.
address2StringAn optional secondary address line (e.g., suite number or building name).
cityString!The city in which the location is situated.
stateStringFor US states, 2-letter IANA state code
zipCodeStringThe postal or ZIP code for the location.
countryString2-letter ISO 3166 country code
timeZoneStringIANA time zone ID (ex. America/New_York)

Returns

FieldTypeDescription
idID!Unique identifier of the newly created location.
nameString!Display name of the location (e.g., venue or building name).
roomStringOptional room or suite designation within the building.
address1String!Primary street address line.
address2StringSecondary street address line (e.g., suite or floor number).
cityString!City where the location resides.
stateStringState or province; use two-letter IANA state code for US states.
zipCodeStringPostal/ZIP code for the location.
countryStringTwo-letter ISO 3166 country code.
timeZoneStringIANA time zone ID for the location (e.g., America/New_York).

Example

mutation CreateLocation {
  CreateLocation(
    name: "Downtown Training Center"
    address1: "123 Main Street"
    room: "Suite 400"
    city: "Chicago"
    state: "IL"
    zipCode: "60601"
    country: "US"
    timeZone: "America/Chicago"
  ) {
    id
    name
    room
    address1
    address2
    city
    state
    zipCode
    country
    timeZone
  }
}

Example Response

{
  "data": {
    "CreateLocation": {
      "id": "loc_00000001-0000-0000-0000-000000000001",
      "name": "Downtown Training Center",
      "room": "Suite 400",
      "address1": "123 Main Street",
      "address2": null,
      "city": "Chicago",
      "state": "IL",
      "zipCode": "60601",
      "country": "US",
      "timeZone": "America/Chicago"
    }
  },
  "id": "abc-123",
  "name": "example",
  "room": "example",
  "address1": "example",
  "address2": "example",
  "city": "example",
  "state": "example",
  "zipCode": "example",
  "country": "example",
  "timeZone": "example"
}

Once created, this location can be referenced by its ID when creating or updating in-person event meetings. The `state` field expects a two-letter IANA code for US states. The `country` field expects a two-letter ISO 3166 code.

MutationCurrentUserResetCourseProgress1 pt

Reset a user's course progress

Resets the course progress for a specified learner on the course identified by its slug. Use this mutation when you need to clear a learner's completion state so they can retake a course from the beginning. The `revokeAccess` flag controls whether the learner's access to the course is also revoked as part of the reset — set it to `true` to fully remove enrollment, or `false` to reset progress while keeping access. If `userId` is omitted, the authenticated user's progress is reset.

Arguments

NameTypeDescription
userIdIDThe ID of the user whose course progress should be reset. If omitted, the authenticated user's progress is reset.
slugString!The slug of the course for which progress should be reset.
revokeAccessBoolean!When `true`, the user's access to the course is also revoked. When `false`, progress is cleared but enrollment is preserved.

Returns

FieldTypeDescription
CurrentUserResetCourseProgressBoolean!Returns `true` if the course progress was successfully reset.

Example

mutation CurrentUserResetCourseProgress {
  CurrentUserResetCourseProgress(
    userId: "user_001"
    slug: "intro-to-graphql"
    revokeAccess: false
  )
}

Example Response

{
  "data": {
    "CurrentUserResetCourseProgress": true
  }
}

This operation is destructive and irreversible — all progress data for the specified course and user will be cleared. Use with caution in production environments.

MutationDestroyMeeting1 pt

Delete a meeting from an in-person event course

This mutation permanently removes a specific meeting from a non-recurring in-person event course. Provide both the parent `courseId` and the target `meetingId` to identify the meeting to delete. On success, the mutation returns the ID of the deleted meeting. The behavior may be influenced by the `authToken` header used to set the acting user.

Arguments

NameTypeDescription
courseIdUUID!The UUID of the in-person event course that owns the meeting to be deleted.
meetingIdUUID!The UUID of the specific meeting to delete.

Returns

FieldTypeDescription
DestroyMeetingIDThe ID of the meeting that was deleted, or null if the deletion could not be confirmed.

Example

mutation DestroyMeeting {
  DestroyMeeting(
    courseId: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    meetingId: "b2c3d4e5-f6a7-8901-bcde-f12345678901"
  )
}

Example Response

{
  "data": {
    "DestroyMeeting": "b2c3d4e5-f6a7-8901-bcde-f12345678901"
  }
}

This mutation only works on non-recurring in-person event courses. Deletion is permanent and cannot be undone. The `authToken` header can be used to perform the operation as a specific user.

MutationSubmitTestimonial1 pt

Submit a course group testimonial

Allows a learner to submit a testimonial — including a text body and optional star rating — for a specific course group. Testimonials are public-facing reviews that other learners can read on the course detail page. This mutation is typically called after a learner completes a course. The user is determined by the session or the `authToken` header.

Arguments

NameTypeDescription
courseGroupIdUUID!The ID of the course group.
testimonialTestimonialInput!The testimonial input.

Returns

FieldTypeDescription
idIDUnique identifier of the submitted testimonial.
createdAtDateTimestamp when the testimonial was submitted.
userUserThe user who submitted the testimonial.
bodyStringThe text content of the testimonial.
ratingIntNumeric star rating provided by the learner (e.g., 1–5).

Example

mutation SubmitTestimonial($courseGroupId: UUID!, $testimonial: TestimonialInput!) {
  SubmitTestimonial(courseGroupId: $courseGroupId, testimonial: $testimonial) {
    id
    body
    rating
    createdAt
    user {
      id
      name
      email
    }
  }
}

Example Response

{
  "data": {
    "SubmitTestimonial": {
      "id": "test_00000001-0000-0000-0000-000000000001",
      "body": "This course completely changed how I approach API design. Highly recommended!",
      "rating": 5,
      "createdAt": "2024-05-15T14:22:00Z",
      "user": {
        "id": "user_001",
        "name": "Jane Learner",
        "email": "[email protected]"
      }
    }
  },
  "id": "abc-123",
  "createdAt": "2026-01-01T00:00:00Z",
  "user": null,
  "body": "example",
  "rating": 0
}

Testimonials are public and may be displayed on the course detail page. The authenticated user (or the user identified by the `authToken` header) is recorded as the testimonial's author.

MutationUpdateInPersonEvent1 pt

Update an in-person event session

Updates the properties of an existing in-person event (ILT) session identified by its UUID. You can modify scheduling dates, enrollment windows, seat limits, price, meetings, custom fields, and more. When updating meetings, you must provide the complete desired list of meetings in the `meetings` array — any meetings not included will be removed. To update non-meeting properties without affecting meetings, simply omit the `meetings` argument. A recurrence rule can be supplied as an iCalendar RFC 5545 RRULE string.

Arguments

NameTypeDescription
idUUID!The UUID of the in-person event session to update.
titleStringNew display title for the event session.
statusStringPublication status to set (e.g., 'draft', 'published', 'archived').
skuStringStock-keeping unit identifier for the event.
seatsLimitIntMaximum number of learner seats available for this session.
createMeetingCompletionCriteriaBooleanWhen true, automatically generates completion criteria based on meeting attendance.
assignToStringEmail of user to assign event to.
priceInCentsIntPrice of the event session in cents.
balanceRequirementIntCredit balance required to enroll in the event.
customFields[CustomFieldInput!]Array of custom field key-value pairs to update on the event.
waitlistingEnabledBooleanWhether to enable a waitlist when the seat limit is reached.
courseStartDateDateThe date the event session begins.
courseEndDateDateThe date the event session ends.
enrollmentStartDateDateThe date enrollment opens for this session.
enrollmentEndDateDateThe date enrollment closes for this session.
meetings[MeetingFields!]All meetings you want associated with the event will need to be passed in the meetings array. If you want to update the other properties on the event, omit the meetings field.
recurrenceStringRRULE string in the format defined by the iCalendar RFC. For example, these would be valid strings: `FREQ=DAILY;INTERVAL=2;COUNT=4`, `FREQ=WEEKLY;COUNT=5`, `FREQ=YEARLY;COUNT=10`. To get more information on formatting, see the documentation here [https://datatracker.ietf.org/doc/html/rfc5545]

Returns

FieldTypeDescription
idID!Unique identifier of the updated course/event session.
titleStringDisplay title of the event session.
statusStatusPublication status of the event (e.g., draft, published, archived).
seatsLimitIntMaximum number of seats available for enrollment.
waitlistingEnabledBoolean!Whether waitlisting is enabled when seats are full.
priceInCentsIntPrice of the event in cents.
courseStartDateDateDate on which the event begins.
courseEndDateDateDate on which the event ends.
enrollmentStartDateDateDate when enrollment opens.
enrollmentEndDateDateDate when enrollment closes.
meetings[Meeting!]List of scheduled meeting sessions associated with this event.
locationLocationPhysical location associated with the event.
customFieldsJSONArbitrary custom field data attached to the event.

Example

mutation UpdateInPersonEvent($id: UUID!) {
  UpdateInPersonEvent(
    id: $id
    title: "Spring Workshop 2025"
    status: "published"
    seatsLimit: 30
    waitlistingEnabled: true
    priceInCents: 19900
    courseStartDate: "2025-03-10"
    courseEndDate: "2025-03-12"
    enrollmentStartDate: "2025-01-01"
    enrollmentEndDate: "2025-03-01"
    meetings: [
      {
        startDate: "2025-03-10T09:00:00Z"
        endDate: "2025-03-10T17:00:00Z"
        timeZone: "America/New_York"
        locationId: "loc_001"
        instructors: ["[email protected]"]
      }
    ]
  ) {
    id
    title
    status
    seatsLimit
    waitlistingEnabled
    priceInCents
    courseStartDate
    courseEndDate
    enrollmentStartDate
    enrollmentEndDate
    meetings {
      id
      startDate
      endDate
      timeZone
      location {
        id
        name
        city
      }
    }
  }
}

Example Response

{
  "data": {
    "UpdateInPersonEvent": {
      "id": "course_00000001-0000-0000-0000-000000000099",
      "title": "Spring Workshop 2025",
      "status": "published",
      "seatsLimit": 30,
      "waitlistingEnabled": true,
      "priceInCents": 19900,
      "courseStartDate": "2025-03-10",
      "courseEndDate": "2025-03-12",
      "enrollmentStartDate": "2025-01-01",
      "enrollmentEndDate": "2025-03-01",
      "meetings": [
        {
          "id": "meeting_001",
          "startDate": "2025-03-10T09:00:00Z",
          "endDate": "2025-03-10T17:00:00Z",
          "timeZone": "America/New_York",
          "location": {
            "id": "loc_001",
            "name": "Main Conference Center",
            "city": "New York"
          }
        }
      ]
    }
  },
  "id": "abc-123",
  "createdAt": "2026-01-01T00:00:00Z",
  "updatedAt": "2026-01-01T00:00:00Z",
  "slug": "example",
  "status": "draft",
  "title": "example",
  "sessionIsTitled": false,
  "sampleLesson": null,
  "sampleLessonId": "abc-123",
  "sections": null,
  "appearanceBlock": "abc-123",
  "appearanceHash": "example",
  "paywallsBlock": "abc-123",
  "termsBlock": "abc-123",
  "confirmationBlock": "abc-123",
  "courseStartDate": "2026-01-01T00:00:00Z",
  "courseEndDate": "2026-01-01T00:00:00Z",
  "enrollmentStartDate": "2026-01-01T00:00:00Z",
  "enrollmentEndDate": "2026-01-01T00:00:00Z",
  "gracePeriodEndDate": "2026-01-01T00:00:00Z",
  "seatsLimit": 0,
  "waitlistCount": 0,
  "seatsLimitMet": false,
  "waitlistingEnabled": false,
  "waitlistingTriggered": false,
  "taxable": false,
  "purchasable": false,
  "taxCategory": "abc-123",
  "fulfillmentCenter": "abc-123",
  "courseGroup": null,
  "syllabusTitlesEnabled": false,
  "galleryEnabled": false,
  "workbookEnabled": false,
  "linkedWorkbookEnabled": false,
  "linkedWorkbookSkipEnabled": false,
  "superquizEnabled": false,
  "discussionsEnabled": false,
  "resourcesEnabled": false,
  "meetingsOverviewEnabled": false,
  "recurrenceRule": "example",
  "recurrence": {},
  "readableRecurrenceString": "example",
  "instructorAccessEnabled": false,
  "instructorEmails": [
    "example"
  ],
  "freeWithRegistration": false,
  "priceInCents": 0,
  "instructorAccessPriceInCents": 0,
  "suggestedRetailPriceInCents": 0,
  "alternativePricingType": "membership",
  "alternativePricingRef": 0,
  "accessDays": 0,
  "showProgress": false,
  "annotationsEnabled": false,
  "forceLinearProgress": false,
  "completionTimePerPage": 0,
  "askLearnerPassword": false,
  "roster": false,
  "topicGroupId": "abc-123",
  "sku": "example",
  "prerequisiteCourses": null,
  "prerequisiteLearningPaths": null,
  "parentCourseId": "abc-123",
  "isChild": false,
  "hasMultipleCurrencies": false,
  "prices": null,
  "enrollmentActive": false,
  "waitlistActive": false,
  "webinarDates": null,
  "webinarTimeZone": "example",
  "meetings": null,
  "inPersonEventInfo": null,
  "currentUserHasAccess": false,
  "location": null,
  "displayMap": false,
  "publishDate": "2026-01-01T00:00:00Z",
  "isActive": false,
  "futurePublishDate": "2026-01-01T00:00:00Z",
  "balanceRequirement": 0,
  "awardClaimingOptions": null,
  "availabilityStatus": "example",
  "embeddedEnabled": false,
  "displayResults": false,
  "bulkPurchasingEnabled": false,
  "seatTiers": null,
  "seatPackages": null,
  "lastTierPriceInCents": 0,
  "webinarId": "example",
  "hasChildren": false,
  "customFields": {},
  "kind": "microCourse",
  "rosterSubmittedDate": "2026-01-01T00:00:00Z",
  "finalAssessment": "example",
  "scormCollectUserDetails": false,
  "seatsUsedCount": 0,
  "seatsAllocatedCount": 0,
  "webinarDetails": null,
  "showSyllabusWhileUnenrolled": false,
  "topicGroup": null,
  "courseGroupTitle": "example",
  "currentUserDueDate": "2026-01-01T00:00:00Z"
}

When supplying the `meetings` argument, you must pass all desired meetings — this field performs a full replace, not a merge. Omit `meetings` entirely if you only need to update other event properties. The `recurrence` argument accepts an iCalendar RFC 5545 RRULE string.

MutationUpdateMeeting1 pt

Update a meeting on an in-person event course

This mutation updates the details of an existing meeting on a non-recurring in-person event course. All fields except `courseId` and `meetingId` are optional, so you can update just the fields you need to change — such as rescheduling dates, swapping the location, changing instructors, or updating the join URL and attendee information. The mutation returns the full updated `Meeting` object. The behavior may be influenced by the `authToken` header used to set the acting user.

Arguments

NameTypeDescription
courseIdUUID!The UUID of the in-person event course that owns the meeting to be updated.
meetingIdUUID!The UUID of the specific meeting to update.
titleStringThe new display title for the meeting.
locationUUIDThe UUID of a location record to associate with this meeting.
joinUrlStringA URL that attendees can use to join the meeting virtually.
attendeeInfoStringFree-text information to communicate to attendees about the meeting.
instructors[String!]A list of instructor email addresses or identifiers to assign to the meeting.
startDateDateThe updated start date and time for the meeting.
endDateDateThe updated end date and time for the meeting.

Returns

FieldTypeDescription
idID!The unique identifier of the updated meeting.
titleStringThe display title of the meeting.
courseIdID!The ID of the course (in-person event) this meeting belongs to.
courseCourse!The full course object associated with this meeting.
locationIdIDThe ID of the location associated with this meeting, if any.
locationLocationThe physical location details for this meeting.
joinUrlStringA URL attendees can use to join the meeting.
attendeeInfoStringAdditional information provided to attendees about this meeting.
instructors[String!]A list of instructor email addresses or names associated with this meeting.
startDateDate!The date and time when the meeting begins.
endDateDate!The date and time when the meeting ends.
timeZoneStringThe time zone in which the meeting's start and end dates are expressed.
attendees[User!]The list of users who have attended or are registered for this meeting.

Example

mutation UpdateMeeting {
  UpdateMeeting(
    courseId: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
    meetingId: "b2c3d4e5-f6a7-8901-bcde-f12345678901"
    title: "Day 1 Session (Updated)"
    startDate: "2024-09-15T10:00:00Z"
    endDate: "2024-09-15T18:00:00Z"
    instructors: ["[email protected]"]
    joinUrl: "https://meet.example.com/updated-session"
    attendeeInfo: "Please bring a laptop."
  ) {
    id
    title
    startDate
    endDate
    instructors
    joinUrl
    attendeeInfo
    location {
      id
      name
      city
      state
    }
  }
}

Example Response

{
  "data": {
    "UpdateMeeting": {
      "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "title": "Day 1 Session (Updated)",
      "startDate": "2024-09-15T10:00:00Z",
      "endDate": "2024-09-15T18:00:00Z",
      "instructors": [
        "[email protected]"
      ],
      "joinUrl": "https://meet.example.com/updated-session",
      "attendeeInfo": "Please bring a laptop.",
      "location": {
        "id": "loc-uuid-001",
        "name": "Main Conference Center",
        "city": "Chicago",
        "state": "IL"
      }
    }
  },
  "id": "abc-123",
  "title": "example",
  "courseId": "abc-123",
  "course": null,
  "locationId": "abc-123",
  "location": null,
  "joinUrl": "example",
  "attendeeInfo": "example",
  "instructors": [
    "example"
  ],
  "startDate": "2026-01-01T00:00:00Z",
  "endDate": "2026-01-01T00:00:00Z",
  "timeZone": "example",
  "attendees": null
}

This mutation only works on non-recurring in-person event courses. The `authToken` header can be used to perform the operation as a specific user.