Content Endpoints
Core queries for fetching catalog, courses, and lesson topics.
CatalogContent3 ptsFetch 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
| Name | Type | Required | Description |
|---|---|---|---|
| layoutId | ID | No | The id of the custom catalog widget layout. |
| widgetId | ID | No | The id of the custom catalog widget. |
| sortdeprecated | String | No | A legacy sort string used to specify the sort order. Prefer using `sortColumn` and `sortDirection` instead. |
| sortColumn | SortColumn | No | The 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`. |
| sortDirection | SortDirection | No | The 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`. |
| resultsDisplayType | ContentItemDisplayType | No | The 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`. |
| page | Int! | Yes | The page number to return within the collection. |
| token | String | No | The secure catalog query. The value is encoded by the secret key of user's Thought Industries instance. |
| labels | [String!] | No | The list of aggregation labels. The order of list items will match with argument `labels`. Labels are custom fields. |
| values | [String!] | No | The list of aggregation values. The order of list items will match with argument `values`. Values are custom fields. |
| contentTypes | [String!] | No | The list of content types to be queried. |
| query | String | No | The search query. |
Returns
| Field | Type | Description |
|---|---|---|
| contentItems | [Content!] | The paginated list of catalog content items matching the specified filters and sorting criteria. |
| meta | CatalogMeta! | 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.
CatalogQuery3 pts × queryLimitSearch 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
| Name | Type | Required | Description |
|---|---|---|---|
| query | String | No | The free-text search string used to find matching catalog content items. |
| querySignature | String | No | A cryptographically signed string representing a pre-configured or secured search query. |
| querySort | String | No | A string specifying the sort order for the search results (e.g., `title_asc`, `createdAt_desc`). |
| page | Int | No | The page number to return within the collection. |
| queryExclusions | [String!] | No | A list of content item IDs to exclude from the search results. |
| queryLimit | Int | No | The maximum number of content items to return per page. |
Returns
| Field | Type | Description |
|---|---|---|
| contentItems | [Content!] | The list of catalog content items matching the search query and filters. |
| meta | CatalogMeta! | 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
}CourseById1 ptFetch 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
| Name | Type | Required | Description |
|---|---|---|---|
| id | ID! | Yes | The ID of the course. This can fetched from CatalogContent > displayCourse. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | The unique identifier of the course. |
| createdAt | Date | The date and time when the course was created. |
| updatedAt | Date | The date and time when the course was last updated. |
| slug | Slug! | The URL-friendly slug for the course. |
| status | Status | The publication status of the course (e.g., draft, published, archived). |
| title | String | The display title of the course. |
| sessionIsTitled | Boolean! | Whether individual sessions within the course have titles. |
| sampleLesson | Lesson | An optional free preview lesson associated with the course. |
| sampleLessonId | ID | The ID of the sample/preview lesson. |
| sections | [Section] | The list of sections (modules) that organize lessons within the course. |
| appearanceBlock | ID | Reference to the appearance configuration block for the course. |
| appearanceHash | String | A hash representing the current appearance configuration state. |
| paywallsBlock | ID | Reference to the paywall configuration block for the course. |
| termsBlock | ID | Reference to the terms and conditions block for the course. |
| confirmationBlock | ID | Reference to the enrollment confirmation block for the course. |
| courseStartDate | Date | The date when the course content becomes available to learners. |
| courseEndDate | Date | The date when learner access to course content ends. |
| enrollmentStartDate | Date | The date when enrollment opens for this course. |
| enrollmentEndDate | Date | The date when enrollment closes for this course. |
| gracePeriodEndDate | Date | The date after which access is fully revoked following course end. |
| seatsLimit | Int | The maximum number of learners allowed to enroll. |
| waitlistCount | Int | The number of learners currently on the waitlist. |
| seatsLimitMet | Boolean! | Whether the enrollment seat limit has been reached. |
| waitlistingEnabled | Boolean! | Whether waitlisting is enabled for this course. |
| waitlistingTriggered | Boolean! | Whether the waitlist has been activated due to seats being full. |
| taxable | Boolean | Whether the course is subject to tax. |
| purchasable | Boolean! | Whether the course can be purchased. |
| taxCategory | ID | Reference to the tax category applied to this course. |
| fulfillmentCenter | ID | Reference to the fulfillment center associated with this course. |
| courseGroup | CourseGroup | The CourseGroup this course belongs to, containing catalog-level metadata. |
| syllabusTitlesEnabled | Boolean | Whether syllabus section titles are displayed to learners. |
| galleryEnabled | Boolean | Whether the media gallery feature is enabled for this course. |
| workbookEnabled | Boolean | Whether the workbook feature is enabled. |
| linkedWorkbookEnabled | Boolean | Whether a linked workbook is enabled. |
| linkedWorkbookSkipEnabled | Boolean | Whether learners can skip the linked workbook. |
| superquizEnabled | Boolean | Whether the super quiz feature is enabled. |
| discussionsEnabled | Boolean | Whether discussions/comments are enabled for this course. |
| resourcesEnabled | Boolean | Whether the resources tab is enabled. |
| meetingsOverviewEnabled | Boolean | Whether the meetings overview page is enabled. |
| recurrenceRule | String | An iCal RRULE string describing the recurrence schedule for the course. |
| recurrence | JSON | JSON object representing the recurrence configuration. |
| readableRecurrenceString | String | A human-readable description of the recurrence schedule. |
| instructorAccessEnabled | Boolean | Whether instructor-level access purchases are enabled. |
| instructorEmails | [String] | List of instructor email addresses associated with the course. |
| freeWithRegistration | Boolean | Whether the course is free upon site registration. |
| priceInCents | Int | The course price in the smallest currency unit (e.g., cents for USD). |
| instructorAccessPriceInCents | Int | The price for instructor-level access, in cents. |
| suggestedRetailPriceInCents | Int | The suggested retail price before any discounts, in cents. |
| alternativePricingType | AlternativePricingType | The alternative pricing model applied (e.g., membership). |
| alternativePricingRef | Int | A reference identifier for the alternative pricing configuration. |
| accessDays | Int | The number of days a learner retains access after enrollment. |
| showProgress | Boolean | Whether the progress indicator is shown to learners. |
| annotationsEnabled | Boolean | Whether learners can add annotations to course content. |
| forceLinearProgress | Boolean | Whether learners must complete lessons in order. |
| completionTimePerPage | Int | Minimum time (in seconds) a learner must spend on each page. |
| askLearnerPassword | Boolean | Whether learners are prompted to set a password upon enrollment. |
| roster | Boolean | Whether roster management is enabled for this course. |
| topicGroupId | ID | Reference to the topic group used to categorize course topics. |
| sku | String | The 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. |
| parentCourseId | ID | The ID of the parent course, if this is a child/session course. |
| isChild | Boolean | Whether this course is a child session of a parent course. |
| hasMultipleCurrencies | Boolean! | Whether the course has pricing configured in multiple currencies. |
| prices | [ItemPrice!]! | List of price objects for the course, supporting multiple currencies. |
| enrollmentActive | Boolean | Whether enrollment is currently active based on dates and seat availability. |
| waitlistActive | Boolean | Whether the waitlist is currently accepting sign-ups. |
| webinarDates | [DateRange] | Date ranges for scheduled webinar sessions. |
| webinarTimeZone | String | The time zone used for webinar scheduling. |
| meetings | [Meeting!] | Scheduled in-person or virtual meeting sessions associated with the course. |
| inPersonEventInfo | InPersonEventInfo | Additional details specific to in-person event courses. |
| currentUserHasAccess | Boolean! | Whether the currently authenticated user has access to the course. |
| location | Location | The physical location associated with this course, if applicable. |
| displayMap | Boolean! | Whether a map of the location should be displayed. |
| publishDate | Date | The date this course was published. |
| isActive | Boolean! | Whether the course is currently active and accessible. |
| futurePublishDate | Date | A scheduled future date when the course will be published. |
| balanceRequirement | Float | The credit balance required to access this course. |
| awardClaimingOptions | [CourseAwardClaimingOption!] | Award types and amounts learners can claim upon course completion. |
| availabilityStatus | String | A string describing the current availability state of the course. |
| embeddedEnabled | Boolean | Whether the course can be embedded in external pages. |
| displayResults | Boolean! | Whether quiz or assessment results are displayed to learners. |
| bulkPurchasingEnabled | Boolean! | 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. |
| lastTierPriceInCents | Int | The price per seat in the highest bulk pricing tier, in cents. |
| webinarId | String | External identifier for the associated webinar session. |
| hasChildren | Boolean! | Whether this course has child session courses. |
| customFields | JSON | A JSON object containing any custom metadata fields configured for the course. |
| kind | CourseGroupKind | The content kind of the course (e.g., microCourse, webinar, inPersonEvent). |
| rosterSubmittedDate | Date | The date when the attendance roster was submitted. |
| finalAssessment | String | Identifier or reference for the course's final assessment. |
| scormCollectUserDetails | Boolean | Whether user details are collected for SCORM reporting. |
| seatsUsedCount | Int! | The number of seats currently in use. |
| seatsAllocatedCount | Int! | The number of seats that have been allocated. |
| webinarDetails | WebinarBlock | Detailed webinar configuration including provider, dates, and dial-in info. |
| showSyllabusWhileUnenrolled | Boolean | Whether unenrolled users can view the course syllabus. |
| topicGroup | TopicGroup | The topic group taxonomy associated with this course. |
| courseGroupTitle | String | The title of the parent CourseGroup. |
| currentUserDueDate | Date | The 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.
CourseGroupBySlug1 ptFetch 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
| Name | Type | Required | Description |
|---|---|---|---|
| slug | Slug! | Yes | The slug for the Course Group being retrieved. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | The unique identifier of the CourseGroup. |
| authoringClientId | ID | The ID of the client that originally authored this CourseGroup. |
| createdAt | Date | The date and time the CourseGroup was created. |
| displayCourse | Course | The primary course instance used for display and enrollment purposes. |
| displayBundle | DisplayBundle | The subscription bundle associated with this CourseGroup for display purposes. |
| courses | [Course] | All course sessions belonging to this CourseGroup. |
| asset | String | URL of the card/thumbnail image for the CourseGroup. |
| assetAltText | String | Accessibility alt text for the card image. |
| assetLibraryId | ID | Reference to the media library entry for the card image. |
| detailAsset | String | URL of the hero/detail page image. |
| detailAssetAltText | String | Accessibility alt text for the detail image. |
| detailAssetLibraryId | ID | Reference to the media library entry for the detail image. |
| videoAsset | String | URL of the promotional video asset. |
| tabs | [CourseTab] | Configurable content tabs shown on the course detail page. |
| description | String | The marketing description of the CourseGroup. |
| title | String | The display title of the CourseGroup. |
| archived | Boolean | Whether the CourseGroup has been archived. |
| metaTitle | String | SEO meta title for the CourseGroup detail page. |
| metaDescription | String | SEO meta description for the CourseGroup detail page. |
| language | String | The language code for the CourseGroup content. |
| slug | Slug! | The URL-friendly slug for the CourseGroup. |
| rating | Int | The average learner rating (typically 1–5). |
| ratingsCount | Int | The total number of learner ratings submitted. |
| relatedCourseGroups | [CourseGroup] | Other CourseGroups related to or recommended alongside this one. |
| relatedQuery | String | A catalog search query string used to dynamically populate related content. |
| relatedQuerySort | String | The sort order applied to the related content query. |
| relatedQueryLimit | Int | The maximum number of results returned by the related content query. |
| relatedQuerySignature | String | A signature hash for caching or validating the related content query. |
| relatedShowImageAsset | Boolean | Whether to show image assets in the related content display. |
| relatedShowDescription | Boolean | Whether to show descriptions in the related content display. |
| externalPurchaseUrl | String | A URL to an external checkout or purchase page. |
| externalDetailUrl | String | A URL to an external detail/landing page for this content. |
| layout | Layout | The layout configuration used to render the CourseGroup detail page. |
| hasParentCourseGroup | Boolean | Whether this CourseGroup is nested under a parent CourseGroup. |
| tags | [Tag] | Tags associated with this CourseGroup for filtering and discovery. |
| customFields | JSON | Custom metadata fields configured for this CourseGroup. |
| authors | [String] | List of author names credited for this content. |
| source | String | The originating source or publisher of the content. |
| isbn | String | ISBN identifier, applicable for book-type content. |
| ribbon | Slug | A slug identifying a ribbon/badge to display on the content card. |
| contentType | ContentType | The content type classification for this CourseGroup. |
| kind | CourseGroupKind | The content kind (e.g., courseGroup, webinar, article, inPersonEvent). |
| availabilityStatus | String | A string indicating whether the content is available, coming soon, etc. |
| ownedByActiveScope | Boolean! | Whether this CourseGroup is owned by the currently active client scope. |
| allowRescheduling | Boolean | Whether learners are permitted to reschedule their enrollment. |
| currentUserMayReschedule | Boolean | Whether the currently authenticated user is eligible to reschedule. |
| isTemplate | Boolean | Whether 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.
CourseGroupTestimonials1 ptFetch 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
| Name | Type | Required | Description |
|---|---|---|---|
| id | UUID! | Yes | The ID of the course group. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID | The unique identifier of the testimonial. |
| createdAt | Date | The date and time the testimonial was submitted. |
| user | User | The user who submitted the testimonial, including their profile details. |
| body | String | The text content of the testimonial review. |
| rating | Int | The 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
}Pages1 pt × identifiersFetch 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
| Name | Type | Required | Description |
|---|---|---|---|
| identifiers | [String!]! | Yes | An array of page identifier strings (typically topic IDs or slugs) for the pages to retrieve. |
Returns
| Field | Type | Description |
|---|---|---|
| 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.
QueryContents3 ptsFetch 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
| Name | Type | Required | Description |
|---|---|---|---|
| ids | [ID!]! | Yes | A required list of content item IDs to retrieve. At least one ID must be provided. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | Unique identifier for the content item. |
| title | String | Display title of the content item. |
| slug | Slug! | URL-friendly identifier for the content item. |
| kind | ContentKind | The type of content (e.g., course, webinar, learningPath, inPersonEvent). |
| status | Status | The publication status of the content item. |
| priceInCents | Int | Price 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. |
| location | Location | Physical location details for in-person events. |
| isActive | Boolean! | Whether the content item is currently active. |
| hasChildren | Boolean! | Whether the content item has child items. |
| enrollmentCount | Int | Number of users currently enrolled in the content item. |
| seatsLimit | Int | Maximum number of seats available for this content item. |
| waitlistingEnabled | Boolean! | Whether waitlisting is enabled for this content item. |
| waitlistingTriggered | Boolean! | 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.
RelatedProducts1 ptFetch 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
| Name | Type | Required | Description |
|---|---|---|---|
| productIds | [ID!]! | Yes | 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!]! | Yes | An array of course IDs whose configured related products should be returned. Pass an empty array if filtering only by product IDs. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | The unique identifier of the product. |
| asset | URL | The URL of the product's cover image or thumbnail asset. |
| assetAltText | String | Accessibility alt text for the product's image asset. |
| assetLibraryId | ID | The ID of the asset in the media library, if applicable. |
| status | Status | The publication status of the product (e.g., `published`, `draft`, `archived`). |
| purchasable | Boolean | Indicates whether the product is available for purchase. |
| name | String | The display name of the product. |
| longDescription | String | A detailed description of the product. |
| priceInCents | Int | The sale price of the product in cents (e.g., 4999 = $49.99). |
| language | String | The language code of the product's content. |
| suggestedRetailPriceInCents | Int | The suggested retail price of the product in cents, used for displaying a crossed-out "original" price. |
| alternativePricingType | AlternativePricingType | An alternative pricing model applied to the product, such as `membership`. |
| alternativePricingRef | Int | A 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
}RusticiLaunchScorm1 ptLaunch 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
| Name | Type | Required | Description |
|---|---|---|---|
| iddeprecated | ID | No | Optional ID of a related content or enrollment record to associate with the launch. |
| topicOrCourseId | ID! | Yes | The ID of the topic or course containing the SCORM content to launch. |
| type | ContentOrTopicEnum | No | The type of the Topic Or Course. |
| isPreview | Boolean! | Yes | Requests the preview URL to launch SCORM content. This requires the current user to be in admin or manager role. |
Returns
| Field | Type | Description |
|---|---|---|
| isRusticiCourse | Boolean! | Indicates whether the content is managed by the Rustici SCORM engine. |
| url | AbsoluteOrRelativeURL! | The URL used to launch the SCORM content in a player. |
| fullscreenEmbed | Boolean! | Whether the SCORM content should be launched in fullscreen embed mode. |
| height | Int | Recommended embed height in pixels for the SCORM player iframe. |
| width | Int | Recommended embed width in pixels for the SCORM player iframe. |
| registrationId | ID! | The Rustici registration ID associated with this user's launch session. |
| courseTitle | String | The title of the SCORM course being launched. |
| registrationCheckerJWT | String! | A JWT used to authenticate polling requests to the registration checker endpoint. |
| registrationCheckerEndpoint | URL! | The endpoint URL to poll for updates on the user's registration and completion status. |
| currentUserDueDate | Date | The 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.
AddResourceToQueue1 ptAdd 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
| Name | Type | Required | Description |
|---|---|---|---|
| resourceType | ContentKind | No | The type of content that is to be added to the queue of the current user. |
| resourceId | ID! | Yes | 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
| Field | Type | Description |
|---|---|---|
| AddResourceToQueue | Boolean! | 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.
CopyCourse1 ptCopy 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
| Name | Type | Required | Description |
|---|---|---|---|
| idToCopy | UUID! | Yes | The UUID of the existing course to use as the source for the copy. |
| title | String! | Yes | The display title for the newly created course session. |
| startDate | Date | No | Optional start date to set on the new course session. |
| endDate | Date | No | Optional end date to set on the new course session. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | Unique identifier of the newly created course copy. |
| title | String | Display title of the new course session. |
| status | Status | Publication status of the new course (typically 'draft' upon creation). |
| slug | Slug! | URL-friendly slug for the new course. |
| createdAt | Date | Timestamp when the course copy was created. |
| courseStartDate | Date | The scheduled start date of the new session. |
| courseEndDate | Date | The scheduled end date of the new session. |
| courseGroup | CourseGroup | The 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.
CreateCourseMeetings1 ptCreate 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
| Name | Type | Required | Description |
|---|---|---|---|
| courseId | UUID! | Yes | The UUID of the in-person event course to which the meetings will be added. |
| createMeetingCompletionCriteria | Boolean | No | When set to true, automatically creates a completion criterion requiring attendance at this meeting. |
| meetings | [MeetingFields!] | No | All meetings you want to add to the event. `title`, `startDate`, and `endDate` are required for each meeting. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | The unique identifier of the meeting. |
| title | String | The display title of the meeting. |
| courseId | ID! | The ID of the course (in-person event) this meeting belongs to. |
| course | Course! | The full course object associated with this meeting. |
| locationId | ID | The ID of the location associated with this meeting, if any. |
| location | Location | The physical location details for this meeting. |
| joinUrl | String | A URL attendees can use to join the meeting (e.g. a virtual meeting link). |
| attendeeInfo | String | Additional information provided to attendees about this meeting. |
| instructors | [String!] | A list of instructor email addresses or names associated with this meeting. |
| startDate | Date! | The date and time when the meeting begins. |
| endDate | Date! | The date and time when the meeting ends. |
| timeZone | String | The 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.
CreateInPersonEvent1 ptCreate 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
| Name | Type | Required | Description |
|---|---|---|---|
| title | String! | Yes | The display title of the in-person event. |
| language | String | No | The BCP 47 language code for the event content (e.g., 'en', 'fr'). |
| startDate | Date! | Yes | The start date and time of the event. |
| endDate | Date! | Yes | The end date and time of the event. |
| contentType | String | No | A string identifying the content type label to assign to this event. |
| meetings | [MeetingFields!]! | Yes | An array of meeting session objects defining the schedule of individual sessions within the event. |
| recurrence | String | No | RRULE 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
| Field | Type | Description |
|---|---|---|
| id | ID! | The unique identifier of the newly created in-person event course. |
| createdAt | Date | Timestamp when the event was created. |
| updatedAt | Date | Timestamp when the event was last updated. |
| slug | Slug! | The URL-friendly slug for the event. |
| status | Status | Publication status of the event (e.g., draft, published). |
| title | String | The display title of the event. |
| courseStartDate | Date | The date and time when the event begins. |
| courseEndDate | Date | The date and time when the event ends. |
| enrollmentStartDate | Date | When enrollment for the event opens. |
| enrollmentEndDate | Date | When enrollment for the event closes. |
| seatsLimit | Int | Maximum number of attendees allowed. |
| meetings | [Meeting!] | The scheduled meeting sessions associated with this event. |
| inPersonEventInfo | InPersonEventInfo | Additional in-person event metadata such as subtitle and hero image. |
| location | Location | The physical location where the event takes place. |
| displayMap | Boolean! | Whether to display a map for the event location. |
| isActive | Boolean! | Whether the event is currently active and accessible. |
| kind | CourseGroupKind | The kind of course group, which will be inPersonEvent or inPersonEventCourse. |
| recurrenceRule | String | The RRULE string defining recurrence for the event. |
| recurrence | JSON | Structured recurrence configuration as a JSON object. |
| readableRecurrenceString | String | A human-readable description of the recurrence pattern. |
| courseGroup | CourseGroup | The parent course group this event session belongs to. |
| purchasable | Boolean! | Whether the event can be purchased by learners. |
| priceInCents | Int | The price of the event in cents. |
| prices | [ItemPrice!]! | Multi-currency pricing options for the event. |
| seatsLimitMet | Boolean! | Whether the event has reached its seat capacity. |
| waitlistingEnabled | Boolean! | Whether waitlisting is enabled for this event. |
| currentUserHasAccess | Boolean! | Whether the currently authenticated user has access to the event. |
| availabilityStatus | String | A string describing the current enrollment availability state. |
| customFields | JSON | Custom 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.
CreateLocation1 ptCreate 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
| Name | Type | Required | Description |
|---|---|---|---|
| name | String! | Yes | The display name for the location, such as a venue or building name. |
| room | String | No | An optional room, suite, or floor designation within the location. |
| address1 | String! | Yes | The primary street address for the location. |
| address2 | String | No | An optional secondary address line (e.g., suite number or building name). |
| city | String! | Yes | The city in which the location is situated. |
| state | String | No | For US states, 2-letter IANA state code |
| zipCode | String | No | The postal or ZIP code for the location. |
| country | String | No | 2-letter ISO 3166 country code |
| timeZone | String | No | IANA time zone ID (ex. America/New_York) |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | Unique identifier of the newly created location. |
| name | String! | Display name of the location (e.g., venue or building name). |
| room | String | Optional room or suite designation within the building. |
| address1 | String! | Primary street address line. |
| address2 | String | Secondary street address line (e.g., suite or floor number). |
| city | String! | City where the location resides. |
| state | String | State or province; use two-letter IANA state code for US states. |
| zipCode | String | Postal/ZIP code for the location. |
| country | String | Two-letter ISO 3166 country code. |
| timeZone | String | IANA 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.
CurrentUserResetCourseProgress1 ptReset 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
| Name | Type | Required | Description |
|---|---|---|---|
| userId | ID | No | The ID of the user whose course progress should be reset. If omitted, the authenticated user's progress is reset. |
| slug | String! | Yes | The slug of the course for which progress should be reset. |
| revokeAccess | Boolean! | Yes | When `true`, the user's access to the course is also revoked. When `false`, progress is cleared but enrollment is preserved. |
Returns
| Field | Type | Description |
|---|---|---|
| CurrentUserResetCourseProgress | Boolean! | 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.
DestroyMeeting1 ptDelete 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
| Name | Type | Required | Description |
|---|---|---|---|
| courseId | UUID! | Yes | The UUID of the in-person event course that owns the meeting to be deleted. |
| meetingId | UUID! | Yes | The UUID of the specific meeting to delete. |
Returns
| Field | Type | Description |
|---|---|---|
| DestroyMeeting | ID | The 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.
SubmitTestimonial1 ptSubmit 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
| Name | Type | Required | Description |
|---|---|---|---|
| courseGroupId | UUID! | Yes | The ID of the course group. |
| testimonial | TestimonialInput! | Yes | The testimonial input. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID | Unique identifier of the submitted testimonial. |
| createdAt | Date | Timestamp when the testimonial was submitted. |
| user | User | The user who submitted the testimonial. |
| body | String | The text content of the testimonial. |
| rating | Int | Numeric 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.
UpdateInPersonEvent1 ptUpdate 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
| Name | Type | Required | Description |
|---|---|---|---|
| id | UUID! | Yes | The UUID of the in-person event session to update. |
| title | String | No | New display title for the event session. |
| status | String | No | Publication status to set (e.g., 'draft', 'published', 'archived'). |
| sku | String | No | Stock-keeping unit identifier for the event. |
| seatsLimit | Int | No | Maximum number of learner seats available for this session. |
| createMeetingCompletionCriteria | Boolean | No | When true, automatically generates completion criteria based on meeting attendance. |
| assignTo | String | No | Email of user to assign event to. |
| priceInCents | Int | No | Price of the event session in cents. |
| balanceRequirement | Int | No | Credit balance required to enroll in the event. |
| customFields | [CustomFieldInput!] | No | Array of custom field key-value pairs to update on the event. |
| waitlistingEnabled | Boolean | No | Whether to enable a waitlist when the seat limit is reached. |
| courseStartDate | Date | No | The date the event session begins. |
| courseEndDate | Date | No | The date the event session ends. |
| enrollmentStartDate | Date | No | The date enrollment opens for this session. |
| enrollmentEndDate | Date | No | The date enrollment closes for this session. |
| meetings | [MeetingFields!] | No | 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. |
| recurrence | String | No | RRULE 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
| Field | Type | Description |
|---|---|---|
| id | ID! | Unique identifier of the updated course/event session. |
| title | String | Display title of the event session. |
| status | Status | Publication status of the event (e.g., draft, published, archived). |
| seatsLimit | Int | Maximum number of seats available for enrollment. |
| waitlistingEnabled | Boolean! | Whether waitlisting is enabled when seats are full. |
| priceInCents | Int | Price of the event in cents. |
| courseStartDate | Date | Date on which the event begins. |
| courseEndDate | Date | Date on which the event ends. |
| enrollmentStartDate | Date | Date when enrollment opens. |
| enrollmentEndDate | Date | Date when enrollment closes. |
| meetings | [Meeting!] | List of scheduled meeting sessions associated with this event. |
| location | Location | Physical location associated with the event. |
| customFields | JSON | Arbitrary 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.
UpdateMeeting1 ptUpdate 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
| Name | Type | Required | Description |
|---|---|---|---|
| courseId | UUID! | Yes | The UUID of the in-person event course that owns the meeting to be updated. |
| meetingId | UUID! | Yes | The UUID of the specific meeting to update. |
| title | String | No | The new display title for the meeting. |
| location | UUID | No | The UUID of a location record to associate with this meeting. |
| joinUrl | String | No | A URL that attendees can use to join the meeting virtually. |
| attendeeInfo | String | No | Free-text information to communicate to attendees about the meeting. |
| instructors | [String!] | No | A list of instructor email addresses or identifiers to assign to the meeting. |
| startDate | Date | No | The updated start date and time for the meeting. |
| endDate | Date | No | The updated end date and time for the meeting. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | The unique identifier of the updated meeting. |
| title | String | The display title of the meeting. |
| courseId | ID! | The ID of the course (in-person event) this meeting belongs to. |
| course | Course! | The full course object associated with this meeting. |
| locationId | ID | The ID of the location associated with this meeting, if any. |
| location | Location | The physical location details for this meeting. |
| joinUrl | String | A URL attendees can use to join the meeting. |
| attendeeInfo | String | Additional information provided to attendees about this meeting. |
| instructors | [String!] | A list of instructor email addresses or names associated with this meeting. |
| startDate | Date! | The date and time when the meeting begins. |
| endDate | Date! | The date and time when the meeting ends. |
| timeZone | String | The 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.