Instruqt GraphQL API Reference

This reference describes the Instruqt GraphQL API and helps you get started.

API Endpoints
https://play.instruqt.com/graphql
Headers
# Add the following HTTP header to your GraphQL requests
Authorization: Bearer YOUR-API-KEY

Getting started

What is the GraphQL API?

The Instruqt GraphQL API lets you exchange data between your systems and the Instruqt platform. As the name suggests, the API is based on GraphQL, a query language for APIs. GraphQL lets you query and update data with queries and mutations in JSON format. This means that you can do the following actions with the Instruqt GraphQL API:

  • Query for information about Instruqt artifacts like tracks and challenges.
  • Add Instruqt artifacts like track invites or team members.
  • Update Instruqt artifacts, including deleting them.

The query response is in JSON format, and the following is an example of a GraphQL query that lists all your tracks by id, slug and title:

query {
    tracks(organizationSlug: "instruqt") {
      id
      slug
      title
    }
}

Which gives a response like this:

{
    "data": {
        "tracks": [
            {
                "id": "amy5xhuaxukc",
                "slug": "aws-cloud-account",
                "title": "AWS Cloud Account"
            },
            {
                "id": "jrwu2g1tymzn",
                "slug": "azure-subscription",
                "title": "Azure subscription"
            },
            {
                "id": "4ttuxz0fgyf1",
                "slug": "gcp-project",
                "title": "GCP project"
            },
            {
                "id": "vnt0zc9owl5c",
                "slug": "kubernetes",
                "title": "Kubernetes"
            }
        ]
    }
}

How to use the GraphQL API

Address the API Endpoint

You address all your GraphQL queries and mutations as HTTP POST requests to the API Endpoint.

Create your API key for authorization

Instruqt GraphQL API requires your queries and mutations to be authorized by an API key. See the docs for generating your API key, which you include as an Authorization header on all your GraphQL API queries and mutations.

Create queries and mutations

See the docs for creating queries and mutations.

Queries

awsAccountConfig

Description

Get an AWS Account config for a track

Note: you need to be developer of that track to access this

Response

Returns an AwsAccountConfig

Arguments
Name Description
awsAccountID - String! Unique ID

Example

Query
query awsAccountConfig($awsAccountID: String!) {
  awsAccountConfig(awsAccountID: $awsAccountID) {
    ...AwsAccountConfigFragment
  }
}
Variables
{"awsAccountID": "xyz789"}
Response
{
  "data": {
    "awsAccountConfig": {
      "id": "4",
      "name": "xyz789",
      "iam_policy": "abc123",
      "managed_policies": ["xyz789"],
      "scp_policy": "abc123",
      "expose_to_user": true
    }
  }
}

azureSubscriptionConfig

Description

Get an Azure Subscription config for a track

Note: you need to be developer of that track to access this

Response

Returns an AzureSubscriptionConfig

Arguments
Name Description
azureSubscriptionID - String! Unique ID

Example

Query
query azureSubscriptionConfig($azureSubscriptionID: String!) {
  azureSubscriptionConfig(azureSubscriptionID: $azureSubscriptionID) {
    ...AzureSubscriptionConfigFragment
  }
}
Variables
{"azureSubscriptionID": "xyz789"}
Response
{
  "data": {
    "azureSubscriptionConfig": {
      "id": 4,
      "name": "abc123",
      "user_only": true,
      "roles": ["abc123"],
      "expose_to_user": true
    }
  }
}

challenge

Description

Get a specific challenge

Either challengeID must be specified, or challengeSlug, trackSlug and organizationSlug

Response

Returns a Challenge

Arguments
Name Description
challengeID - String Unique ID
challengeSlug - String Slug of the challenge
trackSlug - String Slug of the track
organizationSlug - String Slug of the organization
teamSlug - String Slug of the team
userID - String User id used to impersonate user
inviteID - String Invite id used to impersonate the user for a given invite id
parseAssignmentVariables - Boolean

Example

Query
query challenge(
  $challengeID: String,
  $challengeSlug: String,
  $trackSlug: String,
  $organizationSlug: String,
  $teamSlug: String,
  $userID: String,
  $inviteID: String,
  $parseAssignmentVariables: Boolean
) {
  challenge(
    challengeID: $challengeID,
    challengeSlug: $challengeSlug,
    trackSlug: $trackSlug,
    organizationSlug: $organizationSlug,
    teamSlug: $teamSlug,
    userID: $userID,
    inviteID: $inviteID,
    parseAssignmentVariables: $parseAssignmentVariables
  ) {
    ...ChallengeFragment
  }
}
Variables
{
  "challengeID": "abc123",
  "challengeSlug": "abc123",
  "trackSlug": "xyz789",
  "organizationSlug": "abc123",
  "teamSlug": "abc123",
  "userID": "xyz789",
  "inviteID": "xyz789",
  "parseAssignmentVariables": false
}
Response
{
  "data": {
    "challenge": {
      "id": 4,
      "track": Track,
      "answers": ["abc123"],
      "assignment": "abc123",
      "attempts": [ChallengeAttempt],
      "can_check": false,
      "difficulty": "xyz789",
      "index": 123,
      "notes": [ChallengeNote],
      "permalink": "abc123",
      "scripts": [ChallengeScript],
      "slug": "xyz789",
      "solution": [123],
      "hasSingleAnswer": true,
      "status": "locked",
      "tabs": [ChallengeTab],
      "teaser": "xyz789",
      "timelimit": 123,
      "started": 987,
      "completed": 123,
      "failed": 987,
      "failMessage": "xyz789",
      "title": "xyz789",
      "type": "challenge",
      "unlocks": Challenge,
      "labConfig": ChallengeLabConfig,
      "deletedAt": "10:15:30Z"
    }
  }
}

challengeScript

Description

Get a specific challenge script

Note: you need to be developer of that track to access this

Response

Returns a ChallengeScript

Arguments
Name Description
scriptID - String! Unique ID

Example

Query
query challengeScript($scriptID: String!) {
  challengeScript(scriptID: $scriptID) {
    ...ChallengeScriptFragment
  }
}
Variables
{"scriptID": "xyz789"}
Response
{
  "data": {
    "challengeScript": {
      "id": 4,
      "action": "abc123",
      "contents": "abc123",
      "host": "abc123"
    }
  }
}

challengeScripts

Description

Get the scripts for a challenge

Note: you need to be developer of that track to access this

Response

Returns [ChallengeScript!]

Arguments
Name Description
challengeID - String! Unique ID

Example

Query
query challengeScripts($challengeID: String!) {
  challengeScripts(challengeID: $challengeID) {
    ...ChallengeScriptFragment
  }
}
Variables
{"challengeID": "abc123"}
Response
{
  "data": {
    "challengeScripts": [
      {
        "id": "4",
        "action": "abc123",
        "contents": "abc123",
        "host": "xyz789"
      }
    ]
  }
}

challenges

Description

Get a all challenges of a track

Either trackID must be specified, or both trackSlug and organizationSlug

Response

Returns [Challenge!]

Arguments
Name Description
trackID - String Unique ID
trackSlug - String Slug of the track
organizationSlug - String Slug of the organization
teamSlug - String Slug of the team
parseAssignmentVariables - Boolean

Example

Query
query challenges(
  $trackID: String,
  $trackSlug: String,
  $organizationSlug: String,
  $teamSlug: String,
  $parseAssignmentVariables: Boolean
) {
  challenges(
    trackID: $trackID,
    trackSlug: $trackSlug,
    organizationSlug: $organizationSlug,
    teamSlug: $teamSlug,
    parseAssignmentVariables: $parseAssignmentVariables
  ) {
    ...ChallengeFragment
  }
}
Variables
{
  "trackID": "xyz789",
  "trackSlug": "abc123",
  "organizationSlug": "abc123",
  "teamSlug": "abc123",
  "parseAssignmentVariables": true
}
Response
{
  "data": {
    "challenges": [
      {
        "id": 4,
        "track": Track,
        "answers": ["xyz789"],
        "assignment": "xyz789",
        "attempts": [ChallengeAttempt],
        "can_check": false,
        "difficulty": "abc123",
        "index": 123,
        "notes": [ChallengeNote],
        "permalink": "xyz789",
        "scripts": [ChallengeScript],
        "slug": "xyz789",
        "solution": [123],
        "hasSingleAnswer": true,
        "status": "locked",
        "tabs": [ChallengeTab],
        "teaser": "xyz789",
        "timelimit": 987,
        "started": 123,
        "completed": 987,
        "failed": 123,
        "failMessage": "xyz789",
        "title": "xyz789",
        "type": "challenge",
        "unlocks": Challenge,
        "labConfig": ChallengeLabConfig,
        "deletedAt": "10:15:30Z"
      }
    ]
  }
}

checkConflicts

Description

Returns all files with conflicts and their content

Response

Returns [File]!

Arguments
Name Description
track - TrackInput!

Example

Query
query checkConflicts($track: TrackInput!) {
  checkConflicts(track: $track) {
    ...FileFragment
  }
}
Variables
{"track": TrackInput}
Response
{
  "data": {
    "checkConflicts": [
      {
        "path": "xyz789",
        "content": "xyz789"
      }
    ]
  }
}

cloudProviderConfigs

Description

Get a list of all cloud provider configs

Response

Returns [CloudProviderConfig!]!

Example

Query
query cloudProviderConfigs {
  cloudProviderConfigs {
    ...CloudProviderConfigFragment
  }
}
Response
{
  "data": {
    "cloudProviderConfigs": [
      {
        "provider": "aws",
        "services": [CloudProviderService],
        "regions": [CloudProviderRegion]
      }
    ]
  }
}

containerConfig

Description

Get a container config for a track

Note: you need to be developer of that track to access this

Response

Returns a ContainerConfig

Arguments
Name Description
containerID - String! Unique ID

Example

Query
query containerConfig($containerID: String!) {
  containerConfig(containerID: $containerID) {
    ...ContainerConfigFragment
  }
}
Variables
{"containerID": "xyz789"}
Response
{
  "data": {
    "containerConfig": {
      "id": 4,
      "environment": [EnvironmentVariable],
      "image": "abc123",
      "entrypoint": "xyz789",
      "cmd": "xyz789",
      "name": "abc123",
      "ports": [987],
      "shell": "abc123",
      "memory": 123,
      "resources": ContainerResources
    }
  }
}

customResource

Description

Returns the custom resource with the given ID.

Response

Returns a CustomResource

Arguments
Name Description
id - ID!

Example

Query
query customResource($id: ID!) {
  customResource(id: $id) {
    ...CustomResourceFragment
  }
}
Variables
{"id": "4"}
Response
{
  "data": {
    "customResource": {
      "id": 4,
      "name": "xyz789",
      "slug": "xyz789",
      "description": "xyz789",
      "version": "xyz789",
      "logo": "abc123",
      "provider": "terraform",
      "canDelete": true,
      "terraformModule": TerraformModule,
      "inputs": [CustomResourceInput],
      "outputs": [CustomResourceOutput],
      "createdAt": "10:15:30Z",
      "createdBy": User
    }
  }
}

developerTracks

Description

Get all tracks for an specific usr

This will return all the tracks that a user is developer of.

Response

Returns [Track!]

Arguments
Name Description
userID - String The user ID
slug - String The slug of the user

Example

Query
query developerTracks(
  $userID: String,
  $slug: String
) {
  developerTracks(
    userID: $userID,
    slug: $slug
  ) {
    ...TrackFragment
  }
}
Variables
{
  "userID": "abc123",
  "slug": "abc123"
}
Response
{
  "data": {
    "developerTracks": [
      {
        "id": "4",
        "slug": "abc123",
        "version": "abc123",
        "revision": "10:15:30Z",
        "type": "abc123",
        "title": "abc123",
        "teaser": "abc123",
        "description": "xyz789",
        "icon": "abc123",
        "level": "beginner",
        "tags": ["abc123"],
        "trackTags": [Tag],
        "owner": "xyz789",
        "team": Team,
        "developers": [User],
        "userIsTrackDeveloper": true,
        "instructors": [TrackInstructor],
        "updated_by": User,
        "private": false,
        "published": false,
        "maintenance": false,
        "challenges": [Challenge],
        "config": TrackConfig,
        "sandboxConfig": SandboxConfigVersion,
        "trackConfig": TrackConfig,
        "status": "started",
        "started": "10:15:30Z",
        "creating": "10:15:30Z",
        "created": "10:15:30Z",
        "failed": "10:15:30Z",
        "stopped": "10:15:30Z",
        "completed": "10:15:30Z",
        "cleaned": "10:15:30Z",
        "permalink": "xyz789",
        "play_limit": 123,
        "play_count": 987,
        "expiry_date": "10:15:30Z",
        "expiry_count": 123,
        "median_starttime": 123,
        "prestart": true,
        "skipping_to": Challenge,
        "scripts": [TrackScript],
        "actual_pool_size": 987,
        "show_timer": true,
        "skipping_enabled": false,
        "can_skip": false,
        "ttl": "10:15:30Z",
        "last_update": "10:15:30Z",
        "createdAt": "10:15:30Z",
        "deletedAt": "10:15:30Z",
        "learning_paths": [LearningPath],
        "accessible": true,
        "embed_token": "abc123",
        "visibility": "unpublished",
        "trackReviews": TrackReviewConnection,
        "statistics": TrackStatistics,
        "participant": Play,
        "idle_timeout": 987,
        "studentStatistics": StudentTrackStatistics,
        "timelimit": 987,
        "lab_config": LabConfig,
        "sourceTrack": Track,
        "recommendations": ["create_notes"],
        "commits": [Commit],
        "remote_repository": "abc123"
      }
    ]
  }
}

findTeamUsers

Response

Returns [User!]

Arguments
Name Description
searchTerm - String query search term
teamSlug - String! slug of team

Example

Query
query findTeamUsers(
  $searchTerm: String,
  $teamSlug: String!
) {
  findTeamUsers(
    searchTerm: $searchTerm,
    teamSlug: $teamSlug
  ) {
    ...UserFragment
  }
}
Variables
{
  "searchTerm": "abc123",
  "teamSlug": "xyz789"
}
Response
{
  "data": {
    "findTeamUsers": [
      {
        "id": "4",
        "profile": UserProfile,
        "details": UserDetails,
        "organizations": [UserOrganizationEdge],
        "teams": [UserTeamEdge],
        "is_anonymous": false,
        "is_global_admin": false,
        "segments": ["instruqt_employee"],
        "claims": [InviteClaim],
        "accessibleTracks": [Track],
        "reportItem": UserReportItem
      }
    ]
  }
}

findUsers

No longer supported
Response

Returns [User!]

Arguments
Name Description
searchTerm - String query search term
organizationSlug - String slug of organization
teamSlug - String slug of team

Example

Query
query findUsers(
  $searchTerm: String,
  $organizationSlug: String,
  $teamSlug: String
) {
  findUsers(
    searchTerm: $searchTerm,
    organizationSlug: $organizationSlug,
    teamSlug: $teamSlug
  ) {
    ...UserFragment
  }
}
Variables
{
  "searchTerm": "xyz789",
  "organizationSlug": "abc123",
  "teamSlug": "abc123"
}
Response
{
  "data": {
    "findUsers": [
      {
        "id": "4",
        "profile": UserProfile,
        "details": UserDetails,
        "organizations": [UserOrganizationEdge],
        "teams": [UserTeamEdge],
        "is_anonymous": true,
        "is_global_admin": false,
        "segments": ["instruqt_employee"],
        "claims": [InviteClaim],
        "accessibleTracks": [Track],
        "reportItem": UserReportItem
      }
    ]
  }
}

gcpProjectConfig

Description

Get a GCP Project config for a track

Note: you need to be developer of that track to access this

Response

Returns a GcpProjectConfig

Arguments
Name Description
gcpProjectID - String! Unique ID

Example

Query
query gcpProjectConfig($gcpProjectID: String!) {
  gcpProjectConfig(gcpProjectID: $gcpProjectID) {
    ...GcpProjectConfigFragment
  }
}
Variables
{"gcpProjectID": "xyz789"}
Response
{
  "data": {
    "gcpProjectConfig": {
      "id": "4",
      "name": "abc123",
      "services": ["xyz789"],
      "roles": ["abc123"],
      "expose_to_user": false
    }
  }
}

getCommit

Description

Returns a commit content

Response

Returns a Commit!

Arguments
Name Description
trackSlug - String!
teamSlug - String!
hash - String!

Example

Query
query getCommit(
  $trackSlug: String!,
  $teamSlug: String!,
  $hash: String!
) {
  getCommit(
    trackSlug: $trackSlug,
    teamSlug: $teamSlug,
    hash: $hash
  ) {
    ...CommitFragment
  }
}
Variables
{
  "trackSlug": "xyz789",
  "teamSlug": "xyz789",
  "hash": "abc123"
}
Response
{
  "data": {
    "getCommit": {
      "hash": "abc123",
      "message": "abc123",
      "author": User,
      "timestamp": "10:15:30Z",
      "content": [File]
    }
  }
}

getSandboxVariable

Description

Get runtime variable value from sandbox host

Response

Returns a SandboxVariable

Arguments
Name Description
key - String! Unique key to access the value, case insensitive
hostname - String! Hostname to get value from
sandboxID - String! Sandbox id to get value from

Example

Query
query getSandboxVariable(
  $key: String!,
  $hostname: String!,
  $sandboxID: String!
) {
  getSandboxVariable(
    key: $key,
    hostname: $hostname,
    sandboxID: $sandboxID
  ) {
    ...SandboxVariableFragment
  }
}
Variables
{
  "key": "xyz789",
  "hostname": "abc123",
  "sandboxID": "xyz789"
}
Response
{
  "data": {
    "getSandboxVariable": {
      "key": "xyz789",
      "value": "abc123"
    }
  }
}

hostImage

Description

Returns the host image with the given ID.

Response

Returns a HostImage

Arguments
Name Description
id - ID!

Example

Query
query hostImage($id: ID!) {
  hostImage(id: $id) {
    ...HostImageFragment
  }
}
Variables
{"id": 4}
Response
{
  "data": {
    "hostImage": {
      "id": 4,
      "slug": "xyz789",
      "description": "xyz789",
      "imageMetadata": ImageMetadata,
      "status": "created",
      "currentSandbox": HostImageSandbox,
      "team": Team,
      "usedInTracks": [Track],
      "usedInSandboxConfigVersions": [
        SandboxConfigVersion
      ],
      "createdAt": "10:15:30Z",
      "createdBy": User,
      "createdWith": HostImageVMInputs
    }
  }
}

hotStartPool

Description

Get hot start pool

Response

Returns a HotStartPool!

Arguments
Name Description
id - String! ID of hot start pool
organizationSlug - String Slug of organization for access control
teamSlug - String Slug of team for access control

Example

Query
query hotStartPool(
  $id: String!,
  $organizationSlug: String,
  $teamSlug: String
) {
  hotStartPool(
    id: $id,
    organizationSlug: $organizationSlug,
    teamSlug: $teamSlug
  ) {
    ...HotStartPoolFragment
  }
}
Variables
{
  "id": "xyz789",
  "organizationSlug": "abc123",
  "teamSlug": "xyz789"
}
Response
{
  "data": {
    "hotStartPool": {
      "id": 4,
      "type": "dedicated",
      "size": 987,
      "created": "10:15:30Z",
      "deleted": "10:15:30Z",
      "name": "xyz789",
      "auto_refill": true,
      "starts_at": "10:15:30Z",
      "ends_at": "10:15:30Z",
      "created_by": User,
      "team": Team,
      "tracks": [HotStartPoolTrackEdge],
      "configs": [HotStartConfigTrackEdge],
      "status": "Running",
      "region": "xyz789"
    }
  }
}

hotStartPools

Description

Get hot start pools in organization

Response

Returns a HotStartPoolConnection

Arguments
Name Description
organizationSlug - String Slug of organization
teamSlug - String Slug of team
paging - Pagination Pagination parameters
ordering - Ordering Sorting parameters

Example

Query
query hotStartPools(
  $organizationSlug: String,
  $teamSlug: String,
  $paging: Pagination,
  $ordering: Ordering
) {
  hotStartPools(
    organizationSlug: $organizationSlug,
    teamSlug: $teamSlug,
    paging: $paging,
    ordering: $ordering
  ) {
    ...HotStartPoolConnectionFragment
  }
}
Variables
{
  "organizationSlug": "xyz789",
  "teamSlug": "xyz789",
  "paging": Pagination,
  "ordering": Ordering
}
Response
{
  "data": {
    "hotStartPools": {
      "edges": [HotStartPoolEdge],
      "nodes": [HotStartPool],
      "pageInfo": PageInfo,
      "totalCount": 123
    }
  }
}

imageMetadata

Description

Gets metadata about an image

Response

Returns an ImageMetadata

Arguments
Name Description
image - String!

Example

Query
query imageMetadata($image: String!) {
  imageMetadata(image: $image) {
    ...ImageMetadataFragment
  }
}
Variables
{"image": "xyz789"}
Response
{
  "data": {
    "imageMetadata": {
      "id": "4",
      "image": "xyz789",
      "os": "windows",
      "diskSizeGB": 123
    }
  }
}

isContainerImageValid

Description

Checks if the image is valid before it being created

Response

Returns a Boolean!

Arguments
Name Description
trackID - String! Unique ID
image - String! Container image to use

Example

Query
query isContainerImageValid(
  $trackID: String!,
  $image: String!
) {
  isContainerImageValid(
    trackID: $trackID,
    image: $image
  )
}
Variables
{
  "trackID": "abc123",
  "image": "abc123"
}
Response
{"data": {"isContainerImageValid": false}}

isURLEmbeddable

Description

Checks whether a URL is embeddable via a frame.

Response

Returns a Boolean!

Arguments
Name Description
url - String

Example

Query
query isURLEmbeddable($url: String) {
  isURLEmbeddable(url: $url)
}
Variables
{"url": "xyz789"}
Response
{"data": {"isURLEmbeddable": false}}

isWorkEmail

Description

Check if email is a work email.

Response

Returns a Boolean!

Arguments
Name Description
email - String!

Example

Query
query isWorkEmail($email: String!) {
  isWorkEmail(email: $email)
}
Variables
{"email": "xyz789"}
Response
{"data": {"isWorkEmail": false}}

landingPage

Description

Gets a landing page by ID or a combination of team slug and page path

Response

Returns a LandingPage

Arguments
Name Description
landingPageID - ID
teamSlug - String
landingPagePath - String

Example

Query
query landingPage(
  $landingPageID: ID,
  $teamSlug: String,
  $landingPagePath: String
) {
  landingPage(
    landingPageID: $landingPageID,
    teamSlug: $teamSlug,
    landingPagePath: $landingPagePath
  ) {
    ...LandingPageFragment
  }
}
Variables
{
  "landingPageID": 4,
  "teamSlug": "abc123",
  "landingPagePath": "xyz789"
}
Response
{
  "data": {
    "landingPage": {
      "id": 4,
      "team": Team,
      "internalPageName": "xyz789",
      "path": "xyz789",
      "archivedAt": "10:15:30Z",
      "publishedAt": "10:15:30Z",
      "updatedAt": "10:15:30Z",
      "trackPlayLimit": 123,
      "formEnabled": true,
      "privacyPolicyUrl": "xyz789",
      "termsAndConditionsUrl": "abc123",
      "pageTitle": "xyz789",
      "seoDescription": "xyz789",
      "robotsIndexingEnabled": true,
      "backgroundColor": "xyz789",
      "textColor": "abc123",
      "logoUrl": "xyz789",
      "logoLink": "xyz789",
      "pageHeading": "xyz789",
      "pageSubtitle": "abc123",
      "linkedInUrl": "abc123",
      "xUrl": "xyz789",
      "youtubeUrl": "abc123",
      "githubUrl": "abc123",
      "slackUrl": "xyz789",
      "tracks": [LandingPageTrackEdge]
    }
  }
}

learningPath

No longer supported
Description

Get a specific learningPath

Either learningPathID or learningPathSlug must be specified

Response

Returns a LearningPath

Arguments
Name Description
learningPathID - String Unique ID
learningPathSlug - String Slug of the learningPath

Example

Query
query learningPath(
  $learningPathID: String,
  $learningPathSlug: String
) {
  learningPath(
    learningPathID: $learningPathID,
    learningPathSlug: $learningPathSlug
  ) {
    ...LearningPathFragment
  }
}
Variables
{
  "learningPathID": "abc123",
  "learningPathSlug": "abc123"
}
Response
{
  "data": {
    "learningPath": {
      "id": "4",
      "slug": "abc123",
      "owner": "xyz789",
      "permalink": "abc123",
      "title": "abc123",
      "teaser": "abc123",
      "description": "xyz789",
      "image": "abc123",
      "level": "beginner",
      "published": false,
      "preview": true,
      "accessible": true,
      "courses": [Track],
      "authors": [User],
      "access_type": "purchased"
    }
  }
}

learningPaths

No longer supported
Description

Get a list of learning paths

Response

Returns [LearningPath!]!

Example

Query
query learningPaths {
  learningPaths {
    ...LearningPathFragment
  }
}
Response
{
  "data": {
    "learningPaths": [
      {
        "id": 4,
        "slug": "xyz789",
        "owner": "xyz789",
        "permalink": "xyz789",
        "title": "xyz789",
        "teaser": "xyz789",
        "description": "xyz789",
        "image": "xyz789",
        "level": "beginner",
        "published": false,
        "preview": false,
        "accessible": false,
        "courses": [Track],
        "authors": [User],
        "access_type": "purchased"
      }
    ]
  }
}

me

Description

Gets the currently logged in user

Response

Returns a User

Example

Query
query me {
  me {
    ...UserFragment
  }
}
Response
{
  "data": {
    "me": {
      "id": "4",
      "profile": UserProfile,
      "details": UserDetails,
      "organizations": [UserOrganizationEdge],
      "teams": [UserTeamEdge],
      "is_anonymous": true,
      "is_global_admin": true,
      "segments": ["instruqt_employee"],
      "claims": [InviteClaim],
      "accessibleTracks": [Track],
      "reportItem": UserReportItem
    }
  }
}

myProgress

Description

Get user's progress for tracks and learning paths.

Response

Returns [Progress!]!

Example

Query
query myProgress {
  myProgress {
    ...ProgressFragment
  }
}
Response
{
  "data": {
    "myProgress": [
      {"last_played_at": "10:15:30Z"}
    ]
  }
}

myTrackProgress

Use myProgress query
Description

Get progress on tracks for the current user.

Response

Returns [TrackProgress!]

Example

Query
query myTrackProgress {
  myTrackProgress {
    ...TrackProgressFragment
  }
}
Response
{
  "data": {
    "myTrackProgress": [
      {
        "last_played_at": "10:15:30Z",
        "completed_at": "10:15:30Z",
        "completed_challenges": 987,
        "track": Track
      }
    ]
  }
}

myTracks

Replaced by trackLibary()
Description

Get a list tracks of the current user

This will return all tracks that are in a user's library. Currently this only includes tracks for which the user has been invited.

Response

Returns [Track!]

Example

Query
query myTracks {
  myTracks {
    ...TrackFragment
  }
}
Response
{
  "data": {
    "myTracks": [
      {
        "id": 4,
        "slug": "abc123",
        "version": "abc123",
        "revision": "10:15:30Z",
        "type": "xyz789",
        "title": "xyz789",
        "teaser": "abc123",
        "description": "abc123",
        "icon": "xyz789",
        "level": "beginner",
        "tags": ["xyz789"],
        "trackTags": [Tag],
        "owner": "xyz789",
        "team": Team,
        "developers": [User],
        "userIsTrackDeveloper": false,
        "instructors": [TrackInstructor],
        "updated_by": User,
        "private": true,
        "published": true,
        "maintenance": true,
        "challenges": [Challenge],
        "config": TrackConfig,
        "sandboxConfig": SandboxConfigVersion,
        "trackConfig": TrackConfig,
        "status": "started",
        "started": "10:15:30Z",
        "creating": "10:15:30Z",
        "created": "10:15:30Z",
        "failed": "10:15:30Z",
        "stopped": "10:15:30Z",
        "completed": "10:15:30Z",
        "cleaned": "10:15:30Z",
        "permalink": "abc123",
        "play_limit": 123,
        "play_count": 987,
        "expiry_date": "10:15:30Z",
        "expiry_count": 123,
        "median_starttime": 987,
        "prestart": false,
        "skipping_to": Challenge,
        "scripts": [TrackScript],
        "actual_pool_size": 987,
        "show_timer": false,
        "skipping_enabled": true,
        "can_skip": false,
        "ttl": "10:15:30Z",
        "last_update": "10:15:30Z",
        "createdAt": "10:15:30Z",
        "deletedAt": "10:15:30Z",
        "learning_paths": [LearningPath],
        "accessible": true,
        "embed_token": "abc123",
        "visibility": "unpublished",
        "trackReviews": TrackReviewConnection,
        "statistics": TrackStatistics,
        "participant": Play,
        "idle_timeout": 123,
        "studentStatistics": StudentTrackStatistics,
        "timelimit": 987,
        "lab_config": LabConfig,
        "sourceTrack": Track,
        "recommendations": ["create_notes"],
        "commits": [Commit],
        "remote_repository": "abc123"
      }
    ]
  }
}

note

Description

Get a challenge note

Response

Returns a ChallengeNote

Arguments
Name Description
noteID - String! Unique ID

Example

Query
query note($noteID: String!) {
  note(noteID: $noteID) {
    ...ChallengeNoteFragment
  }
}
Variables
{"noteID": "abc123"}
Response
{
  "data": {
    "note": {
      "id": 4,
      "contents": "abc123",
      "index": 123,
      "type": "image",
      "url": "abc123"
    }
  }
}

organization

No longer supported
Description

Get a specific organization

Response

Returns an Organization

Arguments
Name Description
organizationSlug - String Slug of the organization
organizationID - String Unique ID

Example

Query
query organization(
  $organizationSlug: String,
  $organizationID: String
) {
  organization(
    organizationSlug: $organizationSlug,
    organizationID: $organizationID
  ) {
    ...OrganizationFragment
  }
}
Variables
{
  "organizationSlug": "abc123",
  "organizationID": "abc123"
}
Response
{
  "data": {
    "organization": {
      "id": "4",
      "members": [OrganizationMember],
      "users": [OrganizationUserEdge],
      "name": "xyz789",
      "logo": "abc123",
      "title": "xyz789",
      "subtitle": "abc123",
      "slug": "abc123",
      "primary_link_text": "abc123",
      "primary_link_url": "xyz789",
      "secondary_link_text": "xyz789",
      "secondary_link_url": "xyz789",
      "api_key": "xyz789",
      "theme": OrganizationTheme,
      "personal": true,
      "features": OrganizationFeatures,
      "invited": ["abc123"],
      "invites": [OrganizationInvite],
      "privacy_policy": "abc123",
      "webhook_dashboard_url": "abc123",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z"
    }
  }
}

organizationExists

No longer supported
Description

Check if an organization exists

Response

Returns a Boolean!

Arguments
Name Description
organizationSlug - String! Slug of the organization

Example

Query
query organizationExists($organizationSlug: String!) {
  organizationExists(organizationSlug: $organizationSlug)
}
Variables
{"organizationSlug": "xyz789"}
Response
{"data": {"organizationExists": true}}

organizationInvite

No longer supported
Description

Get an organization invite

Response

Returns an OrganizationInvite

Arguments
Name Description
token - String! The token of the invite

Example

Query
query organizationInvite($token: String!) {
  organizationInvite(token: $token) {
    ...OrganizationInviteFragment
  }
}
Variables
{"token": "xyz789"}
Response
{
  "data": {
    "organizationInvite": {
      "email": "abc123",
      "role": "owner",
      "token_expired": true,
      "organization": Organization,
      "accepted_at": "10:15:30Z",
      "created_by": User
    }
  }
}

organizationStatistics

No longer supported
Response

Returns an OrganizationStatistics

Arguments
Name Description
organizationID - String ID of the organization
organizationSlug - String Slug of the organization
trackIDs - [String!] Filter on specific track id's
start - Time Start time, defaults to 30 days ago
end - Time End time, defaults to now
filterDevelopers - Boolean Filter developers

Example

Query
query organizationStatistics(
  $organizationID: String,
  $organizationSlug: String,
  $trackIDs: [String!],
  $start: Time,
  $end: Time,
  $filterDevelopers: Boolean
) {
  organizationStatistics(
    organizationID: $organizationID,
    organizationSlug: $organizationSlug,
    trackIDs: $trackIDs,
    start: $start,
    end: $end,
    filterDevelopers: $filterDevelopers
  ) {
    ...OrganizationStatisticsFragment
  }
}
Variables
{
  "organizationID": "abc123",
  "organizationSlug": "xyz789",
  "trackIDs": ["xyz789"],
  "start": "10:15:30Z",
  "end": "10:15:30Z",
  "filterDevelopers": false
}
Response
{
  "data": {
    "organizationStatistics": {
      "started_total": 987,
      "completed_total": 987,
      "restarted_total": 987,
      "organization_series": [OrganizationSeries],
      "track_statistics": [TrackStatistics]
    }
  }
}

organizations

No longer supported
Description

Get the list of all organizations you have access to.

Response

Returns [Organization!]

Example

Query
query organizations {
  organizations {
    ...OrganizationFragment
  }
}
Response
{
  "data": {
    "organizations": [
      {
        "id": 4,
        "members": [OrganizationMember],
        "users": [OrganizationUserEdge],
        "name": "xyz789",
        "logo": "abc123",
        "title": "abc123",
        "subtitle": "abc123",
        "slug": "xyz789",
        "primary_link_text": "abc123",
        "primary_link_url": "xyz789",
        "secondary_link_text": "xyz789",
        "secondary_link_url": "xyz789",
        "api_key": "xyz789",
        "theme": OrganizationTheme,
        "personal": false,
        "features": OrganizationFeatures,
        "invited": ["abc123"],
        "invites": [OrganizationInvite],
        "privacy_policy": "xyz789",
        "webhook_dashboard_url": "abc123",
        "created_at": "10:15:30Z",
        "customer_since": "10:15:30Z",
        "trial_end_at": "10:15:30Z"
      }
    ]
  }
}

playReportItem

Description

playReportItem retrieves a single play with related statistics

Response

Returns a PlayReportItem

Arguments
Name Description
playID - String!
input - PlayReportInput!

Example

Query
query playReportItem(
  $playID: String!,
  $input: PlayReportInput!
) {
  playReportItem(
    playID: $playID,
    input: $input
  ) {
    ...PlayReportItemFragment
  }
}
Variables
{
  "playID": "abc123",
  "input": PlayReportInput
}
Response
{
  "data": {
    "playReportItem": {
      "id": 4,
      "trackInvite": TrackInvite,
      "hotStartPool": HotStartPool,
      "customParameters": [CustomParameter],
      "track": Track,
      "user": User,
      "completionPercent": 123.45,
      "timeSpent": 123,
      "activity": [PlayActivity],
      "playReview": TrackReview,
      "totalChallenges": 123,
      "completedChallenges": 987,
      "startedAt": "10:15:30Z",
      "mode": "embed",
      "stoppedReason": "abc123"
    }
  }
}

playReports

Description

Returns a page of plays for a team

Response

Returns a PlayReportPage!

Arguments
Name Description
input - PlayReportInput!

Example

Query
query playReports($input: PlayReportInput!) {
  playReports(input: $input) {
    ...PlayReportPageFragment
  }
}
Variables
{"input": PlayReportInput}
Response
{
  "data": {
    "playReports": {
      "items": [PlayReportItem],
      "totalItems": 987
    }
  }
}

sandbox

Description

Returns a sandbox with the given ID.

Response

Returns a Sandbox

Arguments
Name Description
ID - ID!

Example

Query
query sandbox($ID: ID!) {
  sandbox(ID: $ID) {
    ...SandboxFragment
  }
}
Variables
{"ID": "4"}
Response
{
  "data": {
    "sandbox": {
      "id": 4,
      "track": Track,
      "state": "creating",
      "invite": TrackInvite,
      "hot_start_pool": HotStartPool,
      "ttl": "10:15:30Z",
      "created": "10:15:30Z",
      "user": User,
      "last_activity_at": "10:15:30Z"
    }
  }
}

sandboxConfig

Response

Returns a SandboxConfig!

Arguments
Name Description
teamID - String ID of the team
teamSlug - String Slug of the team
configID - String ID of the config
configSlug - String Slug of the config

Example

Query
query sandboxConfig(
  $teamID: String,
  $teamSlug: String,
  $configID: String,
  $configSlug: String
) {
  sandboxConfig(
    teamID: $teamID,
    teamSlug: $teamSlug,
    configID: $configID,
    configSlug: $configSlug
  ) {
    ...SandboxConfigFragment
  }
}
Variables
{
  "teamID": "xyz789",
  "teamSlug": "abc123",
  "configID": "xyz789",
  "configSlug": "xyz789"
}
Response
{
  "data": {
    "sandboxConfig": {
      "id": 4,
      "name": "abc123",
      "slug": "xyz789",
      "version": 123,
      "deleted": "10:15:30Z"
    }
  }
}

sandboxConfigVersion

Response

Returns a SandboxConfigVersion

Arguments
Name Description
configVersionID - String! ID of the config version

Example

Query
query sandboxConfigVersion($configVersionID: String!) {
  sandboxConfigVersion(configVersionID: $configVersionID) {
    ...SandboxConfigVersionFragment
  }
}
Variables
{"configVersionID": "xyz789"}
Response
{
  "data": {
    "sandboxConfigVersion": {
      "id": 4,
      "config": SandboxConfig,
      "version": 123,
      "description": "abc123",
      "status": "draft",
      "published_at": "10:15:30Z",
      "published_by": User,
      "change_log_entry": "xyz789",
      "resources": SandboxResources,
      "scripts": [SandboxScript],
      "tracks": [Track],
      "hot_start_pools": [HotStartPool]
    }
  }
}

sandboxConfigVersionDiff

Response

Returns a SandboxConfigVersionDiff

Arguments
Name Description
sourceConfigVersion - SandboxConfigInput The source config
sourceConfigVersionID - String The source config version ID
targetConfigVersionID - String! The target config version ID

Example

Query
query sandboxConfigVersionDiff(
  $sourceConfigVersion: SandboxConfigInput,
  $sourceConfigVersionID: String,
  $targetConfigVersionID: String!
) {
  sandboxConfigVersionDiff(
    sourceConfigVersion: $sourceConfigVersion,
    sourceConfigVersionID: $sourceConfigVersionID,
    targetConfigVersionID: $targetConfigVersionID
  ) {
    ...SandboxConfigVersionDiffFragment
  }
}
Variables
{
  "sourceConfigVersion": SandboxConfigInput,
  "sourceConfigVersionID": "xyz789",
  "targetConfigVersionID": "xyz789"
}
Response
{
  "data": {
    "sandboxConfigVersionDiff": {
      "diff": "abc123"
    }
  }
}

sandboxConfigVersions

Response

Returns [SandboxConfigVersion!]

Arguments
Name Description
teamID - String ID of the team
teamSlug - String Slug of the team
filter - SandboxConfigVersionsFilterInput Filter for the result set

Example

Query
query sandboxConfigVersions(
  $teamID: String,
  $teamSlug: String,
  $filter: SandboxConfigVersionsFilterInput
) {
  sandboxConfigVersions(
    teamID: $teamID,
    teamSlug: $teamSlug,
    filter: $filter
  ) {
    ...SandboxConfigVersionFragment
  }
}
Variables
{
  "teamID": "xyz789",
  "teamSlug": "abc123",
  "filter": SandboxConfigVersionsFilterInput
}
Response
{
  "data": {
    "sandboxConfigVersions": [
      {
        "id": 4,
        "config": SandboxConfig,
        "version": 987,
        "description": "xyz789",
        "status": "draft",
        "published_at": "10:15:30Z",
        "published_by": User,
        "change_log_entry": "xyz789",
        "resources": SandboxResources,
        "scripts": [SandboxScript],
        "tracks": [Track],
        "hot_start_pools": [HotStartPool]
      }
    ]
  }
}

sandboxConfigs

Response

Returns [SandboxConfig!]

Arguments
Name Description
teamID - String ID of the team
teamSlug - String Slug of the team

Example

Query
query sandboxConfigs(
  $teamID: String,
  $teamSlug: String
) {
  sandboxConfigs(
    teamID: $teamID,
    teamSlug: $teamSlug
  ) {
    ...SandboxConfigFragment
  }
}
Variables
{
  "teamID": "abc123",
  "teamSlug": "abc123"
}
Response
{
  "data": {
    "sandboxConfigs": [
      {
        "id": "4",
        "name": "xyz789",
        "slug": "abc123",
        "version": 123,
        "deleted": "10:15:30Z"
      }
    ]
  }
}

sandboxes

Description

Returns an array of filtered sandboxes

Response

Returns a SandboxConnection

Arguments
Name Description
teamID - String ID of the team
teamSlug - String Slug of the team
filter - SandboxFilterInput Filter for the query
paging - Pagination Pagination parameters
ordering - Ordering Sorting parameters

Example

Query
query sandboxes(
  $teamID: String,
  $teamSlug: String,
  $filter: SandboxFilterInput,
  $paging: Pagination,
  $ordering: Ordering
) {
  sandboxes(
    teamID: $teamID,
    teamSlug: $teamSlug,
    filter: $filter,
    paging: $paging,
    ordering: $ordering
  ) {
    ...SandboxConnectionFragment
  }
}
Variables
{
  "teamID": "xyz789",
  "teamSlug": "xyz789",
  "filter": SandboxFilterInput,
  "paging": Pagination,
  "ordering": Ordering
}
Response
{
  "data": {
    "sandboxes": {
      "edges": [SandboxEdge],
      "nodes": [Sandbox],
      "pageInfo": PageInfo,
      "totalCount": 123,
      "pageCount": 987
    }
  }
}

searchTerraformModules

Description

Returns all terraform modules for the given query.

Response

Returns a SearchTerraformModuleResults

Arguments
Name Description
query - String!

Example

Query
query searchTerraformModules($query: String!) {
  searchTerraformModules(query: $query) {
    ...SearchTerraformModuleResultsFragment
  }
}
Variables
{"query": "abc123"}
Response
{
  "data": {
    "searchTerraformModules": {
      "modules": [TerraformModule]
    }
  }
}

statistics

Description

Get statistics for a track

Either trackID must be specified, or both trackSlug and teamSlug

Response

Returns a Statistics

Arguments
Name Description
trackID - String ID of the track
trackSlug - String Slug of the track
organizationSlug - String Slug of the organization
teamSlug - String Slug of the team
start - Time Start time, defaults to 30 days ago
end - Time End time, defaults to now
filterDevelopers - Boolean Filter developers

Example

Query
query statistics(
  $trackID: String,
  $trackSlug: String,
  $organizationSlug: String,
  $teamSlug: String,
  $start: Time,
  $end: Time,
  $filterDevelopers: Boolean
) {
  statistics(
    trackID: $trackID,
    trackSlug: $trackSlug,
    organizationSlug: $organizationSlug,
    teamSlug: $teamSlug,
    start: $start,
    end: $end,
    filterDevelopers: $filterDevelopers
  ) {
    ...StatisticsFragment
  }
}
Variables
{
  "trackID": "xyz789",
  "trackSlug": "xyz789",
  "organizationSlug": "abc123",
  "teamSlug": "xyz789",
  "start": "10:15:30Z",
  "end": "10:15:30Z",
  "filterDevelopers": true
}
Response
{"data": {"statistics": {"track": TrackStatistics}}}

student

Description

Get the student for a given invite id and user id.

Response

Returns a Student

Arguments
Name Description
inviteID - ID! ID of the invite.
userID - ID! ID of the student.

Example

Query
query student(
  $inviteID: ID!,
  $userID: ID!
) {
  student(
    inviteID: $inviteID,
    userID: $userID
  ) {
    ...StudentFragment
  }
}
Variables
{"inviteID": 4, "userID": 4}
Response
{
  "data": {
    "student": {
      "user": User,
      "track": Track,
      "challenge": Challenge,
      "last_activity_at": "10:15:30Z",
      "completed_at": "10:15:30Z",
      "accessed_at": "10:15:30Z",
      "inspectable": false,
      "claim": InviteClaim,
      "activeSandboxesTotal": 123
    }
  }
}

studentStatistics

Description

Get the statistics related to the students.

Response

Returns a StudentStatistics

Arguments
Name Description
inviteID - ID! ID of the invite.

Example

Query
query studentStatistics($inviteID: ID!) {
  studentStatistics(inviteID: $inviteID) {
    ...StudentStatisticsFragment
  }
}
Variables
{"inviteID": 4}
Response
{"data": {"studentStatistics": {"inProgressTotal": 987, "completedTotal": 987}}}

students

Description

Get the students for a given invite id.

Response

Returns [Student!]

Arguments
Name Description
inviteID - ID! ID of the invite.

Example

Query
query students($inviteID: ID!) {
  students(inviteID: $inviteID) {
    ...StudentFragment
  }
}
Variables
{"inviteID": 4}
Response
{
  "data": {
    "students": [
      {
        "user": User,
        "track": Track,
        "challenge": Challenge,
        "last_activity_at": "10:15:30Z",
        "completed_at": "10:15:30Z",
        "accessed_at": "10:15:30Z",
        "inspectable": false,
        "claim": InviteClaim,
        "activeSandboxesTotal": 987
      }
    ]
  }
}

tab

Description

Get a challenge tab

Response

Returns a ChallengeTab

Arguments
Name Description
tabID - String! Unique ID

Example

Query
query tab($tabID: String!) {
  tab(tabID: $tabID) {
    ...ChallengeTabFragment
  }
}
Variables
{"tabID": "abc123"}
Response
{
  "data": {
    "tab": {
      "id": 4,
      "index": 123,
      "hostname": "abc123",
      "path": "abc123",
      "port": 987,
      "target": "xyz789",
      "title": "abc123",
      "type": "service",
      "url": "abc123",
      "new_window": false,
      "workdir": "abc123",
      "cmd": "abc123",
      "custom_headers": [CustomHeader],
      "custom_response_headers": [CustomHeader]
    }
  }
}

team

Description

Get a specific team

Response

Returns a Team

Arguments
Name Description
teamSlug - String Slug of the team
teamID - String Unique ID

Example

Query
query team(
  $teamSlug: String,
  $teamID: String
) {
  team(
    teamSlug: $teamSlug,
    teamID: $teamID
  ) {
    ...TeamFragment
  }
}
Variables
{
  "teamSlug": "abc123",
  "teamID": "abc123"
}
Response
{
  "data": {
    "team": {
      "id": 4,
      "members": [TeamMember],
      "users": [TeamUserEdge],
      "userInTeam": true,
      "userReportPage": UserReportPage,
      "userDetails": [UserDetails],
      "name": "xyz789",
      "logo": "xyz789",
      "title": "xyz789",
      "subtitle": "abc123",
      "slug": "xyz789",
      "primary_link_text": "xyz789",
      "primary_link_url": "xyz789",
      "secondary_link_text": "xyz789",
      "secondary_link_url": "xyz789",
      "api_key": "abc123",
      "theme": TeamTheme,
      "themes": [TrackTheme],
      "personal": true,
      "features": TeamFeatures,
      "invited": ["abc123"],
      "invites": [TeamInvite],
      "insights": Insights,
      "tracks": [Track],
      "hotStartPools": [HotStartPool],
      "privacy_policy": "xyz789",
      "webhook_dashboard_url": "abc123",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z",
      "lti_credentials": LTICredentials,
      "form": Form,
      "ssoConnection": SsoConnection,
      "tags": [Tag],
      "tagGroups": [TagGroup],
      "customResources": [CustomResource],
      "hostImages": [HostImage],
      "integrations": Integrations,
      "landingPages": [LandingPage],
      "ltiToolRegistrations": [LtiToolRegistration],
      "cloudProviderConfigs": [CloudProviderConfig],
      "githubInstallationID": 123,
      "enabledRepositories": ["xyz789"]
    }
  }
}

teamExists

Description

Check if a team exists

Response

Returns a Boolean!

Arguments
Name Description
teamSlug - String! Slug of the team

Example

Query
query teamExists($teamSlug: String!) {
  teamExists(teamSlug: $teamSlug)
}
Variables
{"teamSlug": "xyz789"}
Response
{"data": {"teamExists": true}}

teamInvite

Description

Get a team invite

Response

Returns a TeamInvite

Arguments
Name Description
token - String! The token of the invite

Example

Query
query teamInvite($token: String!) {
  teamInvite(token: $token) {
    ...TeamInviteFragment
  }
}
Variables
{"token": "xyz789"}
Response
{
  "data": {
    "teamInvite": {
      "email": "abc123",
      "role": "owner",
      "token_expired": true,
      "team": Team,
      "accepted_at": "10:15:30Z",
      "created_by": User
    }
  }
}

teamSecret

Response

Returns a Secret!

Arguments
Name Description
teamSlug - String Slug of the team
teamID - String Unique ID
name - String! Name of the secret

Example

Query
query teamSecret(
  $teamSlug: String,
  $teamID: String,
  $name: String!
) {
  teamSecret(
    teamSlug: $teamSlug,
    teamID: $teamID,
    name: $name
  ) {
    ...SecretFragment
  }
}
Variables
{
  "teamSlug": "abc123",
  "teamID": "abc123",
  "name": "xyz789"
}
Response
{
  "data": {
    "teamSecret": {
      "name": "xyz789",
      "description": "xyz789",
      "teamID": "xyz789",
      "created_at": "10:15:30Z",
      "created_by": User,
      "updated_at": "10:15:30Z",
      "updated_by": User,
      "tracks": [Track],
      "config_versions": [SandboxConfigVersion]
    }
  }
}

teamSecrets

Response

Returns [Secret!]

Arguments
Name Description
teamSlug - String Slug of the team
teamID - String Unique ID

Example

Query
query teamSecrets(
  $teamSlug: String,
  $teamID: String
) {
  teamSecrets(
    teamSlug: $teamSlug,
    teamID: $teamID
  ) {
    ...SecretFragment
  }
}
Variables
{
  "teamSlug": "abc123",
  "teamID": "abc123"
}
Response
{
  "data": {
    "teamSecrets": [
      {
        "name": "abc123",
        "description": "abc123",
        "teamID": "xyz789",
        "created_at": "10:15:30Z",
        "created_by": User,
        "updated_at": "10:15:30Z",
        "updated_by": User,
        "tracks": [Track],
        "config_versions": [SandboxConfigVersion]
      }
    ]
  }
}

teamStatistics

Response

Returns a TeamStatistics

Arguments
Name Description
teamID - String ID of the team
teamSlug - String Slug of the team
trackIDs - [String!] Filter on specific track id's
start - Time Start time, defaults to 30 days ago
end - Time End time, defaults to now
filterDevelopers - Boolean Filter developers

Example

Query
query teamStatistics(
  $teamID: String,
  $teamSlug: String,
  $trackIDs: [String!],
  $start: Time,
  $end: Time,
  $filterDevelopers: Boolean
) {
  teamStatistics(
    teamID: $teamID,
    teamSlug: $teamSlug,
    trackIDs: $trackIDs,
    start: $start,
    end: $end,
    filterDevelopers: $filterDevelopers
  ) {
    ...TeamStatisticsFragment
  }
}
Variables
{
  "teamID": "xyz789",
  "teamSlug": "abc123",
  "trackIDs": ["xyz789"],
  "start": "10:15:30Z",
  "end": "10:15:30Z",
  "filterDevelopers": true
}
Response
{
  "data": {
    "teamStatistics": {
      "started_total": 987,
      "completed_total": 987,
      "restarted_total": 987,
      "team_series": [TeamSeries],
      "track_statistics": [TrackStatistics]
    }
  }
}

teams

Description

Get the list of all teams you have access to.

Response

Returns [Team!]

Example

Query
query teams {
  teams {
    ...TeamFragment
  }
}
Response
{
  "data": {
    "teams": [
      {
        "id": "4",
        "members": [TeamMember],
        "users": [TeamUserEdge],
        "userInTeam": true,
        "userReportPage": UserReportPage,
        "userDetails": [UserDetails],
        "name": "xyz789",
        "logo": "abc123",
        "title": "abc123",
        "subtitle": "xyz789",
        "slug": "xyz789",
        "primary_link_text": "xyz789",
        "primary_link_url": "abc123",
        "secondary_link_text": "abc123",
        "secondary_link_url": "xyz789",
        "api_key": "xyz789",
        "theme": TeamTheme,
        "themes": [TrackTheme],
        "personal": true,
        "features": TeamFeatures,
        "invited": ["abc123"],
        "invites": [TeamInvite],
        "insights": Insights,
        "tracks": [Track],
        "hotStartPools": [HotStartPool],
        "privacy_policy": "xyz789",
        "webhook_dashboard_url": "abc123",
        "created_at": "10:15:30Z",
        "customer_since": "10:15:30Z",
        "trial_end_at": "10:15:30Z",
        "lti_credentials": LTICredentials,
        "form": Form,
        "ssoConnection": SsoConnection,
        "tags": [Tag],
        "tagGroups": [TagGroup],
        "customResources": [CustomResource],
        "hostImages": [HostImage],
        "integrations": Integrations,
        "landingPages": [LandingPage],
        "ltiToolRegistrations": [LtiToolRegistration],
        "cloudProviderConfigs": [CloudProviderConfig],
        "githubInstallationID": 987,
        "enabledRepositories": ["xyz789"]
      }
    ]
  }
}

terraformModule

Description

Returns a terraform module for the given id.

Response

Returns a TerraformModule

Arguments
Name Description
id - ID
module - String
version - String

Example

Query
query terraformModule(
  $id: ID,
  $module: String,
  $version: String
) {
  terraformModule(
    id: $id,
    module: $module,
    version: $version
  ) {
    ...TerraformModuleFragment
  }
}
Variables
{
  "id": "4",
  "module": "xyz789",
  "version": "abc123"
}
Response
{
  "data": {
    "terraformModule": {
      "id": "4",
      "name": "xyz789",
      "module": "xyz789",
      "description": "abc123",
      "source": "abc123",
      "provider": "abc123",
      "version": "xyz789",
      "availableVersions": ["abc123"],
      "logo": "abc123",
      "publishedAt": "10:15:30Z",
      "namespace": "xyz789",
      "owner": "abc123",
      "inputs": [TerraformModuleInput],
      "outputs": [TerraformModuleOutput]
    }
  }
}

topic

Description

Get a specific topic

Either topicID must be specified, or both topicSlug and organizationSlug

Response

Returns a Topic

Arguments
Name Description
topicID - String Unique ID
topicSlug - String Slug of the topic
organizationSlug - String Slug of the organization that owns the topic

Example

Query
query topic(
  $topicID: String,
  $topicSlug: String,
  $organizationSlug: String
) {
  topic(
    topicID: $topicID,
    topicSlug: $topicSlug,
    organizationSlug: $organizationSlug
  ) {
    ...TopicFragment
  }
}
Variables
{
  "topicID": "xyz789",
  "topicSlug": "abc123",
  "organizationSlug": "xyz789"
}
Response
{
  "data": {
    "topic": {
      "id": "4",
      "permalink": "abc123",
      "description": "xyz789",
      "icon": "xyz789",
      "slug": "xyz789",
      "title": "abc123",
      "tags": ["abc123"],
      "teaser": "xyz789",
      "tracks": [Track],
      "private": true,
      "owner": "abc123"
    }
  }
}

topicExists

Description

Check if a topic exists

Response

Returns a Boolean!

Arguments
Name Description
topicSlug - String! Slug of the topic
organizationSlug - String! Slug of the organization that owns the topic

Example

Query
query topicExists(
  $topicSlug: String!,
  $organizationSlug: String!
) {
  topicExists(
    topicSlug: $topicSlug,
    organizationSlug: $organizationSlug
  )
}
Variables
{
  "topicSlug": "abc123",
  "organizationSlug": "xyz789"
}
Response
{"data": {"topicExists": true}}

topics

Description

Get a list of topics for a given organization

Response

Returns [Topic!]

Arguments
Name Description
organizationSlug - String Slug of the organization, if not specified, the query will return all public topics

Example

Query
query topics($organizationSlug: String) {
  topics(organizationSlug: $organizationSlug) {
    ...TopicFragment
  }
}
Variables
{"organizationSlug": "abc123"}
Response
{
  "data": {
    "topics": [
      {
        "id": 4,
        "permalink": "xyz789",
        "description": "abc123",
        "icon": "xyz789",
        "slug": "xyz789",
        "title": "abc123",
        "tags": ["xyz789"],
        "teaser": "xyz789",
        "tracks": [Track],
        "private": false,
        "owner": "xyz789"
      }
    ]
  }
}

track

Description

Get a specific track

Either trackID must be specified, or both trackSlug and teamlug

Response

Returns a Track

Arguments
Name Description
trackID - String
trackSlug - String
organizationSlug - String
teamSlug - String
userID - String
inviteID - String

Example

Query
query track(
  $trackID: String,
  $trackSlug: String,
  $organizationSlug: String,
  $teamSlug: String,
  $userID: String,
  $inviteID: String
) {
  track(
    trackID: $trackID,
    trackSlug: $trackSlug,
    organizationSlug: $organizationSlug,
    teamSlug: $teamSlug,
    userID: $userID,
    inviteID: $inviteID
  ) {
    ...TrackFragment
  }
}
Variables
{
  "trackID": "abc123",
  "trackSlug": "abc123",
  "organizationSlug": "xyz789",
  "teamSlug": "xyz789",
  "userID": "xyz789",
  "inviteID": "abc123"
}
Response
{
  "data": {
    "track": {
      "id": 4,
      "slug": "abc123",
      "version": "xyz789",
      "revision": "10:15:30Z",
      "type": "abc123",
      "title": "xyz789",
      "teaser": "xyz789",
      "description": "abc123",
      "icon": "abc123",
      "level": "beginner",
      "tags": ["xyz789"],
      "trackTags": [Tag],
      "owner": "xyz789",
      "team": Team,
      "developers": [User],
      "userIsTrackDeveloper": true,
      "instructors": [TrackInstructor],
      "updated_by": User,
      "private": true,
      "published": false,
      "maintenance": false,
      "challenges": [Challenge],
      "config": TrackConfig,
      "sandboxConfig": SandboxConfigVersion,
      "trackConfig": TrackConfig,
      "status": "started",
      "started": "10:15:30Z",
      "creating": "10:15:30Z",
      "created": "10:15:30Z",
      "failed": "10:15:30Z",
      "stopped": "10:15:30Z",
      "completed": "10:15:30Z",
      "cleaned": "10:15:30Z",
      "permalink": "abc123",
      "play_limit": 987,
      "play_count": 987,
      "expiry_date": "10:15:30Z",
      "expiry_count": 123,
      "median_starttime": 123,
      "prestart": true,
      "skipping_to": Challenge,
      "scripts": [TrackScript],
      "actual_pool_size": 987,
      "show_timer": false,
      "skipping_enabled": true,
      "can_skip": true,
      "ttl": "10:15:30Z",
      "last_update": "10:15:30Z",
      "createdAt": "10:15:30Z",
      "deletedAt": "10:15:30Z",
      "learning_paths": [LearningPath],
      "accessible": true,
      "embed_token": "xyz789",
      "visibility": "unpublished",
      "trackReviews": TrackReviewConnection,
      "statistics": TrackStatistics,
      "participant": Play,
      "idle_timeout": 987,
      "studentStatistics": StudentTrackStatistics,
      "timelimit": 123,
      "lab_config": LabConfig,
      "sourceTrack": Track,
      "recommendations": ["create_notes"],
      "commits": [Commit],
      "remote_repository": "abc123"
    }
  }
}

trackConfig

Description

Get the config for a track

Note: you need to be developer of that track to access this

Response

Returns a TrackConfig

Arguments
Name Description
trackID - String! Unique ID

Example

Query
query trackConfig($trackID: String!) {
  trackConfig(trackID: $trackID) {
    ...TrackConfigFragment
  }
}
Variables
{"trackID": "abc123"}
Response
{
  "data": {
    "trackConfig": {
      "id": "4",
      "version": "abc123",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

trackConfigPresets

Description

Get presets for track config

Response

Returns a TrackConfigPresets

Example

Query
query trackConfigPresets {
  trackConfigPresets {
    ...TrackConfigPresetsFragment
  }
}
Response
{
  "data": {
    "trackConfigPresets": {
      "containers": [ContainerConfigPreset],
      "virtualmachines": [VirtualMachineConfigPreset],
      "machinetypes": [MachineTypePreset],
      "googlecloudmachinetypes": [
        GoogleCloudMachineTypePreset
      ]
    }
  }
}

trackExists

Description

Check if a track exists

Response

Returns a Boolean!

Arguments
Name Description
trackSlug - String! Slug of the track
organizationSlug - String Slug of the organization
teamSlug - String Slug of the team

Example

Query
query trackExists(
  $trackSlug: String!,
  $organizationSlug: String,
  $teamSlug: String
) {
  trackExists(
    trackSlug: $trackSlug,
    organizationSlug: $organizationSlug,
    teamSlug: $teamSlug
  )
}
Variables
{
  "trackSlug": "abc123",
  "organizationSlug": "xyz789",
  "teamSlug": "abc123"
}
Response
{"data": {"trackExists": false}}

trackInvite

Description

Get a specific invite for a track

Response

Returns a TrackInvite

Arguments
Name Description
inviteID - String! Unique ID

Example

Query
query trackInvite($inviteID: String!) {
  trackInvite(inviteID: $inviteID) {
    ...TrackInviteFragment
  }
}
Variables
{"inviteID": "abc123"}
Response
{
  "data": {
    "trackInvite": {
      "id": "4",
      "title": "xyz789",
      "publicTitle": "abc123",
      "publicDescription": "xyz789",
      "tracks": [Track],
      "trackEdges": [TrackInviteTrackEdge],
      "authors": [TrackInviteAuthor],
      "trackLibrary": TrackLibraryEntryConnection,
      "organization": Organization,
      "team": Team,
      "accessSetting": "anyone",
      "inviteLimit": 987,
      "inviteCount": 987,
      "claimCount": 987,
      "inviteTTL": "10:15:30Z",
      "expiresAt": "10:15:30Z",
      "startsAt": "10:15:30Z",
      "playLimit": 123,
      "playTTL": 987,
      "created": "10:15:30Z",
      "last_updated": "10:15:30Z",
      "allowAnonymous": true,
      "allowedEmailAddresses": ["abc123"],
      "allowedEmailAddressesOnly": false,
      "currentUserAllowed": false,
      "currentUserClaim": InviteClaim,
      "currentUserClaimed": true,
      "claims": [InviteClaim],
      "activeUsers": [UserActivity],
      "plays": [InvitePlay],
      "type": "self_paced",
      "status": "active",
      "daysUntil": 123,
      "enableLearnerSharing": true,
      "canClaim": false,
      "runtimeParameters": RuntimeParameters,
      "shareMethod": "link",
      "deletedAt": "10:15:30Z"
    }
  }
}

trackInviteClaim

Description

Get an InviteClaim for a specific invite and user

Either claimID or a combination of inviteID and userID must be specified

Response

Returns an InviteClaim

Arguments
Name Description
claimID - String Claim ID
inviteID - String Invite ID
userID - String User ID

Example

Query
query trackInviteClaim(
  $claimID: String,
  $inviteID: String,
  $userID: String
) {
  trackInviteClaim(
    claimID: $claimID,
    inviteID: $inviteID,
    userID: $userID
  ) {
    ...InviteClaimFragment
  }
}
Variables
{
  "claimID": "abc123",
  "inviteID": "abc123",
  "userID": "abc123"
}
Response
{
  "data": {
    "trackInviteClaim": {
      "id": "4",
      "username": "abc123",
      "user": User,
      "trackInvite": TrackInvite,
      "playLimit": 123,
      "playCount": 123,
      "playTTL": "10:15:30Z",
      "claimedAt": "10:15:30Z",
      "customParameters": [CustomParameter],
      "events": [InviteEvent],
      "trackLibrary": [TrackLibraryEntry]
    }
  }
}

trackInvites

Description

Get all invites for a team

Either teamSlug or teamID must be specified

Response

Returns [TrackInvite!]

Arguments
Name Description
organizationSlug - String Slug of the organization
organizationID - String ID of the organization
teamSlug - String Slug of the team
teamID - String ID of the team
filters - InviteFilters Filter invite

Example

Query
query trackInvites(
  $organizationSlug: String,
  $organizationID: String,
  $teamSlug: String,
  $teamID: String,
  $filters: InviteFilters
) {
  trackInvites(
    organizationSlug: $organizationSlug,
    organizationID: $organizationID,
    teamSlug: $teamSlug,
    teamID: $teamID,
    filters: $filters
  ) {
    ...TrackInviteFragment
  }
}
Variables
{
  "organizationSlug": "xyz789",
  "organizationID": "xyz789",
  "teamSlug": "abc123",
  "teamID": "abc123",
  "filters": InviteFilters
}
Response
{
  "data": {
    "trackInvites": [
      {
        "id": "4",
        "title": "xyz789",
        "publicTitle": "xyz789",
        "publicDescription": "xyz789",
        "tracks": [Track],
        "trackEdges": [TrackInviteTrackEdge],
        "authors": [TrackInviteAuthor],
        "trackLibrary": TrackLibraryEntryConnection,
        "organization": Organization,
        "team": Team,
        "accessSetting": "anyone",
        "inviteLimit": 987,
        "inviteCount": 123,
        "claimCount": 123,
        "inviteTTL": "10:15:30Z",
        "expiresAt": "10:15:30Z",
        "startsAt": "10:15:30Z",
        "playLimit": 123,
        "playTTL": 987,
        "created": "10:15:30Z",
        "last_updated": "10:15:30Z",
        "allowAnonymous": true,
        "allowedEmailAddresses": ["abc123"],
        "allowedEmailAddressesOnly": true,
        "currentUserAllowed": true,
        "currentUserClaim": InviteClaim,
        "currentUserClaimed": true,
        "claims": [InviteClaim],
        "activeUsers": [UserActivity],
        "plays": [InvitePlay],
        "type": "self_paced",
        "status": "active",
        "daysUntil": 987,
        "enableLearnerSharing": true,
        "canClaim": true,
        "runtimeParameters": RuntimeParameters,
        "shareMethod": "link",
        "deletedAt": "10:15:30Z"
      }
    ]
  }
}

trackLibrary

Query userTrackInvites instead
Description

Get a list tracks of the current user

This will return all tracks that are in a user's library. Currently this only includes tracks for which the user has been invited.

Response

Returns a TrackLibraryEntryConnection

Arguments
Name Description
after - String
first - Int

Example

Query
query trackLibrary(
  $after: String,
  $first: Int
) {
  trackLibrary(
    after: $after,
    first: $first
  ) {
    ...TrackLibraryEntryConnectionFragment
  }
}
Variables
{"after": "xyz789", "first": 987}
Response
{
  "data": {
    "trackLibrary": {
      "edges": [TrackLibraryEntryEdge],
      "nodes": [TrackLibraryEntry],
      "pageInfo": PageInfo,
      "totalCount": 987
    }
  }
}

trackPlayLimits

Description

Get all the limits configured for the given team

Response

Returns [TrackPlayLimit!]!

Arguments
Name Description
teamID - String ID of the team
teamSlug - String Slug of the team

Example

Query
query trackPlayLimits(
  $teamID: String,
  $teamSlug: String
) {
  trackPlayLimits(
    teamID: $teamID,
    teamSlug: $teamSlug
  ) {
    ...TrackPlayLimitFragment
  }
}
Variables
{
  "teamID": "xyz789",
  "teamSlug": "xyz789"
}
Response
{
  "data": {
    "trackPlayLimits": [
      {
        "track": Track,
        "rollingMonth": 123,
        "rollingIPAddressPerHour": 123,
        "calendarMonth": 987,
        "concurrentPlaysPerIP": 123
      }
    ]
  }
}

trackReview

Description

Gets a track review by ID

Response

Returns a TrackReview!

Arguments
Name Description
reviewID - ID!

Example

Query
query trackReview($reviewID: ID!) {
  trackReview(reviewID: $reviewID) {
    ...TrackReviewFragment
  }
}
Variables
{"reviewID": "4"}
Response
{
  "data": {
    "trackReview": {
      "id": "4",
      "track": Track,
      "challenge": Challenge,
      "user": User,
      "play": Play,
      "created_at": "10:15:30Z",
      "updated_at": "10:15:30Z",
      "score": 987,
      "content": "xyz789"
    }
  }
}

trackReviews

Description

Get reviews for a specific track

A trackID must be specified

Response

Returns a TrackReviewConnection

Arguments
Name Description
trackID - String!
after - String
first - Int

Example

Query
query trackReviews(
  $trackID: String!,
  $after: String,
  $first: Int
) {
  trackReviews(
    trackID: $trackID,
    after: $after,
    first: $first
  ) {
    ...TrackReviewConnectionFragment
  }
}
Variables
{
  "trackID": "xyz789",
  "after": "abc123",
  "first": 123
}
Response
{
  "data": {
    "trackReviews": {
      "edges": [TrackReviewEdge],
      "nodes": [TrackReview],
      "pageInfo": PageInfo,
      "totalCount": 987
    }
  }
}

trackScript

Description

Get a specific challenge script

Note: you need to be developer of that track to access this

Response

Returns a TrackScript

Arguments
Name Description
scriptID - String! Unique ID

Example

Query
query trackScript($scriptID: String!) {
  trackScript(scriptID: $scriptID) {
    ...TrackScriptFragment
  }
}
Variables
{"scriptID": "xyz789"}
Response
{
  "data": {
    "trackScript": {
      "id": "4",
      "action": "abc123",
      "contents": "abc123",
      "host": "abc123"
    }
  }
}

trackScripts

Description

Get the scripts for a track

Note: you need to be developer of that track to access this

Response

Returns [TrackScript!]

Arguments
Name Description
trackID - String! Unique ID

Example

Query
query trackScripts($trackID: String!) {
  trackScripts(trackID: $trackID) {
    ...TrackScriptFragment
  }
}
Variables
{"trackID": "xyz789"}
Response
{
  "data": {
    "trackScripts": [
      {
        "id": "4",
        "action": "xyz789",
        "contents": "xyz789",
        "host": "xyz789"
      }
    ]
  }
}

tracks

Description

Get a list of tracks

If either teamSlug or teamID is set, it will return only tracks for that team. Otherwise it will return tracks from all teams

Response

Returns [Track!]

Arguments
Name Description
organizationSlug - String Slug of the organization
organizationID - String ID of the organization
teamSlug - String Slug of the team
teamID - String ID of the team
orderBy - TrackOrder Order results, defaults to title_ASC

Example

Query
query tracks(
  $organizationSlug: String,
  $organizationID: String,
  $teamSlug: String,
  $teamID: String,
  $orderBy: TrackOrder
) {
  tracks(
    organizationSlug: $organizationSlug,
    organizationID: $organizationID,
    teamSlug: $teamSlug,
    teamID: $teamID,
    orderBy: $orderBy
  ) {
    ...TrackFragment
  }
}
Variables
{
  "organizationSlug": "abc123",
  "organizationID": "abc123",
  "teamSlug": "xyz789",
  "teamID": "xyz789",
  "orderBy": "last_update_ASC"
}
Response
{
  "data": {
    "tracks": [
      {
        "id": "4",
        "slug": "xyz789",
        "version": "abc123",
        "revision": "10:15:30Z",
        "type": "abc123",
        "title": "xyz789",
        "teaser": "abc123",
        "description": "xyz789",
        "icon": "xyz789",
        "level": "beginner",
        "tags": ["abc123"],
        "trackTags": [Tag],
        "owner": "xyz789",
        "team": Team,
        "developers": [User],
        "userIsTrackDeveloper": true,
        "instructors": [TrackInstructor],
        "updated_by": User,
        "private": true,
        "published": true,
        "maintenance": false,
        "challenges": [Challenge],
        "config": TrackConfig,
        "sandboxConfig": SandboxConfigVersion,
        "trackConfig": TrackConfig,
        "status": "started",
        "started": "10:15:30Z",
        "creating": "10:15:30Z",
        "created": "10:15:30Z",
        "failed": "10:15:30Z",
        "stopped": "10:15:30Z",
        "completed": "10:15:30Z",
        "cleaned": "10:15:30Z",
        "permalink": "abc123",
        "play_limit": 123,
        "play_count": 123,
        "expiry_date": "10:15:30Z",
        "expiry_count": 987,
        "median_starttime": 987,
        "prestart": true,
        "skipping_to": Challenge,
        "scripts": [TrackScript],
        "actual_pool_size": 123,
        "show_timer": false,
        "skipping_enabled": false,
        "can_skip": true,
        "ttl": "10:15:30Z",
        "last_update": "10:15:30Z",
        "createdAt": "10:15:30Z",
        "deletedAt": "10:15:30Z",
        "learning_paths": [LearningPath],
        "accessible": false,
        "embed_token": "xyz789",
        "visibility": "unpublished",
        "trackReviews": TrackReviewConnection,
        "statistics": TrackStatistics,
        "participant": Play,
        "idle_timeout": 987,
        "studentStatistics": StudentTrackStatistics,
        "timelimit": 123,
        "lab_config": LabConfig,
        "sourceTrack": Track,
        "recommendations": ["create_notes"],
        "commits": [Commit],
        "remote_repository": "abc123"
      }
    ]
  }
}

user

Description

Gets a user

One of userID, email or slug must be specified

Response

Returns a User

Arguments
Name Description
userID - String Unique ID
email - String Email address
slug - String Slug (username)

Example

Query
query user(
  $userID: String,
  $email: String,
  $slug: String
) {
  user(
    userID: $userID,
    email: $email,
    slug: $slug
  ) {
    ...UserFragment
  }
}
Variables
{
  "userID": "xyz789",
  "email": "abc123",
  "slug": "xyz789"
}
Response
{
  "data": {
    "user": {
      "id": 4,
      "profile": UserProfile,
      "details": UserDetails,
      "organizations": [UserOrganizationEdge],
      "teams": [UserTeamEdge],
      "is_anonymous": false,
      "is_global_admin": true,
      "segments": ["instruqt_employee"],
      "claims": [InviteClaim],
      "accessibleTracks": [Track],
      "reportItem": UserReportItem
    }
  }
}

userConsentedToPrivacyPolicy

Description

Check if the user consented to the team's privacy policy

Response

Returns a Boolean

Arguments
Name Description
userID - String! Unique ID

Example

Query
query userConsentedToPrivacyPolicy($userID: String!) {
  userConsentedToPrivacyPolicy(userID: $userID)
}
Variables
{"userID": "abc123"}
Response
{"data": {"userConsentedToPrivacyPolicy": false}}

userExists

Description

Check whether the user exists

Response

Returns a Boolean!

Arguments
Name Description
userID - String! Unique ID

Example

Query
query userExists($userID: String!) {
  userExists(userID: $userID)
}
Variables
{"userID": "abc123"}
Response
{"data": {"userExists": true}}

userInOrganization

No longer supported
Description

Check if the currently logged in user is member of the given organiztion

Response

Returns a Boolean!

Arguments
Name Description
organizationSlug - String! Slug of the organization

Example

Query
query userInOrganization($organizationSlug: String!) {
  userInOrganization(organizationSlug: $organizationSlug)
}
Variables
{"organizationSlug": "abc123"}
Response
{"data": {"userInOrganization": true}}

userInTeam

Use Team.userInTeam instead
Description

Check if the currently logged in user is member of the given team

Response

Returns a Boolean!

Arguments
Name Description
teamSlug - String! Slug of the team

Example

Query
query userInTeam($teamSlug: String!) {
  userInTeam(teamSlug: $teamSlug)
}
Variables
{"teamSlug": "xyz789"}
Response
{"data": {"userInTeam": false}}

userIsTrackDeveloper

Use Track.userIsTrackDeveloper instead
Description

Checks if the currently logged in user is a developer for the given track

Either trackID must be specified, or both trackSlug and teamSlug

Response

Returns a Boolean!

Arguments
Name Description
trackID - String Unique ID
trackSlug - String Slug of the track
organizationSlug - String Slug of the organization
teamSlug - String Slug of the team

Example

Query
query userIsTrackDeveloper(
  $trackID: String,
  $trackSlug: String,
  $organizationSlug: String,
  $teamSlug: String
) {
  userIsTrackDeveloper(
    trackID: $trackID,
    trackSlug: $trackSlug,
    organizationSlug: $organizationSlug,
    teamSlug: $teamSlug
  )
}
Variables
{
  "trackID": "xyz789",
  "trackSlug": "xyz789",
  "organizationSlug": "xyz789",
  "teamSlug": "abc123"
}
Response
{"data": {"userIsTrackDeveloper": false}}

userTrackInvites

User User.claims instead
Description

Get all the accepted invites or a user

Response

Returns [TrackInvite!]

Arguments
Name Description
userID - String!

Example

Query
query userTrackInvites($userID: String!) {
  userTrackInvites(userID: $userID) {
    ...TrackInviteFragment
  }
}
Variables
{"userID": "abc123"}
Response
{
  "data": {
    "userTrackInvites": [
      {
        "id": 4,
        "title": "abc123",
        "publicTitle": "abc123",
        "publicDescription": "xyz789",
        "tracks": [Track],
        "trackEdges": [TrackInviteTrackEdge],
        "authors": [TrackInviteAuthor],
        "trackLibrary": TrackLibraryEntryConnection,
        "organization": Organization,
        "team": Team,
        "accessSetting": "anyone",
        "inviteLimit": 987,
        "inviteCount": 987,
        "claimCount": 123,
        "inviteTTL": "10:15:30Z",
        "expiresAt": "10:15:30Z",
        "startsAt": "10:15:30Z",
        "playLimit": 987,
        "playTTL": 123,
        "created": "10:15:30Z",
        "last_updated": "10:15:30Z",
        "allowAnonymous": true,
        "allowedEmailAddresses": ["abc123"],
        "allowedEmailAddressesOnly": true,
        "currentUserAllowed": true,
        "currentUserClaim": InviteClaim,
        "currentUserClaimed": true,
        "claims": [InviteClaim],
        "activeUsers": [UserActivity],
        "plays": [InvitePlay],
        "type": "self_paced",
        "status": "active",
        "daysUntil": 987,
        "enableLearnerSharing": true,
        "canClaim": false,
        "runtimeParameters": RuntimeParameters,
        "shareMethod": "link",
        "deletedAt": "10:15:30Z"
      }
    ]
  }
}

userWithSlugExists

Description

Check whether the user exists

Response

Returns a Boolean!

Arguments
Name Description
slug - String! Slug (username)

Example

Query
query userWithSlugExists($slug: String!) {
  userWithSlugExists(slug: $slug)
}
Variables
{"slug": "abc123"}
Response
{"data": {"userWithSlugExists": false}}

viewInvite

Description

Get a specific invite for a track

This query is similar to trackInvite(inviteID), but will throw an error when the invite has expired

Response

Returns a TrackInvite

Arguments
Name Description
inviteID - String! Unique ID

Example

Query
query viewInvite($inviteID: String!) {
  viewInvite(inviteID: $inviteID) {
    ...TrackInviteFragment
  }
}
Variables
{"inviteID": "abc123"}
Response
{
  "data": {
    "viewInvite": {
      "id": 4,
      "title": "xyz789",
      "publicTitle": "xyz789",
      "publicDescription": "abc123",
      "tracks": [Track],
      "trackEdges": [TrackInviteTrackEdge],
      "authors": [TrackInviteAuthor],
      "trackLibrary": TrackLibraryEntryConnection,
      "organization": Organization,
      "team": Team,
      "accessSetting": "anyone",
      "inviteLimit": 123,
      "inviteCount": 987,
      "claimCount": 987,
      "inviteTTL": "10:15:30Z",
      "expiresAt": "10:15:30Z",
      "startsAt": "10:15:30Z",
      "playLimit": 987,
      "playTTL": 987,
      "created": "10:15:30Z",
      "last_updated": "10:15:30Z",
      "allowAnonymous": true,
      "allowedEmailAddresses": ["xyz789"],
      "allowedEmailAddressesOnly": true,
      "currentUserAllowed": false,
      "currentUserClaim": InviteClaim,
      "currentUserClaimed": false,
      "claims": [InviteClaim],
      "activeUsers": [UserActivity],
      "plays": [InvitePlay],
      "type": "self_paced",
      "status": "active",
      "daysUntil": 987,
      "enableLearnerSharing": true,
      "canClaim": false,
      "runtimeParameters": RuntimeParameters,
      "shareMethod": "link",
      "deletedAt": "10:15:30Z"
    }
  }
}

virtualBrowserCheck

Description

Returns a single Virtual Browser Check corresponding to the given challenge and host.

Response

Returns a VirtualBrowserCheck!

Arguments
Name Description
challenge - String!
host - String!

Example

Query
query virtualBrowserCheck(
  $challenge: String!,
  $host: String!
) {
  virtualBrowserCheck(
    challenge: $challenge,
    host: $host
  ) {
    ...VirtualBrowserCheckFragment
  }
}
Variables
{
  "challenge": "xyz789",
  "host": "abc123"
}
Response
{
  "data": {
    "virtualBrowserCheck": {
      "id": 4,
      "challenge": Challenge,
      "host": "xyz789",
      "browserLocation": Location,
      "element": [HtmlElement],
      "innerText": [HtmlElement]
    }
  }
}

virtualBrowserChecks

Description

Returns all Virtual Browser Checks corresponding to the given track.

Response

Returns [VirtualBrowserCheck!]!

Arguments
Name Description
track - String!

Example

Query
query virtualBrowserChecks($track: String!) {
  virtualBrowserChecks(track: $track) {
    ...VirtualBrowserCheckFragment
  }
}
Variables
{"track": "abc123"}
Response
{
  "data": {
    "virtualBrowserChecks": [
      {
        "id": "4",
        "challenge": Challenge,
        "host": "abc123",
        "browserLocation": Location,
        "element": [HtmlElement],
        "innerText": [HtmlElement]
      }
    ]
  }
}

virtualMachineConfig

Description

Get a virtual machine config for a track

Note: you need to be developer of that track to access this

Response

Returns a VirtualMachineConfig

Arguments
Name Description
virtualmachineID - String! Unique ID

Example

Query
query virtualMachineConfig($virtualmachineID: String!) {
  virtualMachineConfig(virtualmachineID: $virtualmachineID) {
    ...VirtualMachineConfigFragment
  }
}
Variables
{"virtualmachineID": "xyz789"}
Response
{
  "data": {
    "virtualMachineConfig": {
      "id": "4",
      "allow_external_ingress": ["abc123"],
      "environment": [EnvironmentVariable],
      "image": "xyz789",
      "machine_type": "xyz789",
      "name": "abc123",
      "pool_size": 987,
      "preemptible": true,
      "shell": "xyz789",
      "cpus": 123,
      "memory": 123,
      "nested_virtualization": true,
      "provision_ssl_certificate": false
    }
  }
}

webhooks

Description

Returns all a teams webhooks

Response

Returns [Webhook!]!

Arguments
Name Description
teamID - String ID of the team
teamSlug - String Slug of the team

Example

Query
query webhooks(
  $teamID: String,
  $teamSlug: String
) {
  webhooks(
    teamID: $teamID,
    teamSlug: $teamSlug
  ) {
    ...WebhookFragment
  }
}
Variables
{
  "teamID": "abc123",
  "teamSlug": "abc123"
}
Response
{
  "data": {
    "webhooks": [
      {
        "id": "4",
        "name": "abc123",
        "url": "xyz789",
        "created_at": "10:15:30Z",
        "updated_at": "10:15:30Z",
        "events": ["abc123"],
        "custom_headers": [CustomHeader]
      }
    ]
  }
}

Mutations

addTrackToTopic

Description

Add a track to a topic

Note: you need to be a member of the organization that owns the track and topic

Response

Returns a Topic

Arguments
Name Description
trackID - String! ID of the track
topicID - String! ID of the topic

Example

Query
mutation addTrackToTopic(
  $trackID: String!,
  $topicID: String!
) {
  addTrackToTopic(
    trackID: $trackID,
    topicID: $topicID
  ) {
    ...TopicFragment
  }
}
Variables
{
  "trackID": "xyz789",
  "topicID": "abc123"
}
Response
{
  "data": {
    "addTrackToTopic": {
      "id": 4,
      "permalink": "abc123",
      "description": "xyz789",
      "icon": "xyz789",
      "slug": "xyz789",
      "title": "xyz789",
      "tags": ["abc123"],
      "teaser": "xyz789",
      "tracks": [Track],
      "private": false,
      "owner": "xyz789"
    }
  }
}

archiveHotStartPool

Description

Archive hot start pool

Response

Returns a HotStartPool

Arguments
Name Description
poolID - ID! ID of hot start pool to archive

Example

Query
mutation archiveHotStartPool($poolID: ID!) {
  archiveHotStartPool(poolID: $poolID) {
    ...HotStartPoolFragment
  }
}
Variables
{"poolID": "4"}
Response
{
  "data": {
    "archiveHotStartPool": {
      "id": 4,
      "type": "dedicated",
      "size": 123,
      "created": "10:15:30Z",
      "deleted": "10:15:30Z",
      "name": "xyz789",
      "auto_refill": true,
      "starts_at": "10:15:30Z",
      "ends_at": "10:15:30Z",
      "created_by": User,
      "team": Team,
      "tracks": [HotStartPoolTrackEdge],
      "configs": [HotStartConfigTrackEdge],
      "status": "Running",
      "region": "xyz789"
    }
  }
}

buildTrack

Description

Build a track

This converts the track config into a participant environment definition. After a build, the (updated) track is available for new participant.

Note: you need to be a developer for this track

Response

Returns a Boolean!

Arguments
Name Description
trackID - String!

Example

Query
mutation buildTrack($trackID: String!) {
  buildTrack(trackID: $trackID)
}
Variables
{"trackID": "abc123"}
Response
{"data": {"buildTrack": false}}

changeTeamUserRole

Description

Promote or demote a user within a team.

Response

Returns a Team

Arguments
Name Description
teamID - String! ID of the team
userID - String! ID of the user to promote/demote
role - RoleName! Role to give to the user

Example

Query
mutation changeTeamUserRole(
  $teamID: String!,
  $userID: String!,
  $role: RoleName!
) {
  changeTeamUserRole(
    teamID: $teamID,
    userID: $userID,
    role: $role
  ) {
    ...TeamFragment
  }
}
Variables
{
  "teamID": "abc123",
  "userID": "abc123",
  "role": "owner"
}
Response
{
  "data": {
    "changeTeamUserRole": {
      "id": "4",
      "members": [TeamMember],
      "users": [TeamUserEdge],
      "userInTeam": true,
      "userReportPage": UserReportPage,
      "userDetails": [UserDetails],
      "name": "xyz789",
      "logo": "abc123",
      "title": "abc123",
      "subtitle": "xyz789",
      "slug": "abc123",
      "primary_link_text": "xyz789",
      "primary_link_url": "abc123",
      "secondary_link_text": "abc123",
      "secondary_link_url": "xyz789",
      "api_key": "xyz789",
      "theme": TeamTheme,
      "themes": [TrackTheme],
      "personal": true,
      "features": TeamFeatures,
      "invited": ["xyz789"],
      "invites": [TeamInvite],
      "insights": Insights,
      "tracks": [Track],
      "hotStartPools": [HotStartPool],
      "privacy_policy": "xyz789",
      "webhook_dashboard_url": "abc123",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z",
      "lti_credentials": LTICredentials,
      "form": Form,
      "ssoConnection": SsoConnection,
      "tags": [Tag],
      "tagGroups": [TagGroup],
      "customResources": [CustomResource],
      "hostImages": [HostImage],
      "integrations": Integrations,
      "landingPages": [LandingPage],
      "ltiToolRegistrations": [LtiToolRegistration],
      "cloudProviderConfigs": [CloudProviderConfig],
      "githubInstallationID": 123,
      "enabledRepositories": ["abc123"]
    }
  }
}

changeUserRole

No longer supported
Description

Promote or demote a user within an organization.

Response

Returns an Organization

Arguments
Name Description
organizationID - String! ID of the organization
userID - String! ID of the user to promote/demote
role - RoleName! Role to give to the user

Example

Query
mutation changeUserRole(
  $organizationID: String!,
  $userID: String!,
  $role: RoleName!
) {
  changeUserRole(
    organizationID: $organizationID,
    userID: $userID,
    role: $role
  ) {
    ...OrganizationFragment
  }
}
Variables
{
  "organizationID": "abc123",
  "userID": "abc123",
  "role": "owner"
}
Response
{
  "data": {
    "changeUserRole": {
      "id": "4",
      "members": [OrganizationMember],
      "users": [OrganizationUserEdge],
      "name": "abc123",
      "logo": "abc123",
      "title": "abc123",
      "subtitle": "abc123",
      "slug": "abc123",
      "primary_link_text": "abc123",
      "primary_link_url": "xyz789",
      "secondary_link_text": "abc123",
      "secondary_link_url": "abc123",
      "api_key": "abc123",
      "theme": OrganizationTheme,
      "personal": false,
      "features": OrganizationFeatures,
      "invited": ["xyz789"],
      "invites": [OrganizationInvite],
      "privacy_policy": "xyz789",
      "webhook_dashboard_url": "abc123",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z"
    }
  }
}

checkChallenge

Description

Runs the check script of the challenge

Response

Returns a Challenge

Arguments
Name Description
challengeID - String! ID of the challenge
userID - String User ID of the user being impersonated
inviteID - String Invite ID of the impersonated user's invite
waitForCleanup - Boolean Wait for cleanup

Example

Query
mutation checkChallenge(
  $challengeID: String!,
  $userID: String,
  $inviteID: String,
  $waitForCleanup: Boolean
) {
  checkChallenge(
    challengeID: $challengeID,
    userID: $userID,
    inviteID: $inviteID,
    waitForCleanup: $waitForCleanup
  ) {
    ...ChallengeFragment
  }
}
Variables
{
  "challengeID": "abc123",
  "userID": "xyz789",
  "inviteID": "xyz789",
  "waitForCleanup": false
}
Response
{
  "data": {
    "checkChallenge": {
      "id": 4,
      "track": Track,
      "answers": ["xyz789"],
      "assignment": "abc123",
      "attempts": [ChallengeAttempt],
      "can_check": false,
      "difficulty": "abc123",
      "index": 987,
      "notes": [ChallengeNote],
      "permalink": "abc123",
      "scripts": [ChallengeScript],
      "slug": "xyz789",
      "solution": [123],
      "hasSingleAnswer": true,
      "status": "locked",
      "tabs": [ChallengeTab],
      "teaser": "xyz789",
      "timelimit": 987,
      "started": 123,
      "completed": 987,
      "failed": 123,
      "failMessage": "abc123",
      "title": "xyz789",
      "type": "challenge",
      "unlocks": Challenge,
      "labConfig": ChallengeLabConfig,
      "deletedAt": "10:15:30Z"
    }
  }
}

checkQuiz

Description

Check if a quiz type challenge is correct

Response

Returns a Challenge

Arguments
Name Description
challengeID - String! ID of the challenge
userID - String user ID to impersonate
inviteID - String invite ID for the given user to impersonate
solution - [Int!]! List of answers provided by the user

Example

Query
mutation checkQuiz(
  $challengeID: String!,
  $userID: String,
  $inviteID: String,
  $solution: [Int!]!
) {
  checkQuiz(
    challengeID: $challengeID,
    userID: $userID,
    inviteID: $inviteID,
    solution: $solution
  ) {
    ...ChallengeFragment
  }
}
Variables
{
  "challengeID": "xyz789",
  "userID": "abc123",
  "inviteID": "xyz789",
  "solution": [987]
}
Response
{
  "data": {
    "checkQuiz": {
      "id": "4",
      "track": Track,
      "answers": ["xyz789"],
      "assignment": "abc123",
      "attempts": [ChallengeAttempt],
      "can_check": true,
      "difficulty": "xyz789",
      "index": 987,
      "notes": [ChallengeNote],
      "permalink": "abc123",
      "scripts": [ChallengeScript],
      "slug": "xyz789",
      "solution": [123],
      "hasSingleAnswer": true,
      "status": "locked",
      "tabs": [ChallengeTab],
      "teaser": "xyz789",
      "timelimit": 123,
      "started": 123,
      "completed": 987,
      "failed": 123,
      "failMessage": "abc123",
      "title": "abc123",
      "type": "challenge",
      "unlocks": Challenge,
      "labConfig": ChallengeLabConfig,
      "deletedAt": "10:15:30Z"
    }
  }
}

claimOrganizationInvite

No longer supported
Description

Claim an organizatation invite

Response

Returns an OrganizationInvite

Arguments
Name Description
token - String! The token you want to claim an invite for

Example

Query
mutation claimOrganizationInvite($token: String!) {
  claimOrganizationInvite(token: $token) {
    ...OrganizationInviteFragment
  }
}
Variables
{"token": "abc123"}
Response
{
  "data": {
    "claimOrganizationInvite": {
      "email": "abc123",
      "role": "owner",
      "token_expired": false,
      "organization": Organization,
      "accepted_at": "10:15:30Z",
      "created_by": User
    }
  }
}

claimTeamInvites

Description

Claims team invites associated with the current user's email.

Response

Returns a User

Arguments
Name Description
token - String An (optional) team invite token to claim, incase email does not match.

Example

Query
mutation claimTeamInvites($token: String) {
  claimTeamInvites(token: $token) {
    ...UserFragment
  }
}
Variables
{"token": "xyz789"}
Response
{
  "data": {
    "claimTeamInvites": {
      "id": 4,
      "profile": UserProfile,
      "details": UserDetails,
      "organizations": [UserOrganizationEdge],
      "teams": [UserTeamEdge],
      "is_anonymous": true,
      "is_global_admin": false,
      "segments": ["instruqt_employee"],
      "claims": [InviteClaim],
      "accessibleTracks": [Track],
      "reportItem": UserReportItem
    }
  }
}

claimTrackInvite

Description

Claim a track invite.

Response

Returns an InviteClaim

Arguments
Name Description
inviteID - String! ID of the invite being claimed
userDetails - UserDetailsInput Details of the user claiming the invite
customParameters - [CustomParametersInput!] Custom Parameters used to inject metadata to the claim

Example

Query
mutation claimTrackInvite(
  $inviteID: String!,
  $userDetails: UserDetailsInput,
  $customParameters: [CustomParametersInput!]
) {
  claimTrackInvite(
    inviteID: $inviteID,
    userDetails: $userDetails,
    customParameters: $customParameters
  ) {
    ...InviteClaimFragment
  }
}
Variables
{
  "inviteID": "xyz789",
  "userDetails": UserDetailsInput,
  "customParameters": [CustomParametersInput]
}
Response
{
  "data": {
    "claimTrackInvite": {
      "id": 4,
      "username": "abc123",
      "user": User,
      "trackInvite": TrackInvite,
      "playLimit": 123,
      "playCount": 987,
      "playTTL": "10:15:30Z",
      "claimedAt": "10:15:30Z",
      "customParameters": [CustomParameter],
      "events": [InviteEvent],
      "trackLibrary": [TrackLibraryEntry]
    }
  }
}

consentToOrganizationPrivacyPolicy

No longer supported
Description

Set whether or not the user gives consent to receive marketing updates from the given organization.

Response

Returns a Boolean!

Arguments
Name Description
organizationID - String!
consent - Boolean!

Example

Query
mutation consentToOrganizationPrivacyPolicy(
  $organizationID: String!,
  $consent: Boolean!
) {
  consentToOrganizationPrivacyPolicy(
    organizationID: $organizationID,
    consent: $consent
  )
}
Variables
{
  "organizationID": "xyz789",
  "consent": false
}
Response
{"data": {"consentToOrganizationPrivacyPolicy": false}}

consentToTeamPrivacyPolicy

Description

Set whether or not the user gives consent to receive marketing updates from the given team.

Response

Returns a Boolean!

Arguments
Name Description
teamID - String!
consent - Boolean!

Example

Query
mutation consentToTeamPrivacyPolicy(
  $teamID: String!,
  $consent: Boolean!
) {
  consentToTeamPrivacyPolicy(
    teamID: $teamID,
    consent: $consent
  )
}
Variables
{"teamID": "xyz789", "consent": false}
Response
{"data": {"consentToTeamPrivacyPolicy": false}}

createAwsAccountConfig

Use updateSandboxConfig instead
Description

Create an AWS account config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
config - AwsAccountConfigInput! The AWS account config to create

Example

Query
mutation createAwsAccountConfig($config: AwsAccountConfigInput!) {
  createAwsAccountConfig(config: $config) {
    ...TrackConfigFragment
  }
}
Variables
{"config": AwsAccountConfigInput}
Response
{
  "data": {
    "createAwsAccountConfig": {
      "id": "4",
      "version": "abc123",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

createAzureSubscriptionConfig

Use updateSandboxConfig instead
Description

Create an Azure Subscription config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
config - AzureSubscriptionConfigInput! The Azure Subscription config to create

Example

Query
mutation createAzureSubscriptionConfig($config: AzureSubscriptionConfigInput!) {
  createAzureSubscriptionConfig(config: $config) {
    ...TrackConfigFragment
  }
}
Variables
{"config": AzureSubscriptionConfigInput}
Response
{
  "data": {
    "createAzureSubscriptionConfig": {
      "id": "4",
      "version": "abc123",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

createChallenge

Description

Create a new challenge for a track

Note: you need to be a developer for this track

Response

Returns a Challenge

Arguments
Name Description
challenge - ChallengeInput! The challenge to create

Example

Query
mutation createChallenge($challenge: ChallengeInput!) {
  createChallenge(challenge: $challenge) {
    ...ChallengeFragment
  }
}
Variables
{"challenge": ChallengeInput}
Response
{
  "data": {
    "createChallenge": {
      "id": 4,
      "track": Track,
      "answers": ["abc123"],
      "assignment": "abc123",
      "attempts": [ChallengeAttempt],
      "can_check": false,
      "difficulty": "abc123",
      "index": 123,
      "notes": [ChallengeNote],
      "permalink": "xyz789",
      "scripts": [ChallengeScript],
      "slug": "abc123",
      "solution": [987],
      "hasSingleAnswer": true,
      "status": "locked",
      "tabs": [ChallengeTab],
      "teaser": "abc123",
      "timelimit": 987,
      "started": 987,
      "completed": 987,
      "failed": 123,
      "failMessage": "abc123",
      "title": "xyz789",
      "type": "challenge",
      "unlocks": Challenge,
      "labConfig": ChallengeLabConfig,
      "deletedAt": "10:15:30Z"
    }
  }
}

createChallengeNote

Description

Create a challenge note

Note: you need to be a developer for this track

Response

Returns a ChallengeNote

Arguments
Name Description
note - ChallengeNoteInput! The note to create

Example

Query
mutation createChallengeNote($note: ChallengeNoteInput!) {
  createChallengeNote(note: $note) {
    ...ChallengeNoteFragment
  }
}
Variables
{"note": ChallengeNoteInput}
Response
{
  "data": {
    "createChallengeNote": {
      "id": 4,
      "contents": "abc123",
      "index": 987,
      "type": "image",
      "url": "xyz789"
    }
  }
}

createChallengeTab

Description

Create a challenge tab

Note: you need to be a developer for this track

Response

Returns a ChallengeTab

Arguments
Name Description
tab - ChallengeTabInput! The tab to create

Example

Query
mutation createChallengeTab($tab: ChallengeTabInput!) {
  createChallengeTab(tab: $tab) {
    ...ChallengeTabFragment
  }
}
Variables
{"tab": ChallengeTabInput}
Response
{
  "data": {
    "createChallengeTab": {
      "id": "4",
      "index": 987,
      "hostname": "abc123",
      "path": "xyz789",
      "port": 123,
      "target": "xyz789",
      "title": "xyz789",
      "type": "service",
      "url": "abc123",
      "new_window": false,
      "workdir": "xyz789",
      "cmd": "abc123",
      "custom_headers": [CustomHeader],
      "custom_response_headers": [CustomHeader]
    }
  }
}

createContainerConfig

Use updateSandboxConfig instead
Description

Create a container config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
config - ContainerConfigInput! The container config to create

Example

Query
mutation createContainerConfig($config: ContainerConfigInput!) {
  createContainerConfig(config: $config) {
    ...TrackConfigFragment
  }
}
Variables
{"config": ContainerConfigInput}
Response
{
  "data": {
    "createContainerConfig": {
      "id": "4",
      "version": "xyz789",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

createGcpProjectConfig

Use updateSandboxConfig instead
Description

Create a GCP project config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
config - GcpProjectConfigInput! The gcp project config to create

Example

Query
mutation createGcpProjectConfig($config: GcpProjectConfigInput!) {
  createGcpProjectConfig(config: $config) {
    ...TrackConfigFragment
  }
}
Variables
{"config": GcpProjectConfigInput}
Response
{
  "data": {
    "createGcpProjectConfig": {
      "id": 4,
      "version": "abc123",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

createHostImage

Description

Creates a new host image

Response

Returns a HostImage!

Arguments
Name Description
input - HostImageInput!

Example

Query
mutation createHostImage($input: HostImageInput!) {
  createHostImage(input: $input) {
    ...HostImageFragment
  }
}
Variables
{"input": HostImageInput}
Response
{
  "data": {
    "createHostImage": {
      "id": "4",
      "slug": "xyz789",
      "description": "xyz789",
      "imageMetadata": ImageMetadata,
      "status": "created",
      "currentSandbox": HostImageSandbox,
      "team": Team,
      "usedInTracks": [Track],
      "usedInSandboxConfigVersions": [
        SandboxConfigVersion
      ],
      "createdAt": "10:15:30Z",
      "createdBy": User,
      "createdWith": HostImageVMInputs
    }
  }
}

createHotStartPool

Description

Create a new hot start pool

Response

Returns a HotStartPool

Arguments
Name Description
pool - HotStartPoolInput! pool to create

Example

Query
mutation createHotStartPool($pool: HotStartPoolInput!) {
  createHotStartPool(pool: $pool) {
    ...HotStartPoolFragment
  }
}
Variables
{"pool": HotStartPoolInput}
Response
{
  "data": {
    "createHotStartPool": {
      "id": 4,
      "type": "dedicated",
      "size": 123,
      "created": "10:15:30Z",
      "deleted": "10:15:30Z",
      "name": "abc123",
      "auto_refill": false,
      "starts_at": "10:15:30Z",
      "ends_at": "10:15:30Z",
      "created_by": User,
      "team": Team,
      "tracks": [HotStartPoolTrackEdge],
      "configs": [HotStartConfigTrackEdge],
      "status": "Running",
      "region": "xyz789"
    }
  }
}

createInviteAuthor

Description

Adds an author to an invite

Response

Returns a TrackInviteAuthor!

Arguments
Name Description
inviteID - ID!
userID - ID!

Example

Query
mutation createInviteAuthor(
  $inviteID: ID!,
  $userID: ID!
) {
  createInviteAuthor(
    inviteID: $inviteID,
    userID: $userID
  ) {
    ...TrackInviteAuthorFragment
  }
}
Variables
{"inviteID": 4, "userID": "4"}
Response
{"data": {"createInviteAuthor": {"id": 4, "user": User}}}

createLandingPage

Response

Returns a LandingPage!

Arguments
Name Description
input - LandingPageInput!

Example

Query
mutation createLandingPage($input: LandingPageInput!) {
  createLandingPage(input: $input) {
    ...LandingPageFragment
  }
}
Variables
{"input": LandingPageInput}
Response
{
  "data": {
    "createLandingPage": {
      "id": "4",
      "team": Team,
      "internalPageName": "abc123",
      "path": "xyz789",
      "archivedAt": "10:15:30Z",
      "publishedAt": "10:15:30Z",
      "updatedAt": "10:15:30Z",
      "trackPlayLimit": 123,
      "formEnabled": true,
      "privacyPolicyUrl": "abc123",
      "termsAndConditionsUrl": "abc123",
      "pageTitle": "xyz789",
      "seoDescription": "xyz789",
      "robotsIndexingEnabled": false,
      "backgroundColor": "abc123",
      "textColor": "xyz789",
      "logoUrl": "abc123",
      "logoLink": "xyz789",
      "pageHeading": "xyz789",
      "pageSubtitle": "abc123",
      "linkedInUrl": "xyz789",
      "xUrl": "xyz789",
      "youtubeUrl": "abc123",
      "githubUrl": "xyz789",
      "slackUrl": "abc123",
      "tracks": [LandingPageTrackEdge]
    }
  }
}

createLearningPath

No longer supported
Description

Create a new learning path

Note: you need to be a member of the organization that will own the learning path

Response

Returns a LearningPath

Arguments
Name Description
learningPath - LearningPathInput! The learning path to create

Example

Query
mutation createLearningPath($learningPath: LearningPathInput!) {
  createLearningPath(learningPath: $learningPath) {
    ...LearningPathFragment
  }
}
Variables
{"learningPath": LearningPathInput}
Response
{
  "data": {
    "createLearningPath": {
      "id": "4",
      "slug": "abc123",
      "owner": "xyz789",
      "permalink": "xyz789",
      "title": "abc123",
      "teaser": "abc123",
      "description": "xyz789",
      "image": "abc123",
      "level": "beginner",
      "published": true,
      "preview": false,
      "accessible": false,
      "courses": [Track],
      "authors": [User],
      "access_type": "purchased"
    }
  }
}

createLtiToolRegistration

Description

Add an LTI 1.3 tool

Response

Returns a LtiToolRegistration!

Arguments
Name Description
teamID - ID!
input - LtiToolRegistrationInput!

Example

Query
mutation createLtiToolRegistration(
  $teamID: ID!,
  $input: LtiToolRegistrationInput!
) {
  createLtiToolRegistration(
    teamID: $teamID,
    input: $input
  ) {
    ...LtiToolRegistrationFragment
  }
}
Variables
{
  "teamID": "4",
  "input": LtiToolRegistrationInput
}
Response
{
  "data": {
    "createLtiToolRegistration": {
      "id": "4",
      "name": "abc123",
      "teamID": "xyz789",
      "issuer": "xyz789",
      "clientID": "abc123",
      "keySetURL": "abc123",
      "publicKey": "xyz789",
      "accessTokenURL": "xyz789",
      "authURL": "xyz789",
      "deploymentIDs": ["abc123"]
    }
  }
}

createOrganization

No longer supported
Description

Create an organization

Note: you need to be an instruqt admin to call this mutation

Response

Returns an Organization

Arguments
Name Description
slug - String! Slug of the organization
name - String! Name of the organization
ownerEmails - [String!]! OwnerEmails are a list of emails that will be given the Owner role

Example

Query
mutation createOrganization(
  $slug: String!,
  $name: String!,
  $ownerEmails: [String!]!
) {
  createOrganization(
    slug: $slug,
    name: $name,
    ownerEmails: $ownerEmails
  ) {
    ...OrganizationFragment
  }
}
Variables
{
  "slug": "xyz789",
  "name": "abc123",
  "ownerEmails": ["abc123"]
}
Response
{
  "data": {
    "createOrganization": {
      "id": "4",
      "members": [OrganizationMember],
      "users": [OrganizationUserEdge],
      "name": "xyz789",
      "logo": "abc123",
      "title": "abc123",
      "subtitle": "abc123",
      "slug": "xyz789",
      "primary_link_text": "xyz789",
      "primary_link_url": "abc123",
      "secondary_link_text": "abc123",
      "secondary_link_url": "abc123",
      "api_key": "xyz789",
      "theme": OrganizationTheme,
      "personal": true,
      "features": OrganizationFeatures,
      "invited": ["abc123"],
      "invites": [OrganizationInvite],
      "privacy_policy": "abc123",
      "webhook_dashboard_url": "abc123",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z"
    }
  }
}

createSamlSsoConnection

Response

Returns a SsoConnection

Arguments
Name Description
teamID - ID!
ssoConnection - SsoSamlConnectionInput! The connection that is going to be created

Example

Query
mutation createSamlSsoConnection(
  $teamID: ID!,
  $ssoConnection: SsoSamlConnectionInput!
) {
  createSamlSsoConnection(
    teamID: $teamID,
    ssoConnection: $ssoConnection
  ) {
    ...SsoConnectionFragment
  }
}
Variables
{"teamID": 4, "ssoConnection": SsoSamlConnectionInput}
Response
{
  "data": {
    "createSamlSsoConnection": {
      "name": "xyz789",
      "organizationID": "abc123",
      "strategy": "okta",
      "options": DefaultSsoConnectionOptions
    }
  }
}

createSandboxConfig

Description

Creates a sandbox config with the given details and resources

Response

Returns a SandboxConfigVersion

Arguments
Name Description
teamID - String ID of the team
teamSlug - String Slug of the team
name - String Name of the config
slug - String Slug of the config
config - SandboxConfigInput! The config

Example

Query
mutation createSandboxConfig(
  $teamID: String,
  $teamSlug: String,
  $name: String,
  $slug: String,
  $config: SandboxConfigInput!
) {
  createSandboxConfig(
    teamID: $teamID,
    teamSlug: $teamSlug,
    name: $name,
    slug: $slug,
    config: $config
  ) {
    ...SandboxConfigVersionFragment
  }
}
Variables
{
  "teamID": "abc123",
  "teamSlug": "abc123",
  "name": "xyz789",
  "slug": "xyz789",
  "config": SandboxConfigInput
}
Response
{
  "data": {
    "createSandboxConfig": {
      "id": "4",
      "config": SandboxConfig,
      "version": 987,
      "description": "xyz789",
      "status": "draft",
      "published_at": "10:15:30Z",
      "published_by": User,
      "change_log_entry": "abc123",
      "resources": SandboxResources,
      "scripts": [SandboxScript],
      "tracks": [Track],
      "hot_start_pools": [HotStartPool]
    }
  }
}

createSsoConnection

Response

Returns a SsoConnection

Arguments
Name Description
teamID - ID!
ssoConnection - SsoConnectionInput! The connection that is going to be created

Example

Query
mutation createSsoConnection(
  $teamID: ID!,
  $ssoConnection: SsoConnectionInput!
) {
  createSsoConnection(
    teamID: $teamID,
    ssoConnection: $ssoConnection
  ) {
    ...SsoConnectionFragment
  }
}
Variables
{
  "teamID": "4",
  "ssoConnection": SsoConnectionInput
}
Response
{
  "data": {
    "createSsoConnection": {
      "name": "xyz789",
      "organizationID": "abc123",
      "strategy": "okta",
      "options": DefaultSsoConnectionOptions
    }
  }
}

createTag

Description

Creates a new tag

Response

Returns a Tag!

Arguments
Name Description
teamID - ID!
input - TagInput!

Example

Query
mutation createTag(
  $teamID: ID!,
  $input: TagInput!
) {
  createTag(
    teamID: $teamID,
    input: $input
  ) {
    ...TagFragment
  }
}
Variables
{
  "teamID": "4",
  "input": TagInput
}
Response
{
  "data": {
    "createTag": {
      "id": 4,
      "value": "abc123",
      "createdAt": "10:15:30Z",
      "tracks": [Track],
      "groups": [TagGroup]
    }
  }
}

createTagGroup

Description

Creates a new tag group

Response

Returns a TagGroup!

Arguments
Name Description
teamID - ID!
input - TagGroupInput!
tagIDs - [ID!]!

Example

Query
mutation createTagGroup(
  $teamID: ID!,
  $input: TagGroupInput!,
  $tagIDs: [ID!]!
) {
  createTagGroup(
    teamID: $teamID,
    input: $input,
    tagIDs: $tagIDs
  ) {
    ...TagGroupFragment
  }
}
Variables
{
  "teamID": 4,
  "input": TagGroupInput,
  "tagIDs": ["4"]
}
Response
{
  "data": {
    "createTagGroup": {
      "id": 4,
      "name": "xyz789",
      "createdAt": "10:15:30Z",
      "tags": [Tag]
    }
  }
}

createTeam

Description

Create a team

Note: you need to be an instruqt admin to call this mutation

Response

Returns a Team

Arguments
Name Description
slug - String! Slug of the team
name - String! Name of the team
ownerEmails - [String!]! OwnerEmails are a list of emails that will be given the Owner role

Example

Query
mutation createTeam(
  $slug: String!,
  $name: String!,
  $ownerEmails: [String!]!
) {
  createTeam(
    slug: $slug,
    name: $name,
    ownerEmails: $ownerEmails
  ) {
    ...TeamFragment
  }
}
Variables
{
  "slug": "abc123",
  "name": "xyz789",
  "ownerEmails": ["xyz789"]
}
Response
{
  "data": {
    "createTeam": {
      "id": "4",
      "members": [TeamMember],
      "users": [TeamUserEdge],
      "userInTeam": false,
      "userReportPage": UserReportPage,
      "userDetails": [UserDetails],
      "name": "abc123",
      "logo": "xyz789",
      "title": "xyz789",
      "subtitle": "abc123",
      "slug": "abc123",
      "primary_link_text": "xyz789",
      "primary_link_url": "abc123",
      "secondary_link_text": "xyz789",
      "secondary_link_url": "abc123",
      "api_key": "xyz789",
      "theme": TeamTheme,
      "themes": [TrackTheme],
      "personal": false,
      "features": TeamFeatures,
      "invited": ["abc123"],
      "invites": [TeamInvite],
      "insights": Insights,
      "tracks": [Track],
      "hotStartPools": [HotStartPool],
      "privacy_policy": "abc123",
      "webhook_dashboard_url": "abc123",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z",
      "lti_credentials": LTICredentials,
      "form": Form,
      "ssoConnection": SsoConnection,
      "tags": [Tag],
      "tagGroups": [TagGroup],
      "customResources": [CustomResource],
      "hostImages": [HostImage],
      "integrations": Integrations,
      "landingPages": [LandingPage],
      "ltiToolRegistrations": [LtiToolRegistration],
      "cloudProviderConfigs": [CloudProviderConfig],
      "githubInstallationID": 987,
      "enabledRepositories": ["xyz789"]
    }
  }
}

createTopic

Description

Create a new topic

Note: you need to be a member of the organization that will own the topic

Response

Returns a Topic

Arguments
Name Description
topic - TopicInput! The topic to create

Example

Query
mutation createTopic($topic: TopicInput!) {
  createTopic(topic: $topic) {
    ...TopicFragment
  }
}
Variables
{"topic": TopicInput}
Response
{
  "data": {
    "createTopic": {
      "id": 4,
      "permalink": "abc123",
      "description": "xyz789",
      "icon": "xyz789",
      "slug": "abc123",
      "title": "abc123",
      "tags": ["xyz789"],
      "teaser": "xyz789",
      "tracks": [Track],
      "private": true,
      "owner": "xyz789"
    }
  }
}

createTrack

Description

Create a track

Note: you need to be a member of the organization that owns the track

Response

Returns a Track

Arguments
Name Description
track - TrackInput! The track to create

Example

Query
mutation createTrack($track: TrackInput!) {
  createTrack(track: $track) {
    ...TrackFragment
  }
}
Variables
{"track": TrackInput}
Response
{
  "data": {
    "createTrack": {
      "id": 4,
      "slug": "abc123",
      "version": "abc123",
      "revision": "10:15:30Z",
      "type": "xyz789",
      "title": "xyz789",
      "teaser": "xyz789",
      "description": "xyz789",
      "icon": "xyz789",
      "level": "beginner",
      "tags": ["xyz789"],
      "trackTags": [Tag],
      "owner": "xyz789",
      "team": Team,
      "developers": [User],
      "userIsTrackDeveloper": true,
      "instructors": [TrackInstructor],
      "updated_by": User,
      "private": false,
      "published": false,
      "maintenance": true,
      "challenges": [Challenge],
      "config": TrackConfig,
      "sandboxConfig": SandboxConfigVersion,
      "trackConfig": TrackConfig,
      "status": "started",
      "started": "10:15:30Z",
      "creating": "10:15:30Z",
      "created": "10:15:30Z",
      "failed": "10:15:30Z",
      "stopped": "10:15:30Z",
      "completed": "10:15:30Z",
      "cleaned": "10:15:30Z",
      "permalink": "abc123",
      "play_limit": 123,
      "play_count": 123,
      "expiry_date": "10:15:30Z",
      "expiry_count": 987,
      "median_starttime": 987,
      "prestart": true,
      "skipping_to": Challenge,
      "scripts": [TrackScript],
      "actual_pool_size": 123,
      "show_timer": true,
      "skipping_enabled": true,
      "can_skip": false,
      "ttl": "10:15:30Z",
      "last_update": "10:15:30Z",
      "createdAt": "10:15:30Z",
      "deletedAt": "10:15:30Z",
      "learning_paths": [LearningPath],
      "accessible": false,
      "embed_token": "xyz789",
      "visibility": "unpublished",
      "trackReviews": TrackReviewConnection,
      "statistics": TrackStatistics,
      "participant": Play,
      "idle_timeout": 123,
      "studentStatistics": StudentTrackStatistics,
      "timelimit": 987,
      "lab_config": LabConfig,
      "sourceTrack": Track,
      "recommendations": ["create_notes"],
      "commits": [Commit],
      "remote_repository": "xyz789"
    }
  }
}

createTrackDeveloper

Description

Create a track developer

Note: you need to be a developer for this track

Response

Returns a Track

Arguments
Name Description
trackID - String! ID of the track
userID - String! ID of the user

Example

Query
mutation createTrackDeveloper(
  $trackID: String!,
  $userID: String!
) {
  createTrackDeveloper(
    trackID: $trackID,
    userID: $userID
  ) {
    ...TrackFragment
  }
}
Variables
{
  "trackID": "abc123",
  "userID": "xyz789"
}
Response
{
  "data": {
    "createTrackDeveloper": {
      "id": "4",
      "slug": "abc123",
      "version": "abc123",
      "revision": "10:15:30Z",
      "type": "xyz789",
      "title": "abc123",
      "teaser": "xyz789",
      "description": "abc123",
      "icon": "abc123",
      "level": "beginner",
      "tags": ["xyz789"],
      "trackTags": [Tag],
      "owner": "abc123",
      "team": Team,
      "developers": [User],
      "userIsTrackDeveloper": false,
      "instructors": [TrackInstructor],
      "updated_by": User,
      "private": false,
      "published": false,
      "maintenance": false,
      "challenges": [Challenge],
      "config": TrackConfig,
      "sandboxConfig": SandboxConfigVersion,
      "trackConfig": TrackConfig,
      "status": "started",
      "started": "10:15:30Z",
      "creating": "10:15:30Z",
      "created": "10:15:30Z",
      "failed": "10:15:30Z",
      "stopped": "10:15:30Z",
      "completed": "10:15:30Z",
      "cleaned": "10:15:30Z",
      "permalink": "abc123",
      "play_limit": 987,
      "play_count": 987,
      "expiry_date": "10:15:30Z",
      "expiry_count": 123,
      "median_starttime": 123,
      "prestart": false,
      "skipping_to": Challenge,
      "scripts": [TrackScript],
      "actual_pool_size": 123,
      "show_timer": false,
      "skipping_enabled": false,
      "can_skip": false,
      "ttl": "10:15:30Z",
      "last_update": "10:15:30Z",
      "createdAt": "10:15:30Z",
      "deletedAt": "10:15:30Z",
      "learning_paths": [LearningPath],
      "accessible": true,
      "embed_token": "abc123",
      "visibility": "unpublished",
      "trackReviews": TrackReviewConnection,
      "statistics": TrackStatistics,
      "participant": Play,
      "idle_timeout": 123,
      "studentStatistics": StudentTrackStatistics,
      "timelimit": 987,
      "lab_config": LabConfig,
      "sourceTrack": Track,
      "recommendations": ["create_notes"],
      "commits": [Commit],
      "remote_repository": "xyz789"
    }
  }
}

createTrackInstructor

Description

Add a instructor to a track

Response

Returns a TrackInstructor!

Arguments
Name Description
trackID - ID!
userID - ID!

Example

Query
mutation createTrackInstructor(
  $trackID: ID!,
  $userID: ID!
) {
  createTrackInstructor(
    trackID: $trackID,
    userID: $userID
  ) {
    ...TrackInstructorFragment
  }
}
Variables
{"trackID": "4", "userID": 4}
Response
{
  "data": {
    "createTrackInstructor": {
      "id": "4",
      "user": User
    }
  }
}

createTrackInvite

Description

Create a new track invite

Note: you need to be a member of the organization of the track the invite is for

Response

Returns a TrackInvite

Arguments
Name Description
invite - TrackInviteInput! invite to create

Example

Query
mutation createTrackInvite($invite: TrackInviteInput!) {
  createTrackInvite(invite: $invite) {
    ...TrackInviteFragment
  }
}
Variables
{"invite": TrackInviteInput}
Response
{
  "data": {
    "createTrackInvite": {
      "id": "4",
      "title": "xyz789",
      "publicTitle": "xyz789",
      "publicDescription": "abc123",
      "tracks": [Track],
      "trackEdges": [TrackInviteTrackEdge],
      "authors": [TrackInviteAuthor],
      "trackLibrary": TrackLibraryEntryConnection,
      "organization": Organization,
      "team": Team,
      "accessSetting": "anyone",
      "inviteLimit": 987,
      "inviteCount": 987,
      "claimCount": 987,
      "inviteTTL": "10:15:30Z",
      "expiresAt": "10:15:30Z",
      "startsAt": "10:15:30Z",
      "playLimit": 123,
      "playTTL": 987,
      "created": "10:15:30Z",
      "last_updated": "10:15:30Z",
      "allowAnonymous": false,
      "allowedEmailAddresses": ["xyz789"],
      "allowedEmailAddressesOnly": false,
      "currentUserAllowed": true,
      "currentUserClaim": InviteClaim,
      "currentUserClaimed": true,
      "claims": [InviteClaim],
      "activeUsers": [UserActivity],
      "plays": [InvitePlay],
      "type": "self_paced",
      "status": "active",
      "daysUntil": 123,
      "enableLearnerSharing": true,
      "canClaim": false,
      "runtimeParameters": RuntimeParameters,
      "shareMethod": "link",
      "deletedAt": "10:15:30Z"
    }
  }
}

createTrackReview

Description

Create track review.

Note: this stores track review as the currently authenticated user.

Response

Returns a TrackReview

Arguments
Name Description
input - TrackReviewInput!

Example

Query
mutation createTrackReview($input: TrackReviewInput!) {
  createTrackReview(input: $input) {
    ...TrackReviewFragment
  }
}
Variables
{"input": TrackReviewInput}
Response
{
  "data": {
    "createTrackReview": {
      "id": "4",
      "track": Track,
      "challenge": Challenge,
      "user": User,
      "play": Play,
      "created_at": "10:15:30Z",
      "updated_at": "10:15:30Z",
      "score": 123,
      "content": "xyz789"
    }
  }
}

createVirtualBrowserConfig

Use updateSandboxConfig instead
Description

Create a virtualbrowser config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
config - VirtualBrowserConfigInput! The vm config to create

Example

Query
mutation createVirtualBrowserConfig($config: VirtualBrowserConfigInput!) {
  createVirtualBrowserConfig(config: $config) {
    ...TrackConfigFragment
  }
}
Variables
{"config": VirtualBrowserConfigInput}
Response
{
  "data": {
    "createVirtualBrowserConfig": {
      "id": "4",
      "version": "abc123",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

createVirtualMachineConfig

Use updateSandboxConfig instead
Description

Create a virtualmachine config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
config - VirtualMachineConfigInput! The vm config to create

Example

Query
mutation createVirtualMachineConfig($config: VirtualMachineConfigInput!) {
  createVirtualMachineConfig(config: $config) {
    ...TrackConfigFragment
  }
}
Variables
{"config": VirtualMachineConfigInput}
Response
{
  "data": {
    "createVirtualMachineConfig": {
      "id": 4,
      "version": "abc123",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

createWebhook

Description

Create a webhook

Response

Returns a Webhook!

Arguments
Name Description
teamID - String ID of the team
teamSlug - String Slug of the team
webhook - WebhookInput! The input properties to update the webhook with

Example

Query
mutation createWebhook(
  $teamID: String,
  $teamSlug: String,
  $webhook: WebhookInput!
) {
  createWebhook(
    teamID: $teamID,
    teamSlug: $teamSlug,
    webhook: $webhook
  ) {
    ...WebhookFragment
  }
}
Variables
{
  "teamID": "xyz789",
  "teamSlug": "abc123",
  "webhook": WebhookInput
}
Response
{
  "data": {
    "createWebhook": {
      "id": 4,
      "name": "xyz789",
      "url": "xyz789",
      "created_at": "10:15:30Z",
      "updated_at": "10:15:30Z",
      "events": ["abc123"],
      "custom_headers": [CustomHeader]
    }
  }
}

deleteAwsAccountConfig

Use updateSandboxConfig instead
Description

Delete an AWS account config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
awsAccountID - String! The ID of the AWS account config to delete

Example

Query
mutation deleteAwsAccountConfig($awsAccountID: String!) {
  deleteAwsAccountConfig(awsAccountID: $awsAccountID) {
    ...TrackConfigFragment
  }
}
Variables
{"awsAccountID": "abc123"}
Response
{
  "data": {
    "deleteAwsAccountConfig": {
      "id": 4,
      "version": "xyz789",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

deleteAzureSubscriptionConfig

Use updateSandboxConfig instead
Description

Delete an Azure Subscription config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
azureSubscriptionID - String! The ID of the Azure Subscription config to delete

Example

Query
mutation deleteAzureSubscriptionConfig($azureSubscriptionID: String!) {
  deleteAzureSubscriptionConfig(azureSubscriptionID: $azureSubscriptionID) {
    ...TrackConfigFragment
  }
}
Variables
{"azureSubscriptionID": "abc123"}
Response
{
  "data": {
    "deleteAzureSubscriptionConfig": {
      "id": 4,
      "version": "abc123",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

deleteChallenge

Description

Delete a challenge from a track

Note: you need to be a developer for this track

Response

Returns a Boolean!

Arguments
Name Description
challengeID - String! ID of the challenge to delete

Example

Query
mutation deleteChallenge($challengeID: String!) {
  deleteChallenge(challengeID: $challengeID)
}
Variables
{"challengeID": "xyz789"}
Response
{"data": {"deleteChallenge": true}}

deleteChallengeNote

Description

Delete a challenge note

Note: you need to be a developer for this track

Response

Returns a Boolean!

Arguments
Name Description
noteID - String! The ID of the note to delete

Example

Query
mutation deleteChallengeNote($noteID: String!) {
  deleteChallengeNote(noteID: $noteID)
}
Variables
{"noteID": "xyz789"}
Response
{"data": {"deleteChallengeNote": false}}

deleteChallengeScript

Description

Delete a challenge script

Note: you need to be a developer for this track

Response

Returns a Boolean!

Arguments
Name Description
challengeScriptID - String! ID of the challenge script

Example

Query
mutation deleteChallengeScript($challengeScriptID: String!) {
  deleteChallengeScript(challengeScriptID: $challengeScriptID)
}
Variables
{"challengeScriptID": "xyz789"}
Response
{"data": {"deleteChallengeScript": false}}

deleteChallengeTab

Description

Delete a challenge tab

Note: you need to be a developer for this track

Response

Returns a Boolean!

Arguments
Name Description
tabID - String! ID of the tab to delete

Example

Query
mutation deleteChallengeTab($tabID: String!) {
  deleteChallengeTab(tabID: $tabID)
}
Variables
{"tabID": "xyz789"}
Response
{"data": {"deleteChallengeTab": true}}

deleteContainerConfig

Use deleteSandboxConfigHost instead
Description

Delete a container config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
containerID - String! The ID of the container config to delete

Example

Query
mutation deleteContainerConfig($containerID: String!) {
  deleteContainerConfig(containerID: $containerID) {
    ...TrackConfigFragment
  }
}
Variables
{"containerID": "abc123"}
Response
{
  "data": {
    "deleteContainerConfig": {
      "id": "4",
      "version": "xyz789",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

deleteCustomResource

Description

deletes the custom resource with the given id

Response

Returns a Boolean!

Arguments
Name Description
id - ID!

Example

Query
mutation deleteCustomResource($id: ID!) {
  deleteCustomResource(id: $id)
}
Variables
{"id": 4}
Response
{"data": {"deleteCustomResource": true}}

deleteGcpProjectConfig

Use updateSandboxConfig instead
Description

Delete a GCP project config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
gcpProjectID - String! The ID of the gcp project config to delete

Example

Query
mutation deleteGcpProjectConfig($gcpProjectID: String!) {
  deleteGcpProjectConfig(gcpProjectID: $gcpProjectID) {
    ...TrackConfigFragment
  }
}
Variables
{"gcpProjectID": "abc123"}
Response
{
  "data": {
    "deleteGcpProjectConfig": {
      "id": "4",
      "version": "xyz789",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

deleteHostImage

Description

Deletes an existing host image

Response

Returns a Boolean!

Arguments
Name Description
hostImageID - ID!

Example

Query
mutation deleteHostImage($hostImageID: ID!) {
  deleteHostImage(hostImageID: $hostImageID)
}
Variables
{"hostImageID": "4"}
Response
{"data": {"deleteHostImage": true}}

deleteHotStartPool

Description

Delete hot start pool

Response

Returns a Boolean!

Arguments
Name Description
poolID - ID! ID of hot start pool to delete

Example

Query
mutation deleteHotStartPool($poolID: ID!) {
  deleteHotStartPool(poolID: $poolID)
}
Variables
{"poolID": "4"}
Response
{"data": {"deleteHotStartPool": false}}

deleteInviteAuthor

Description

Removes an author from an invite

Response

Returns a Boolean!

Arguments
Name Description
inviteID - ID!
userID - ID!

Example

Query
mutation deleteInviteAuthor(
  $inviteID: ID!,
  $userID: ID!
) {
  deleteInviteAuthor(
    inviteID: $inviteID,
    userID: $userID
  )
}
Variables
{
  "inviteID": "4",
  "userID": "4"
}
Response
{"data": {"deleteInviteAuthor": true}}

deleteLearningPath

No longer supported
Description

Delete a learning path

Note: you need to be a member of the organization that owns the learning path

Response

Returns a Boolean!

Arguments
Name Description
learningPathID - String! Unique ID

Example

Query
mutation deleteLearningPath($learningPathID: String!) {
  deleteLearningPath(learningPathID: $learningPathID)
}
Variables
{"learningPathID": "xyz789"}
Response
{"data": {"deleteLearningPath": true}}

deleteLtiToolRegistration

Description

Delete an LTI 1.3 tool

Response

Returns a Boolean!

Arguments
Name Description
teamID - ID!
id - ID!

Example

Query
mutation deleteLtiToolRegistration(
  $teamID: ID!,
  $id: ID!
) {
  deleteLtiToolRegistration(
    teamID: $teamID,
    id: $id
  )
}
Variables
{"teamID": "4", "id": 4}
Response
{"data": {"deleteLtiToolRegistration": false}}

deleteOrganizationInvite

No longer supported
Description

Delete an organization invite

Note: you need to be a member of the organization to invite a user

Response

Returns an Organization

Arguments
Name Description
organizationID - String! ID of the organization
email - String! Email of the user

Example

Query
mutation deleteOrganizationInvite(
  $organizationID: String!,
  $email: String!
) {
  deleteOrganizationInvite(
    organizationID: $organizationID,
    email: $email
  ) {
    ...OrganizationFragment
  }
}
Variables
{
  "organizationID": "abc123",
  "email": "xyz789"
}
Response
{
  "data": {
    "deleteOrganizationInvite": {
      "id": "4",
      "members": [OrganizationMember],
      "users": [OrganizationUserEdge],
      "name": "abc123",
      "logo": "xyz789",
      "title": "xyz789",
      "subtitle": "abc123",
      "slug": "xyz789",
      "primary_link_text": "xyz789",
      "primary_link_url": "abc123",
      "secondary_link_text": "abc123",
      "secondary_link_url": "xyz789",
      "api_key": "abc123",
      "theme": OrganizationTheme,
      "personal": true,
      "features": OrganizationFeatures,
      "invited": ["xyz789"],
      "invites": [OrganizationInvite],
      "privacy_policy": "abc123",
      "webhook_dashboard_url": "xyz789",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z"
    }
  }
}

deleteSandboxConfig

Description

Deletes the given config version drafts are deleted published are archived

Response

Returns a Boolean!

Arguments
Name Description
configVersionID - String! The config version id

Example

Query
mutation deleteSandboxConfig($configVersionID: String!) {
  deleteSandboxConfig(configVersionID: $configVersionID)
}
Variables
{"configVersionID": "xyz789"}
Response
{"data": {"deleteSandboxConfig": true}}

deleteSandboxConfigHost

Response

Returns a SandboxConfigVersion

Arguments
Name Description
configID - String! The config id
hostName - String! The current name of the host

Example

Query
mutation deleteSandboxConfigHost(
  $configID: String!,
  $hostName: String!
) {
  deleteSandboxConfigHost(
    configID: $configID,
    hostName: $hostName
  ) {
    ...SandboxConfigVersionFragment
  }
}
Variables
{
  "configID": "xyz789",
  "hostName": "abc123"
}
Response
{
  "data": {
    "deleteSandboxConfigHost": {
      "id": "4",
      "config": SandboxConfig,
      "version": 987,
      "description": "abc123",
      "status": "draft",
      "published_at": "10:15:30Z",
      "published_by": User,
      "change_log_entry": "abc123",
      "resources": SandboxResources,
      "scripts": [SandboxScript],
      "tracks": [Track],
      "hot_start_pools": [HotStartPool]
    }
  }
}

deleteSsoConnection

Response

Returns a Boolean!

Arguments
Name Description
teamID - ID!
connectionName - String! The connection name that is going to be deleted

Example

Query
mutation deleteSsoConnection(
  $teamID: ID!,
  $connectionName: String!
) {
  deleteSsoConnection(
    teamID: $teamID,
    connectionName: $connectionName
  )
}
Variables
{
  "teamID": "4",
  "connectionName": "abc123"
}
Response
{"data": {"deleteSsoConnection": false}}

deleteTag

Description

Deletes a tag

Response

Returns a Boolean!

Arguments
Name Description
id - ID!

Example

Query
mutation deleteTag($id: ID!) {
  deleteTag(id: $id)
}
Variables
{"id": 4}
Response
{"data": {"deleteTag": true}}

deleteTagGroup

Description

Deletes a tag group

Response

Returns a Boolean!

Arguments
Name Description
id - ID!

Example

Query
mutation deleteTagGroup($id: ID!) {
  deleteTagGroup(id: $id)
}
Variables
{"id": 4}
Response
{"data": {"deleteTagGroup": true}}

deleteTeamGithubData

Description

Delete github data from a team

Response

Returns a Boolean!

Arguments
Name Description
teamSlug - String!

Example

Query
mutation deleteTeamGithubData($teamSlug: String!) {
  deleteTeamGithubData(teamSlug: $teamSlug)
}
Variables
{"teamSlug": "xyz789"}
Response
{"data": {"deleteTeamGithubData": true}}

deleteTeamInvite

Description

Delete a team invite

Note: you need to be a member of the team to invite a user

Response

Returns a Team

Arguments
Name Description
teamID - String! ID of the organization
email - String! Email of the user

Example

Query
mutation deleteTeamInvite(
  $teamID: String!,
  $email: String!
) {
  deleteTeamInvite(
    teamID: $teamID,
    email: $email
  ) {
    ...TeamFragment
  }
}
Variables
{
  "teamID": "abc123",
  "email": "abc123"
}
Response
{
  "data": {
    "deleteTeamInvite": {
      "id": "4",
      "members": [TeamMember],
      "users": [TeamUserEdge],
      "userInTeam": true,
      "userReportPage": UserReportPage,
      "userDetails": [UserDetails],
      "name": "abc123",
      "logo": "abc123",
      "title": "xyz789",
      "subtitle": "abc123",
      "slug": "xyz789",
      "primary_link_text": "abc123",
      "primary_link_url": "xyz789",
      "secondary_link_text": "abc123",
      "secondary_link_url": "abc123",
      "api_key": "xyz789",
      "theme": TeamTheme,
      "themes": [TrackTheme],
      "personal": false,
      "features": TeamFeatures,
      "invited": ["abc123"],
      "invites": [TeamInvite],
      "insights": Insights,
      "tracks": [Track],
      "hotStartPools": [HotStartPool],
      "privacy_policy": "xyz789",
      "webhook_dashboard_url": "abc123",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z",
      "lti_credentials": LTICredentials,
      "form": Form,
      "ssoConnection": SsoConnection,
      "tags": [Tag],
      "tagGroups": [TagGroup],
      "customResources": [CustomResource],
      "hostImages": [HostImage],
      "integrations": Integrations,
      "landingPages": [LandingPage],
      "ltiToolRegistrations": [LtiToolRegistration],
      "cloudProviderConfigs": [CloudProviderConfig],
      "githubInstallationID": 987,
      "enabledRepositories": ["abc123"]
    }
  }
}

deleteTeamSecret

Response

Returns a Boolean!

Arguments
Name Description
teamSlug - String Slug of the team
teamID - String Unique ID
name - String! The secrets name

Example

Query
mutation deleteTeamSecret(
  $teamSlug: String,
  $teamID: String,
  $name: String!
) {
  deleteTeamSecret(
    teamSlug: $teamSlug,
    teamID: $teamID,
    name: $name
  )
}
Variables
{
  "teamSlug": "abc123",
  "teamID": "xyz789",
  "name": "xyz789"
}
Response
{"data": {"deleteTeamSecret": true}}

deleteTopic

Description

Delete a topic

Note: you need to be a member of the organization that owns the topic

Response

Returns a Boolean!

Arguments
Name Description
topicID - String! Unique ID

Example

Query
mutation deleteTopic($topicID: String!) {
  deleteTopic(topicID: $topicID)
}
Variables
{"topicID": "abc123"}
Response
{"data": {"deleteTopic": false}}

deleteTrack

Description

Delete a track

Note: you need to be a developer for this track

Response

Returns a Boolean!

Arguments
Name Description
trackID - String! The track to delete

Example

Query
mutation deleteTrack($trackID: String!) {
  deleteTrack(trackID: $trackID)
}
Variables
{"trackID": "xyz789"}
Response
{"data": {"deleteTrack": true}}

deleteTrackInstructor

Description

Remove instructor from a track

Response

Returns a Boolean!

Arguments
Name Description
trackID - ID!
userID - ID!

Example

Query
mutation deleteTrackInstructor(
  $trackID: ID!,
  $userID: ID!
) {
  deleteTrackInstructor(
    trackID: $trackID,
    userID: $userID
  )
}
Variables
{
  "trackID": "4",
  "userID": "4"
}
Response
{"data": {"deleteTrackInstructor": false}}

deleteTrackInvite

Description

Delete a track invite

Deleting an invite does not delete the access to the track for users that have already accepted the invite.

Note: you need to be a member of the organization of the track the invite is for

Response

Returns a Boolean!

Arguments
Name Description
inviteID - String!

Example

Query
mutation deleteTrackInvite($inviteID: String!) {
  deleteTrackInvite(inviteID: $inviteID)
}
Variables
{"inviteID": "abc123"}
Response
{"data": {"deleteTrackInvite": true}}

deleteTrackInviteClaim

Description

Delete a track invite claim.

Response

Returns a Boolean!

Arguments
Name Description
claimID - String!

Example

Query
mutation deleteTrackInviteClaim($claimID: String!) {
  deleteTrackInviteClaim(claimID: $claimID)
}
Variables
{"claimID": "abc123"}
Response
{"data": {"deleteTrackInviteClaim": false}}

deleteUser

Description

Deletes a user

Response

Returns a Boolean!

Example

Query
mutation deleteUser {
  deleteUser
}
Response
{"data": {"deleteUser": true}}

deleteVirtualBrowserCheck

Description

Delete a virtual browser check

Response

Returns a Boolean!

Arguments
Name Description
id - String! The ID of the virtual browser check to be deleted

Example

Query
mutation deleteVirtualBrowserCheck($id: String!) {
  deleteVirtualBrowserCheck(id: $id)
}
Variables
{"id": "xyz789"}
Response
{"data": {"deleteVirtualBrowserCheck": true}}

deleteVirtualBrowserConfig

Use updateSandboxConfig instead
Description

Delete a virtualbrowser config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
virtualbrowserID - String! The ID of the vm config to delete

Example

Query
mutation deleteVirtualBrowserConfig($virtualbrowserID: String!) {
  deleteVirtualBrowserConfig(virtualbrowserID: $virtualbrowserID) {
    ...TrackConfigFragment
  }
}
Variables
{"virtualbrowserID": "abc123"}
Response
{
  "data": {
    "deleteVirtualBrowserConfig": {
      "id": "4",
      "version": "xyz789",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

deleteVirtualMachineConfig

Use deleteSandboxConfigHost instead
Description

Delete a virtualmachine config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
virtualmachineID - String! The ID of the vm config to delete

Example

Query
mutation deleteVirtualMachineConfig($virtualmachineID: String!) {
  deleteVirtualMachineConfig(virtualmachineID: $virtualmachineID) {
    ...TrackConfigFragment
  }
}
Variables
{"virtualmachineID": "abc123"}
Response
{
  "data": {
    "deleteVirtualMachineConfig": {
      "id": 4,
      "version": "abc123",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

deleteWebhook

Description

Delete a webhook

Response

Returns a Boolean!

Arguments
Name Description
id - String! The ID of the webhook to be deleted
teamID - String ID of the team
teamSlug - String Slug of the team

Example

Query
mutation deleteWebhook(
  $id: String!,
  $teamID: String,
  $teamSlug: String
) {
  deleteWebhook(
    id: $id,
    teamID: $teamID,
    teamSlug: $teamSlug
  )
}
Variables
{
  "id": "abc123",
  "teamID": "abc123",
  "teamSlug": "xyz789"
}
Response
{"data": {"deleteWebhook": false}}

generateOneTimePlayToken

Description

Generate a new one time play token for a track

Note: you need to be a developer for this track

Response

Returns a String!

Arguments
Name Description
trackID - String! ID of the track

Example

Query
mutation generateOneTimePlayToken($trackID: String!) {
  generateOneTimePlayToken(trackID: $trackID)
}
Variables
{"trackID": "abc123"}
Response
{
  "data": {
    "generateOneTimePlayToken": "xyz789"
  }
}

generateOrganizationAPIKey

No longer supported
Description

Generate an API key for an organization

Either organizationSlug or organizationID must be specified

Note: you need to be a member of the organization to generate an API key

Response

Returns a String

Arguments
Name Description
organizationID - String ID of the organization
organizationSlug - String Slug of the organization

Example

Query
mutation generateOrganizationAPIKey(
  $organizationID: String,
  $organizationSlug: String
) {
  generateOrganizationAPIKey(
    organizationID: $organizationID,
    organizationSlug: $organizationSlug
  )
}
Variables
{
  "organizationID": "xyz789",
  "organizationSlug": "abc123"
}
Response
{
  "data": {
    "generateOrganizationAPIKey": "abc123"
  }
}

generateTeamAPIKey

Description

Generate an API key for a team

Either teamSlug or teamID must be specified

Note: you need to be a member of the team to generate an API key

Response

Returns a String

Arguments
Name Description
teamID - String ID of the team
teamSlug - String Slug of the team

Example

Query
mutation generateTeamAPIKey(
  $teamID: String,
  $teamSlug: String
) {
  generateTeamAPIKey(
    teamID: $teamID,
    teamSlug: $teamSlug
  )
}
Variables
{
  "teamID": "abc123",
  "teamSlug": "abc123"
}
Response
{"data": {"generateTeamAPIKey": "xyz789"}}

generateTeamLTICredentials

Description

Generate LTI credentials for a team

Either teamSlug or teamID must be specified

Note: you need to be a member of the team to generate an API key

Response

Returns an LTICredentials

Arguments
Name Description
teamID - String ID of the team
teamSlug - String Slug of the team

Example

Query
mutation generateTeamLTICredentials(
  $teamID: String,
  $teamSlug: String
) {
  generateTeamLTICredentials(
    teamID: $teamID,
    teamSlug: $teamSlug
  ) {
    ...LTICredentialsFragment
  }
}
Variables
{
  "teamID": "xyz789",
  "teamSlug": "abc123"
}
Response
{
  "data": {
    "generateTeamLTICredentials": {
      "id": 4,
      "consumer_name": "xyz789",
      "consumer_key": "abc123",
      "instruqt_public_key": "xyz789",
      "instruqt_public_key_set_url": "abc123",
      "instruqt_login_url": "abc123"
    }
  }
}

generateTrackEmbedToken

Description

Generate a new embed token for a track

Note: you need to be a developer for this track

Response

Returns a Track

Arguments
Name Description
trackID - String! ID of the track

Example

Query
mutation generateTrackEmbedToken($trackID: String!) {
  generateTrackEmbedToken(trackID: $trackID) {
    ...TrackFragment
  }
}
Variables
{"trackID": "xyz789"}
Response
{
  "data": {
    "generateTrackEmbedToken": {
      "id": "4",
      "slug": "xyz789",
      "version": "xyz789",
      "revision": "10:15:30Z",
      "type": "xyz789",
      "title": "abc123",
      "teaser": "xyz789",
      "description": "abc123",
      "icon": "xyz789",
      "level": "beginner",
      "tags": ["abc123"],
      "trackTags": [Tag],
      "owner": "abc123",
      "team": Team,
      "developers": [User],
      "userIsTrackDeveloper": true,
      "instructors": [TrackInstructor],
      "updated_by": User,
      "private": false,
      "published": false,
      "maintenance": false,
      "challenges": [Challenge],
      "config": TrackConfig,
      "sandboxConfig": SandboxConfigVersion,
      "trackConfig": TrackConfig,
      "status": "started",
      "started": "10:15:30Z",
      "creating": "10:15:30Z",
      "created": "10:15:30Z",
      "failed": "10:15:30Z",
      "stopped": "10:15:30Z",
      "completed": "10:15:30Z",
      "cleaned": "10:15:30Z",
      "permalink": "abc123",
      "play_limit": 987,
      "play_count": 123,
      "expiry_date": "10:15:30Z",
      "expiry_count": 123,
      "median_starttime": 123,
      "prestart": false,
      "skipping_to": Challenge,
      "scripts": [TrackScript],
      "actual_pool_size": 987,
      "show_timer": true,
      "skipping_enabled": false,
      "can_skip": false,
      "ttl": "10:15:30Z",
      "last_update": "10:15:30Z",
      "createdAt": "10:15:30Z",
      "deletedAt": "10:15:30Z",
      "learning_paths": [LearningPath],
      "accessible": true,
      "embed_token": "abc123",
      "visibility": "unpublished",
      "trackReviews": TrackReviewConnection,
      "statistics": TrackStatistics,
      "participant": Play,
      "idle_timeout": 123,
      "studentStatistics": StudentTrackStatistics,
      "timelimit": 123,
      "lab_config": LabConfig,
      "sourceTrack": Track,
      "recommendations": ["create_notes"],
      "commits": [Commit],
      "remote_repository": "xyz789"
    }
  }
}

importTerraformModule

Description

Imports a terraform module with the given ID into the given team

Response

Returns a CustomResource!

Arguments
Name Description
teamID - String
teamSlug - String
input - ImportTerraformModuleInput!

Example

Query
mutation importTerraformModule(
  $teamID: String,
  $teamSlug: String,
  $input: ImportTerraformModuleInput!
) {
  importTerraformModule(
    teamID: $teamID,
    teamSlug: $teamSlug,
    input: $input
  ) {
    ...CustomResourceFragment
  }
}
Variables
{
  "teamID": "xyz789",
  "teamSlug": "abc123",
  "input": ImportTerraformModuleInput
}
Response
{
  "data": {
    "importTerraformModule": {
      "id": "4",
      "name": "abc123",
      "slug": "xyz789",
      "description": "xyz789",
      "version": "abc123",
      "logo": "abc123",
      "provider": "terraform",
      "canDelete": false,
      "terraformModule": TerraformModule,
      "inputs": [CustomResourceInput],
      "outputs": [CustomResourceOutput],
      "createdAt": "10:15:30Z",
      "createdBy": User
    }
  }
}

inviteLinkCopied

Description

Invite link copied

Response

Returns a Boolean!

Arguments
Name Description
inviteID - String! ID of the invite
teamID - String! Team ID of the invite

Example

Query
mutation inviteLinkCopied(
  $inviteID: String!,
  $teamID: String!
) {
  inviteLinkCopied(
    inviteID: $inviteID,
    teamID: $teamID
  )
}
Variables
{
  "inviteID": "abc123",
  "teamID": "abc123"
}
Response
{"data": {"inviteLinkCopied": false}}

inviteOrganizationUser

No longer supported
Description

Invite a user to an organization

Note: you need to be a member of the organization to invite a user

Response

Returns an Organization

Arguments
Name Description
organizationID - String! ID of the organization
userID - String ID of the user
email - String Email of the user
role - RoleName Role of the user within the organization

Example

Query
mutation inviteOrganizationUser(
  $organizationID: String!,
  $userID: String,
  $email: String,
  $role: RoleName
) {
  inviteOrganizationUser(
    organizationID: $organizationID,
    userID: $userID,
    email: $email,
    role: $role
  ) {
    ...OrganizationFragment
  }
}
Variables
{
  "organizationID": "xyz789",
  "userID": "xyz789",
  "email": "abc123",
  "role": "owner"
}
Response
{
  "data": {
    "inviteOrganizationUser": {
      "id": "4",
      "members": [OrganizationMember],
      "users": [OrganizationUserEdge],
      "name": "xyz789",
      "logo": "xyz789",
      "title": "xyz789",
      "subtitle": "abc123",
      "slug": "xyz789",
      "primary_link_text": "abc123",
      "primary_link_url": "abc123",
      "secondary_link_text": "xyz789",
      "secondary_link_url": "abc123",
      "api_key": "xyz789",
      "theme": OrganizationTheme,
      "personal": true,
      "features": OrganizationFeatures,
      "invited": ["abc123"],
      "invites": [OrganizationInvite],
      "privacy_policy": "xyz789",
      "webhook_dashboard_url": "xyz789",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z"
    }
  }
}

inviteTeamUser

Description

Invite a user to a team

Note: you need to be a member of the team to invite a user

Response

Returns a Team

Arguments
Name Description
teamID - String! ID of the team
userID - String ID of the user
email - String Email of the user
role - RoleName Role of the user within the team

Example

Query
mutation inviteTeamUser(
  $teamID: String!,
  $userID: String,
  $email: String,
  $role: RoleName
) {
  inviteTeamUser(
    teamID: $teamID,
    userID: $userID,
    email: $email,
    role: $role
  ) {
    ...TeamFragment
  }
}
Variables
{
  "teamID": "xyz789",
  "userID": "xyz789",
  "email": "xyz789",
  "role": "owner"
}
Response
{
  "data": {
    "inviteTeamUser": {
      "id": 4,
      "members": [TeamMember],
      "users": [TeamUserEdge],
      "userInTeam": true,
      "userReportPage": UserReportPage,
      "userDetails": [UserDetails],
      "name": "xyz789",
      "logo": "abc123",
      "title": "abc123",
      "subtitle": "abc123",
      "slug": "xyz789",
      "primary_link_text": "abc123",
      "primary_link_url": "xyz789",
      "secondary_link_text": "xyz789",
      "secondary_link_url": "xyz789",
      "api_key": "abc123",
      "theme": TeamTheme,
      "themes": [TrackTheme],
      "personal": false,
      "features": TeamFeatures,
      "invited": ["abc123"],
      "invites": [TeamInvite],
      "insights": Insights,
      "tracks": [Track],
      "hotStartPools": [HotStartPool],
      "privacy_policy": "xyz789",
      "webhook_dashboard_url": "abc123",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z",
      "lti_credentials": LTICredentials,
      "form": Form,
      "ssoConnection": SsoConnection,
      "tags": [Tag],
      "tagGroups": [TagGroup],
      "customResources": [CustomResource],
      "hostImages": [HostImage],
      "integrations": Integrations,
      "landingPages": [LandingPage],
      "ltiToolRegistrations": [LtiToolRegistration],
      "cloudProviderConfigs": [CloudProviderConfig],
      "githubInstallationID": 987,
      "enabledRepositories": ["xyz789"]
    }
  }
}

keepAlive

Description

Notify the track idle service that a participant is still active

Response

Returns a Boolean!

Arguments
Name Description
trackID - ID! ID of the track user is currently using

Example

Query
mutation keepAlive($trackID: ID!) {
  keepAlive(trackID: $trackID)
}
Variables
{"trackID": "4"}
Response
{"data": {"keepAlive": false}}

login

This function is no longer required and is a no-op
Description

Login the user identified by the token in the Authorization Header

Response

Returns a User

Arguments
Name Description
inviteToken - String An (optional) team invite token to claim.

Example

Query
mutation login($inviteToken: String) {
  login(inviteToken: $inviteToken) {
    ...UserFragment
  }
}
Variables
{"inviteToken": "abc123"}
Response
{
  "data": {
    "login": {
      "id": 4,
      "profile": UserProfile,
      "details": UserDetails,
      "organizations": [UserOrganizationEdge],
      "teams": [UserTeamEdge],
      "is_anonymous": false,
      "is_global_admin": false,
      "segments": ["instruqt_employee"],
      "claims": [InviteClaim],
      "accessibleTracks": [Track],
      "reportItem": UserReportItem
    }
  }
}

mergeAnonymousUser

Description

Merge a anonymous account into a registered account

Note: should be called by a logged in user

Response

Returns a Boolean!

Arguments
Name Description
token - String! Token of the anonymous user

Example

Query
mutation mergeAnonymousUser($token: String!) {
  mergeAnonymousUser(token: $token)
}
Variables
{"token": "xyz789"}
Response
{"data": {"mergeAnonymousUser": false}}

publishSandboxConfig

Description

Publish publishes the draft version for the given configID

Response

Returns a SandboxConfigVersion

Arguments
Name Description
configID - String! The config id
changeLogEntry - String The config id

Example

Query
mutation publishSandboxConfig(
  $configID: String!,
  $changeLogEntry: String
) {
  publishSandboxConfig(
    configID: $configID,
    changeLogEntry: $changeLogEntry
  ) {
    ...SandboxConfigVersionFragment
  }
}
Variables
{
  "configID": "abc123",
  "changeLogEntry": "xyz789"
}
Response
{
  "data": {
    "publishSandboxConfig": {
      "id": 4,
      "config": SandboxConfig,
      "version": 123,
      "description": "xyz789",
      "status": "draft",
      "published_at": "10:15:30Z",
      "published_by": User,
      "change_log_entry": "abc123",
      "resources": SandboxResources,
      "scripts": [SandboxScript],
      "tracks": [Track],
      "hot_start_pools": [HotStartPool]
    }
  }
}

refreshToken

Description

Refresh an ID token using the given refeshtoken

Response

Returns a SecureToken

Arguments
Name Description
refreshToken - String! Refresh token

Example

Query
mutation refreshToken($refreshToken: String!) {
  refreshToken(refreshToken: $refreshToken) {
    ...SecureTokenFragment
  }
}
Variables
{"refreshToken": "xyz789"}
Response
{
  "data": {
    "refreshToken": {
      "userID": "xyz789",
      "idToken": "xyz789",
      "refreshToken": "abc123"
    }
  }
}

removeOrganizationUser

No longer supported
Description

Remove a user from an organization

Note: you need to be a member of the organization to remove a user

Response

Returns an Organization

Arguments
Name Description
organizationID - String! ID of the organization
userID - String! ID of the user

Example

Query
mutation removeOrganizationUser(
  $organizationID: String!,
  $userID: String!
) {
  removeOrganizationUser(
    organizationID: $organizationID,
    userID: $userID
  ) {
    ...OrganizationFragment
  }
}
Variables
{
  "organizationID": "abc123",
  "userID": "abc123"
}
Response
{
  "data": {
    "removeOrganizationUser": {
      "id": 4,
      "members": [OrganizationMember],
      "users": [OrganizationUserEdge],
      "name": "xyz789",
      "logo": "xyz789",
      "title": "abc123",
      "subtitle": "xyz789",
      "slug": "xyz789",
      "primary_link_text": "abc123",
      "primary_link_url": "xyz789",
      "secondary_link_text": "abc123",
      "secondary_link_url": "abc123",
      "api_key": "abc123",
      "theme": OrganizationTheme,
      "personal": false,
      "features": OrganizationFeatures,
      "invited": ["abc123"],
      "invites": [OrganizationInvite],
      "privacy_policy": "abc123",
      "webhook_dashboard_url": "abc123",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z"
    }
  }
}

removeTeamUser

Description

Remove a user from a team

Note: you need to be a member of the team to remove a user

Response

Returns a Team

Arguments
Name Description
teamID - String! ID of the team
userID - String! ID of the user

Example

Query
mutation removeTeamUser(
  $teamID: String!,
  $userID: String!
) {
  removeTeamUser(
    teamID: $teamID,
    userID: $userID
  ) {
    ...TeamFragment
  }
}
Variables
{
  "teamID": "abc123",
  "userID": "abc123"
}
Response
{
  "data": {
    "removeTeamUser": {
      "id": 4,
      "members": [TeamMember],
      "users": [TeamUserEdge],
      "userInTeam": true,
      "userReportPage": UserReportPage,
      "userDetails": [UserDetails],
      "name": "abc123",
      "logo": "xyz789",
      "title": "xyz789",
      "subtitle": "xyz789",
      "slug": "xyz789",
      "primary_link_text": "abc123",
      "primary_link_url": "xyz789",
      "secondary_link_text": "xyz789",
      "secondary_link_url": "xyz789",
      "api_key": "abc123",
      "theme": TeamTheme,
      "themes": [TrackTheme],
      "personal": true,
      "features": TeamFeatures,
      "invited": ["abc123"],
      "invites": [TeamInvite],
      "insights": Insights,
      "tracks": [Track],
      "hotStartPools": [HotStartPool],
      "privacy_policy": "xyz789",
      "webhook_dashboard_url": "xyz789",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z",
      "lti_credentials": LTICredentials,
      "form": Form,
      "ssoConnection": SsoConnection,
      "tags": [Tag],
      "tagGroups": [TagGroup],
      "customResources": [CustomResource],
      "hostImages": [HostImage],
      "integrations": Integrations,
      "landingPages": [LandingPage],
      "ltiToolRegistrations": [LtiToolRegistration],
      "cloudProviderConfigs": [CloudProviderConfig],
      "githubInstallationID": 987,
      "enabledRepositories": ["abc123"]
    }
  }
}

removeTrackDeveloper

Description

Remove a track developer

Note: you need to be a developer for this track

Response

Returns a Boolean!

Arguments
Name Description
trackID - String! ID of the track
userID - String! ID of the user

Example

Query
mutation removeTrackDeveloper(
  $trackID: String!,
  $userID: String!
) {
  removeTrackDeveloper(
    trackID: $trackID,
    userID: $userID
  )
}
Variables
{
  "trackID": "abc123",
  "userID": "xyz789"
}
Response
{"data": {"removeTrackDeveloper": false}}

removeTrackFromTopic

Description

Remove a track from a topic

Note: you need to be a member of the organization that owns the track and topic

Response

Returns a Topic

Arguments
Name Description
trackID - String! ID of the track
topicID - String! ID of the topic

Example

Query
mutation removeTrackFromTopic(
  $trackID: String!,
  $topicID: String!
) {
  removeTrackFromTopic(
    trackID: $trackID,
    topicID: $topicID
  ) {
    ...TopicFragment
  }
}
Variables
{
  "trackID": "abc123",
  "topicID": "xyz789"
}
Response
{
  "data": {
    "removeTrackFromTopic": {
      "id": "4",
      "permalink": "xyz789",
      "description": "xyz789",
      "icon": "abc123",
      "slug": "abc123",
      "title": "abc123",
      "tags": ["abc123"],
      "teaser": "xyz789",
      "tracks": [Track],
      "private": false,
      "owner": "xyz789"
    }
  }
}

renameSandboxConfig

Description

Renames a sandbox config with the given id

Response

Returns a SandboxConfig

Arguments
Name Description
configID - String! The config id
name - String! Name of the config

Example

Query
mutation renameSandboxConfig(
  $configID: String!,
  $name: String!
) {
  renameSandboxConfig(
    configID: $configID,
    name: $name
  ) {
    ...SandboxConfigFragment
  }
}
Variables
{
  "configID": "xyz789",
  "name": "abc123"
}
Response
{
  "data": {
    "renameSandboxConfig": {
      "id": "4",
      "name": "abc123",
      "slug": "abc123",
      "version": 987,
      "deleted": "10:15:30Z"
    }
  }
}

renameSandboxConfigHost

Response

Returns a SandboxConfigVersion

Arguments
Name Description
configID - String! The config id
hostName - String! The current name of the host
newName - String! The new name of the host

Example

Query
mutation renameSandboxConfigHost(
  $configID: String!,
  $hostName: String!,
  $newName: String!
) {
  renameSandboxConfigHost(
    configID: $configID,
    hostName: $hostName,
    newName: $newName
  ) {
    ...SandboxConfigVersionFragment
  }
}
Variables
{
  "configID": "abc123",
  "hostName": "xyz789",
  "newName": "xyz789"
}
Response
{
  "data": {
    "renameSandboxConfigHost": {
      "id": 4,
      "config": SandboxConfig,
      "version": 987,
      "description": "abc123",
      "status": "draft",
      "published_at": "10:15:30Z",
      "published_by": User,
      "change_log_entry": "xyz789",
      "resources": SandboxResources,
      "scripts": [SandboxScript],
      "tracks": [Track],
      "hot_start_pools": [HotStartPool]
    }
  }
}

saveChallengeScript

Description

Save a challenge script

Note: you need to be a developer for this track

Response

Returns a ChallengeScript

Arguments
Name Description
base64Encoded - Boolean If the content is base64 encoded
script - ChallengeScriptInput! The challenge script to save

Example

Query
mutation saveChallengeScript(
  $base64Encoded: Boolean,
  $script: ChallengeScriptInput!
) {
  saveChallengeScript(
    base64Encoded: $base64Encoded,
    script: $script
  ) {
    ...ChallengeScriptFragment
  }
}
Variables
{"base64Encoded": false, "script": ChallengeScriptInput}
Response
{
  "data": {
    "saveChallengeScript": {
      "id": "4",
      "action": "xyz789",
      "contents": "abc123",
      "host": "xyz789"
    }
  }
}

saveHostImage

Description

Saves a host image

Response

Returns a HostImage!

Arguments
Name Description
hostImageID - ID!
sandboxID - ID!

Example

Query
mutation saveHostImage(
  $hostImageID: ID!,
  $sandboxID: ID!
) {
  saveHostImage(
    hostImageID: $hostImageID,
    sandboxID: $sandboxID
  ) {
    ...HostImageFragment
  }
}
Variables
{"hostImageID": 4, "sandboxID": 4}
Response
{
  "data": {
    "saveHostImage": {
      "id": "4",
      "slug": "xyz789",
      "description": "abc123",
      "imageMetadata": ImageMetadata,
      "status": "created",
      "currentSandbox": HostImageSandbox,
      "team": Team,
      "usedInTracks": [Track],
      "usedInSandboxConfigVersions": [
        SandboxConfigVersion
      ],
      "createdAt": "10:15:30Z",
      "createdBy": User,
      "createdWith": HostImageVMInputs
    }
  }
}

saveTrackPlayLimit

Description

Set a track play limit

This sets a limit how many times a public track can be played. You can use this to prevent excessive charges to your account.

Note: you have to be a developer for this track

Response

Returns a Track

Arguments
Name Description
trackID - String! ID of the track
organizationID - String! ID of the organization
limit - Int! Total number of public plays the track can be played

Example

Query
mutation saveTrackPlayLimit(
  $trackID: String!,
  $organizationID: String!,
  $limit: Int!
) {
  saveTrackPlayLimit(
    trackID: $trackID,
    organizationID: $organizationID,
    limit: $limit
  ) {
    ...TrackFragment
  }
}
Variables
{
  "trackID": "xyz789",
  "organizationID": "abc123",
  "limit": 987
}
Response
{
  "data": {
    "saveTrackPlayLimit": {
      "id": 4,
      "slug": "xyz789",
      "version": "abc123",
      "revision": "10:15:30Z",
      "type": "xyz789",
      "title": "xyz789",
      "teaser": "xyz789",
      "description": "abc123",
      "icon": "xyz789",
      "level": "beginner",
      "tags": ["xyz789"],
      "trackTags": [Tag],
      "owner": "abc123",
      "team": Team,
      "developers": [User],
      "userIsTrackDeveloper": true,
      "instructors": [TrackInstructor],
      "updated_by": User,
      "private": true,
      "published": false,
      "maintenance": true,
      "challenges": [Challenge],
      "config": TrackConfig,
      "sandboxConfig": SandboxConfigVersion,
      "trackConfig": TrackConfig,
      "status": "started",
      "started": "10:15:30Z",
      "creating": "10:15:30Z",
      "created": "10:15:30Z",
      "failed": "10:15:30Z",
      "stopped": "10:15:30Z",
      "completed": "10:15:30Z",
      "cleaned": "10:15:30Z",
      "permalink": "xyz789",
      "play_limit": 987,
      "play_count": 987,
      "expiry_date": "10:15:30Z",
      "expiry_count": 987,
      "median_starttime": 123,
      "prestart": true,
      "skipping_to": Challenge,
      "scripts": [TrackScript],
      "actual_pool_size": 987,
      "show_timer": false,
      "skipping_enabled": false,
      "can_skip": false,
      "ttl": "10:15:30Z",
      "last_update": "10:15:30Z",
      "createdAt": "10:15:30Z",
      "deletedAt": "10:15:30Z",
      "learning_paths": [LearningPath],
      "accessible": false,
      "embed_token": "abc123",
      "visibility": "unpublished",
      "trackReviews": TrackReviewConnection,
      "statistics": TrackStatistics,
      "participant": Play,
      "idle_timeout": 987,
      "studentStatistics": StudentTrackStatistics,
      "timelimit": 123,
      "lab_config": LabConfig,
      "sourceTrack": Track,
      "recommendations": ["create_notes"],
      "commits": [Commit],
      "remote_repository": "abc123"
    }
  }
}

saveTrackPlayLimits

Description

Set th track play limits for the given track and team

Note: if the track ID is not specified the limits will apply globally for all tracks

Response

Returns [TrackPlayLimit!]!

Arguments
Name Description
trackID - String ID of the track
teamID - String ID of the team
teamSlug - String Slug of the team
trackPlayLimits - TrackPlayLimitInput! The configured limits

Example

Query
mutation saveTrackPlayLimits(
  $trackID: String,
  $teamID: String,
  $teamSlug: String,
  $trackPlayLimits: TrackPlayLimitInput!
) {
  saveTrackPlayLimits(
    trackID: $trackID,
    teamID: $teamID,
    teamSlug: $teamSlug,
    trackPlayLimits: $trackPlayLimits
  ) {
    ...TrackPlayLimitFragment
  }
}
Variables
{
  "trackID": "abc123",
  "teamID": "xyz789",
  "teamSlug": "xyz789",
  "trackPlayLimits": TrackPlayLimitInput
}
Response
{
  "data": {
    "saveTrackPlayLimits": [
      {
        "track": Track,
        "rollingMonth": 123,
        "rollingIPAddressPerHour": 123,
        "calendarMonth": 987,
        "concurrentPlaysPerIP": 123
      }
    ]
  }
}

saveTrackScript

Description

Save a track script

Note: you need to be a developer for this track

Response

Returns a TrackScript

Arguments
Name Description
base64Encoded - Boolean If the content is base64 encoded
script - TrackScriptInput! The challenge script to save

Example

Query
mutation saveTrackScript(
  $base64Encoded: Boolean,
  $script: TrackScriptInput!
) {
  saveTrackScript(
    base64Encoded: $base64Encoded,
    script: $script
  ) {
    ...TrackScriptFragment
  }
}
Variables
{"base64Encoded": false, "script": TrackScriptInput}
Response
{
  "data": {
    "saveTrackScript": {
      "id": 4,
      "action": "xyz789",
      "contents": "abc123",
      "host": "xyz789"
    }
  }
}

setInstructorRole

Description

Promote or demote a user within a team.

Response

Returns a Team

Arguments
Name Description
teamID - String! ID of the team
userID - String! ID of the user to promote/demote
trackIDs - [ID!]! Tracks to be removed from developer and granted access to as instructor

Example

Query
mutation setInstructorRole(
  $teamID: String!,
  $userID: String!,
  $trackIDs: [ID!]!
) {
  setInstructorRole(
    teamID: $teamID,
    userID: $userID,
    trackIDs: $trackIDs
  ) {
    ...TeamFragment
  }
}
Variables
{
  "teamID": "xyz789",
  "userID": "abc123",
  "trackIDs": [4]
}
Response
{
  "data": {
    "setInstructorRole": {
      "id": "4",
      "members": [TeamMember],
      "users": [TeamUserEdge],
      "userInTeam": true,
      "userReportPage": UserReportPage,
      "userDetails": [UserDetails],
      "name": "xyz789",
      "logo": "abc123",
      "title": "xyz789",
      "subtitle": "xyz789",
      "slug": "abc123",
      "primary_link_text": "xyz789",
      "primary_link_url": "xyz789",
      "secondary_link_text": "xyz789",
      "secondary_link_url": "xyz789",
      "api_key": "xyz789",
      "theme": TeamTheme,
      "themes": [TrackTheme],
      "personal": true,
      "features": TeamFeatures,
      "invited": ["abc123"],
      "invites": [TeamInvite],
      "insights": Insights,
      "tracks": [Track],
      "hotStartPools": [HotStartPool],
      "privacy_policy": "xyz789",
      "webhook_dashboard_url": "xyz789",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z",
      "lti_credentials": LTICredentials,
      "form": Form,
      "ssoConnection": SsoConnection,
      "tags": [Tag],
      "tagGroups": [TagGroup],
      "customResources": [CustomResource],
      "hostImages": [HostImage],
      "integrations": Integrations,
      "landingPages": [LandingPage],
      "ltiToolRegistrations": [LtiToolRegistration],
      "cloudProviderConfigs": [CloudProviderConfig],
      "githubInstallationID": 987,
      "enabledRepositories": ["abc123"]
    }
  }
}

setInstructorTracks

Description

Add instructor to multiple tracks

Response

Returns [TrackInstructor!]!

Arguments
Name Description
userID - ID!
trackIDs - [ID!]!

Example

Query
mutation setInstructorTracks(
  $userID: ID!,
  $trackIDs: [ID!]!
) {
  setInstructorTracks(
    userID: $userID,
    trackIDs: $trackIDs
  ) {
    ...TrackInstructorFragment
  }
}
Variables
{"userID": 4, "trackIDs": [4]}
Response
{
  "data": {
    "setInstructorTracks": [{"id": 4, "user": User}]
  }
}

setSandboxVariable

Description

Set runtime variable value to sandbox host

Response

Returns a SandboxVariable

Arguments
Name Description
key - String! Unique key to register the value, case insensitive
value - String! Value for a given key
hostname - String! Hostname to set value for
sandboxID - String! Sandbox id to set value for

Example

Query
mutation setSandboxVariable(
  $key: String!,
  $value: String!,
  $hostname: String!,
  $sandboxID: String!
) {
  setSandboxVariable(
    key: $key,
    value: $value,
    hostname: $hostname,
    sandboxID: $sandboxID
  ) {
    ...SandboxVariableFragment
  }
}
Variables
{
  "key": "abc123",
  "value": "xyz789",
  "hostname": "xyz789",
  "sandboxID": "abc123"
}
Response
{
  "data": {
    "setSandboxVariable": {
      "key": "xyz789",
      "value": "abc123"
    }
  }
}

setTeamGithubInstallationID

Description

Adds github installation ID to a team

Response

Returns a Boolean!

Arguments
Name Description
teamSlug - String!
installationID - String!

Example

Query
mutation setTeamGithubInstallationID(
  $teamSlug: String!,
  $installationID: String!
) {
  setTeamGithubInstallationID(
    teamSlug: $teamSlug,
    installationID: $installationID
  )
}
Variables
{
  "teamSlug": "abc123",
  "installationID": "abc123"
}
Response
{"data": {"setTeamGithubInstallationID": true}}

setTrackMaintenance

Description

Set maintenance flag for a track

Note: you need to be a developer for this track

Response

Returns a Track

Arguments
Name Description
trackID - String! ID of the track
maintenance - Boolean! Maintenance flag

Example

Query
mutation setTrackMaintenance(
  $trackID: String!,
  $maintenance: Boolean!
) {
  setTrackMaintenance(
    trackID: $trackID,
    maintenance: $maintenance
  ) {
    ...TrackFragment
  }
}
Variables
{"trackID": "abc123", "maintenance": true}
Response
{
  "data": {
    "setTrackMaintenance": {
      "id": "4",
      "slug": "xyz789",
      "version": "xyz789",
      "revision": "10:15:30Z",
      "type": "abc123",
      "title": "xyz789",
      "teaser": "xyz789",
      "description": "xyz789",
      "icon": "abc123",
      "level": "beginner",
      "tags": ["abc123"],
      "trackTags": [Tag],
      "owner": "abc123",
      "team": Team,
      "developers": [User],
      "userIsTrackDeveloper": false,
      "instructors": [TrackInstructor],
      "updated_by": User,
      "private": false,
      "published": false,
      "maintenance": true,
      "challenges": [Challenge],
      "config": TrackConfig,
      "sandboxConfig": SandboxConfigVersion,
      "trackConfig": TrackConfig,
      "status": "started",
      "started": "10:15:30Z",
      "creating": "10:15:30Z",
      "created": "10:15:30Z",
      "failed": "10:15:30Z",
      "stopped": "10:15:30Z",
      "completed": "10:15:30Z",
      "cleaned": "10:15:30Z",
      "permalink": "xyz789",
      "play_limit": 987,
      "play_count": 123,
      "expiry_date": "10:15:30Z",
      "expiry_count": 987,
      "median_starttime": 123,
      "prestart": true,
      "skipping_to": Challenge,
      "scripts": [TrackScript],
      "actual_pool_size": 123,
      "show_timer": false,
      "skipping_enabled": true,
      "can_skip": true,
      "ttl": "10:15:30Z",
      "last_update": "10:15:30Z",
      "createdAt": "10:15:30Z",
      "deletedAt": "10:15:30Z",
      "learning_paths": [LearningPath],
      "accessible": true,
      "embed_token": "abc123",
      "visibility": "unpublished",
      "trackReviews": TrackReviewConnection,
      "statistics": TrackStatistics,
      "participant": Play,
      "idle_timeout": 987,
      "studentStatistics": StudentTrackStatistics,
      "timelimit": 123,
      "lab_config": LabConfig,
      "sourceTrack": Track,
      "recommendations": ["create_notes"],
      "commits": [Commit],
      "remote_repository": "xyz789"
    }
  }
}

setTrackSandboxConfigVersion

Response

Returns a Boolean!

Arguments
Name Description
trackID - String!
configVersionID - String

Example

Query
mutation setTrackSandboxConfigVersion(
  $trackID: String!,
  $configVersionID: String
) {
  setTrackSandboxConfigVersion(
    trackID: $trackID,
    configVersionID: $configVersionID
  )
}
Variables
{
  "trackID": "abc123",
  "configVersionID": "abc123"
}
Response
{"data": {"setTrackSandboxConfigVersion": true}}

setupChallenge

Description

Runs the setup script for a challenge

Response

Returns a Challenge

Arguments
Name Description
challengeID - String! ID of the challenge

Example

Query
mutation setupChallenge($challengeID: String!) {
  setupChallenge(challengeID: $challengeID) {
    ...ChallengeFragment
  }
}
Variables
{"challengeID": "xyz789"}
Response
{
  "data": {
    "setupChallenge": {
      "id": 4,
      "track": Track,
      "answers": ["abc123"],
      "assignment": "xyz789",
      "attempts": [ChallengeAttempt],
      "can_check": false,
      "difficulty": "abc123",
      "index": 987,
      "notes": [ChallengeNote],
      "permalink": "xyz789",
      "scripts": [ChallengeScript],
      "slug": "abc123",
      "solution": [987],
      "hasSingleAnswer": false,
      "status": "locked",
      "tabs": [ChallengeTab],
      "teaser": "abc123",
      "timelimit": 987,
      "started": 123,
      "completed": 987,
      "failed": 123,
      "failMessage": "abc123",
      "title": "xyz789",
      "type": "challenge",
      "unlocks": Challenge,
      "labConfig": ChallengeLabConfig,
      "deletedAt": "10:15:30Z"
    }
  }
}

signInAnonymously

Description

Sign in anonymously, returns an ID token

Response

Returns a SecureToken

Example

Query
mutation signInAnonymously {
  signInAnonymously {
    ...SecureTokenFragment
  }
}
Response
{
  "data": {
    "signInAnonymously": {
      "userID": "xyz789",
      "idToken": "xyz789",
      "refreshToken": "abc123"
    }
  }
}

skipChallenge

Description

Skip a specific challenge of a track

Response

Returns a Challenge

Arguments
Name Description
trackID - String! ID of the track
challengeID - String! ID of the challenge you want to skip to
userID - String ID of the user being impersonated
inviteID - String ID of the invite for the user being impersonated

Example

Query
mutation skipChallenge(
  $trackID: String!,
  $challengeID: String!,
  $userID: String,
  $inviteID: String
) {
  skipChallenge(
    trackID: $trackID,
    challengeID: $challengeID,
    userID: $userID,
    inviteID: $inviteID
  ) {
    ...ChallengeFragment
  }
}
Variables
{
  "trackID": "xyz789",
  "challengeID": "xyz789",
  "userID": "xyz789",
  "inviteID": "abc123"
}
Response
{
  "data": {
    "skipChallenge": {
      "id": 4,
      "track": Track,
      "answers": ["xyz789"],
      "assignment": "xyz789",
      "attempts": [ChallengeAttempt],
      "can_check": true,
      "difficulty": "xyz789",
      "index": 987,
      "notes": [ChallengeNote],
      "permalink": "abc123",
      "scripts": [ChallengeScript],
      "slug": "abc123",
      "solution": [123],
      "hasSingleAnswer": false,
      "status": "locked",
      "tabs": [ChallengeTab],
      "teaser": "abc123",
      "timelimit": 123,
      "started": 123,
      "completed": 123,
      "failed": 987,
      "failMessage": "xyz789",
      "title": "xyz789",
      "type": "challenge",
      "unlocks": Challenge,
      "labConfig": ChallengeLabConfig,
      "deletedAt": "10:15:30Z"
    }
  }
}

skipToChallenge

Description

Skip to a specific challenge of a track

Response

Returns a Track

Arguments
Name Description
trackID - String! ID of the track
challengeID - String! ID of the challenge you want to skip to
userID - String ID of the user being impersonated
inviteID - String ID of the invite for the user being impersonated
force - Boolean Wheter you want to force skipping or let the skip walk through all scripts

Example

Query
mutation skipToChallenge(
  $trackID: String!,
  $challengeID: String!,
  $userID: String,
  $inviteID: String,
  $force: Boolean
) {
  skipToChallenge(
    trackID: $trackID,
    challengeID: $challengeID,
    userID: $userID,
    inviteID: $inviteID,
    force: $force
  ) {
    ...TrackFragment
  }
}
Variables
{
  "trackID": "xyz789",
  "challengeID": "xyz789",
  "userID": "abc123",
  "inviteID": "xyz789",
  "force": false
}
Response
{
  "data": {
    "skipToChallenge": {
      "id": "4",
      "slug": "xyz789",
      "version": "abc123",
      "revision": "10:15:30Z",
      "type": "abc123",
      "title": "xyz789",
      "teaser": "abc123",
      "description": "xyz789",
      "icon": "abc123",
      "level": "beginner",
      "tags": ["abc123"],
      "trackTags": [Tag],
      "owner": "xyz789",
      "team": Team,
      "developers": [User],
      "userIsTrackDeveloper": true,
      "instructors": [TrackInstructor],
      "updated_by": User,
      "private": false,
      "published": false,
      "maintenance": true,
      "challenges": [Challenge],
      "config": TrackConfig,
      "sandboxConfig": SandboxConfigVersion,
      "trackConfig": TrackConfig,
      "status": "started",
      "started": "10:15:30Z",
      "creating": "10:15:30Z",
      "created": "10:15:30Z",
      "failed": "10:15:30Z",
      "stopped": "10:15:30Z",
      "completed": "10:15:30Z",
      "cleaned": "10:15:30Z",
      "permalink": "xyz789",
      "play_limit": 987,
      "play_count": 987,
      "expiry_date": "10:15:30Z",
      "expiry_count": 987,
      "median_starttime": 987,
      "prestart": false,
      "skipping_to": Challenge,
      "scripts": [TrackScript],
      "actual_pool_size": 123,
      "show_timer": true,
      "skipping_enabled": true,
      "can_skip": true,
      "ttl": "10:15:30Z",
      "last_update": "10:15:30Z",
      "createdAt": "10:15:30Z",
      "deletedAt": "10:15:30Z",
      "learning_paths": [LearningPath],
      "accessible": false,
      "embed_token": "xyz789",
      "visibility": "unpublished",
      "trackReviews": TrackReviewConnection,
      "statistics": TrackStatistics,
      "participant": Play,
      "idle_timeout": 987,
      "studentStatistics": StudentTrackStatistics,
      "timelimit": 987,
      "lab_config": LabConfig,
      "sourceTrack": Track,
      "recommendations": ["create_notes"],
      "commits": [Commit],
      "remote_repository": "xyz789"
    }
  }
}

solveChallenge

Description

Solve callenge solves the challenge

Response

Returns a Challenge

Arguments
Name Description
challengeID - String! ID of the challenge

Example

Query
mutation solveChallenge($challengeID: String!) {
  solveChallenge(challengeID: $challengeID) {
    ...ChallengeFragment
  }
}
Variables
{"challengeID": "abc123"}
Response
{
  "data": {
    "solveChallenge": {
      "id": 4,
      "track": Track,
      "answers": ["abc123"],
      "assignment": "abc123",
      "attempts": [ChallengeAttempt],
      "can_check": false,
      "difficulty": "abc123",
      "index": 123,
      "notes": [ChallengeNote],
      "permalink": "xyz789",
      "scripts": [ChallengeScript],
      "slug": "abc123",
      "solution": [123],
      "hasSingleAnswer": false,
      "status": "locked",
      "tabs": [ChallengeTab],
      "teaser": "abc123",
      "timelimit": 987,
      "started": 123,
      "completed": 987,
      "failed": 123,
      "failMessage": "abc123",
      "title": "xyz789",
      "type": "challenge",
      "unlocks": Challenge,
      "labConfig": ChallengeLabConfig,
      "deletedAt": "10:15:30Z"
    }
  }
}

startChallenge

Description

Starts a challenge

Should be called after the setup has completed successfully

Response

Returns a Challenge

Arguments
Name Description
challengeID - String! ID of the challenge

Example

Query
mutation startChallenge($challengeID: String!) {
  startChallenge(challengeID: $challengeID) {
    ...ChallengeFragment
  }
}
Variables
{"challengeID": "xyz789"}
Response
{
  "data": {
    "startChallenge": {
      "id": 4,
      "track": Track,
      "answers": ["abc123"],
      "assignment": "abc123",
      "attempts": [ChallengeAttempt],
      "can_check": false,
      "difficulty": "abc123",
      "index": 123,
      "notes": [ChallengeNote],
      "permalink": "xyz789",
      "scripts": [ChallengeScript],
      "slug": "abc123",
      "solution": [987],
      "hasSingleAnswer": true,
      "status": "locked",
      "tabs": [ChallengeTab],
      "teaser": "xyz789",
      "timelimit": 123,
      "started": 987,
      "completed": 987,
      "failed": 987,
      "failMessage": "abc123",
      "title": "xyz789",
      "type": "challenge",
      "unlocks": Challenge,
      "labConfig": ChallengeLabConfig,
      "deletedAt": "10:15:30Z"
    }
  }
}

startHostImage

Description

Starts a sandbox for a host image

Response

Returns a Sandbox!

Arguments
Name Description
hostImageID - ID!
vmConfig - HostImageVMConfigInput

Example

Query
mutation startHostImage(
  $hostImageID: ID!,
  $vmConfig: HostImageVMConfigInput
) {
  startHostImage(
    hostImageID: $hostImageID,
    vmConfig: $vmConfig
  ) {
    ...SandboxFragment
  }
}
Variables
{
  "hostImageID": "4",
  "vmConfig": HostImageVMConfigInput
}
Response
{
  "data": {
    "startHostImage": {
      "id": 4,
      "track": Track,
      "state": "creating",
      "invite": TrackInvite,
      "hot_start_pool": HotStartPool,
      "ttl": "10:15:30Z",
      "created": "10:15:30Z",
      "user": User,
      "last_activity_at": "10:15:30Z"
    }
  }
}

startTrack

Description

Starts a track

Will start a new play for the logged in user. If the user already has a running instance of this track, that one will be returned rather than starting a new one.

Response

Returns a Track

Arguments
Name Description
trackID - String! ID of the track
force - Boolean Force starting a new track, instead of the option of getting an already started track
prestart - Boolean Prestart this track, so it will be available faster. This will only create the infrastructure, and not run the challenge setup
mode - Mode Mode in which the track was started (e.g. embed)
inviteID - String ID of the invite from where the track is started
landingPageID - String ID of the landing page from where the track is started
customParameters - [CustomParametersInput!] Custom Parameters used to inject metadata to the play.
runtimeParameters - RuntimeParametersInput Runtime Parameters used to inject metadata to the sandbox.
region - String Region, sandbox will be created in

Example

Query
mutation startTrack(
  $trackID: String!,
  $force: Boolean,
  $prestart: Boolean,
  $mode: Mode,
  $inviteID: String,
  $landingPageID: String,
  $customParameters: [CustomParametersInput!],
  $runtimeParameters: RuntimeParametersInput,
  $region: String
) {
  startTrack(
    trackID: $trackID,
    force: $force,
    prestart: $prestart,
    mode: $mode,
    inviteID: $inviteID,
    landingPageID: $landingPageID,
    customParameters: $customParameters,
    runtimeParameters: $runtimeParameters,
    region: $region
  ) {
    ...TrackFragment
  }
}
Variables
{
  "trackID": "abc123",
  "force": false,
  "prestart": true,
  "mode": "embed",
  "inviteID": "xyz789",
  "landingPageID": "abc123",
  "customParameters": [CustomParametersInput],
  "runtimeParameters": RuntimeParametersInput,
  "region": "xyz789"
}
Response
{
  "data": {
    "startTrack": {
      "id": "4",
      "slug": "xyz789",
      "version": "abc123",
      "revision": "10:15:30Z",
      "type": "xyz789",
      "title": "abc123",
      "teaser": "abc123",
      "description": "xyz789",
      "icon": "xyz789",
      "level": "beginner",
      "tags": ["abc123"],
      "trackTags": [Tag],
      "owner": "xyz789",
      "team": Team,
      "developers": [User],
      "userIsTrackDeveloper": true,
      "instructors": [TrackInstructor],
      "updated_by": User,
      "private": false,
      "published": true,
      "maintenance": true,
      "challenges": [Challenge],
      "config": TrackConfig,
      "sandboxConfig": SandboxConfigVersion,
      "trackConfig": TrackConfig,
      "status": "started",
      "started": "10:15:30Z",
      "creating": "10:15:30Z",
      "created": "10:15:30Z",
      "failed": "10:15:30Z",
      "stopped": "10:15:30Z",
      "completed": "10:15:30Z",
      "cleaned": "10:15:30Z",
      "permalink": "abc123",
      "play_limit": 987,
      "play_count": 123,
      "expiry_date": "10:15:30Z",
      "expiry_count": 987,
      "median_starttime": 987,
      "prestart": true,
      "skipping_to": Challenge,
      "scripts": [TrackScript],
      "actual_pool_size": 987,
      "show_timer": false,
      "skipping_enabled": true,
      "can_skip": false,
      "ttl": "10:15:30Z",
      "last_update": "10:15:30Z",
      "createdAt": "10:15:30Z",
      "deletedAt": "10:15:30Z",
      "learning_paths": [LearningPath],
      "accessible": false,
      "embed_token": "abc123",
      "visibility": "unpublished",
      "trackReviews": TrackReviewConnection,
      "statistics": TrackStatistics,
      "participant": Play,
      "idle_timeout": 123,
      "studentStatistics": StudentTrackStatistics,
      "timelimit": 123,
      "lab_config": LabConfig,
      "sourceTrack": Track,
      "recommendations": ["create_notes"],
      "commits": [Commit],
      "remote_repository": "xyz789"
    }
  }
}

stopAllTracks

Description

Stop all active tracks

Response

Returns a Boolean!

Example

Query
mutation stopAllTracks {
  stopAllTracks
}
Response
{"data": {"stopAllTracks": false}}

stopHostImage

Description

Stops a sandbox for a host image

Response

Returns a Sandbox!

Arguments
Name Description
hostImageID - ID!

Example

Query
mutation stopHostImage($hostImageID: ID!) {
  stopHostImage(hostImageID: $hostImageID) {
    ...SandboxFragment
  }
}
Variables
{"hostImageID": 4}
Response
{
  "data": {
    "stopHostImage": {
      "id": "4",
      "track": Track,
      "state": "creating",
      "invite": TrackInvite,
      "hot_start_pool": HotStartPool,
      "ttl": "10:15:30Z",
      "created": "10:15:30Z",
      "user": User,
      "last_activity_at": "10:15:30Z"
    }
  }
}

stopSandbox

Description

Stop a sandbox instance

Response

Returns a Sandbox

Arguments
Name Description
sandboxID - String! Sandbox id to set value for

Example

Query
mutation stopSandbox($sandboxID: String!) {
  stopSandbox(sandboxID: $sandboxID) {
    ...SandboxFragment
  }
}
Variables
{"sandboxID": "xyz789"}
Response
{
  "data": {
    "stopSandbox": {
      "id": 4,
      "track": Track,
      "state": "creating",
      "invite": TrackInvite,
      "hot_start_pool": HotStartPool,
      "ttl": "10:15:30Z",
      "created": "10:15:30Z",
      "user": User,
      "last_activity_at": "10:15:30Z"
    }
  }
}

stopTrack

Description

Stops a track

Response

Returns a Track

Arguments
Name Description
trackID - String! ID of the track
reason - TrackStopReason Reason for stopping the track

Example

Query
mutation stopTrack(
  $trackID: String!,
  $reason: TrackStopReason
) {
  stopTrack(
    trackID: $trackID,
    reason: $reason
  ) {
    ...TrackFragment
  }
}
Variables
{"trackID": "xyz789", "reason": "expired"}
Response
{
  "data": {
    "stopTrack": {
      "id": 4,
      "slug": "xyz789",
      "version": "abc123",
      "revision": "10:15:30Z",
      "type": "abc123",
      "title": "xyz789",
      "teaser": "abc123",
      "description": "abc123",
      "icon": "abc123",
      "level": "beginner",
      "tags": ["abc123"],
      "trackTags": [Tag],
      "owner": "abc123",
      "team": Team,
      "developers": [User],
      "userIsTrackDeveloper": true,
      "instructors": [TrackInstructor],
      "updated_by": User,
      "private": true,
      "published": true,
      "maintenance": true,
      "challenges": [Challenge],
      "config": TrackConfig,
      "sandboxConfig": SandboxConfigVersion,
      "trackConfig": TrackConfig,
      "status": "started",
      "started": "10:15:30Z",
      "creating": "10:15:30Z",
      "created": "10:15:30Z",
      "failed": "10:15:30Z",
      "stopped": "10:15:30Z",
      "completed": "10:15:30Z",
      "cleaned": "10:15:30Z",
      "permalink": "abc123",
      "play_limit": 987,
      "play_count": 123,
      "expiry_date": "10:15:30Z",
      "expiry_count": 987,
      "median_starttime": 123,
      "prestart": true,
      "skipping_to": Challenge,
      "scripts": [TrackScript],
      "actual_pool_size": 987,
      "show_timer": true,
      "skipping_enabled": false,
      "can_skip": false,
      "ttl": "10:15:30Z",
      "last_update": "10:15:30Z",
      "createdAt": "10:15:30Z",
      "deletedAt": "10:15:30Z",
      "learning_paths": [LearningPath],
      "accessible": true,
      "embed_token": "abc123",
      "visibility": "unpublished",
      "trackReviews": TrackReviewConnection,
      "statistics": TrackStatistics,
      "participant": Play,
      "idle_timeout": 987,
      "studentStatistics": StudentTrackStatistics,
      "timelimit": 123,
      "lab_config": LabConfig,
      "sourceTrack": Track,
      "recommendations": ["create_notes"],
      "commits": [Commit],
      "remote_repository": "abc123"
    }
  }
}

updateAwsAccountConfig

Use updateSandboxConfig instead
Description

Update an AWS account config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
config - AwsAccountConfigInput! The AWS Account config to update

Example

Query
mutation updateAwsAccountConfig($config: AwsAccountConfigInput!) {
  updateAwsAccountConfig(config: $config) {
    ...TrackConfigFragment
  }
}
Variables
{"config": AwsAccountConfigInput}
Response
{
  "data": {
    "updateAwsAccountConfig": {
      "id": "4",
      "version": "abc123",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

updateAzureSubscriptionConfig

Use updateSandboxConfig instead
Description

Update an Azure Subscription config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
config - AzureSubscriptionConfigInput! The Azure Subscription config to update

Example

Query
mutation updateAzureSubscriptionConfig($config: AzureSubscriptionConfigInput!) {
  updateAzureSubscriptionConfig(config: $config) {
    ...TrackConfigFragment
  }
}
Variables
{"config": AzureSubscriptionConfigInput}
Response
{
  "data": {
    "updateAzureSubscriptionConfig": {
      "id": 4,
      "version": "abc123",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

updateChallenge

Description

Update a challenge of a track

Note: you need to be a developer for this track

Response

Returns a Challenge

Arguments
Name Description
challenge - ChallengeInput! the challenge to update

Example

Query
mutation updateChallenge($challenge: ChallengeInput!) {
  updateChallenge(challenge: $challenge) {
    ...ChallengeFragment
  }
}
Variables
{"challenge": ChallengeInput}
Response
{
  "data": {
    "updateChallenge": {
      "id": 4,
      "track": Track,
      "answers": ["abc123"],
      "assignment": "xyz789",
      "attempts": [ChallengeAttempt],
      "can_check": false,
      "difficulty": "abc123",
      "index": 987,
      "notes": [ChallengeNote],
      "permalink": "xyz789",
      "scripts": [ChallengeScript],
      "slug": "abc123",
      "solution": [123],
      "hasSingleAnswer": false,
      "status": "locked",
      "tabs": [ChallengeTab],
      "teaser": "abc123",
      "timelimit": 987,
      "started": 987,
      "completed": 987,
      "failed": 987,
      "failMessage": "xyz789",
      "title": "abc123",
      "type": "challenge",
      "unlocks": Challenge,
      "labConfig": ChallengeLabConfig,
      "deletedAt": "10:15:30Z"
    }
  }
}

updateChallengeIndexes

Description

Update the challenge order of a track

Note: you need to be a developer for this track

Response

Returns [Challenge!]

Arguments
Name Description
trackID - String! ID of the track
challenges - [String!]! List of challenge IDs, in the order of which they need to be

Example

Query
mutation updateChallengeIndexes(
  $trackID: String!,
  $challenges: [String!]!
) {
  updateChallengeIndexes(
    trackID: $trackID,
    challenges: $challenges
  ) {
    ...ChallengeFragment
  }
}
Variables
{
  "trackID": "xyz789",
  "challenges": ["abc123"]
}
Response
{
  "data": {
    "updateChallengeIndexes": [
      {
        "id": 4,
        "track": Track,
        "answers": ["abc123"],
        "assignment": "abc123",
        "attempts": [ChallengeAttempt],
        "can_check": false,
        "difficulty": "xyz789",
        "index": 123,
        "notes": [ChallengeNote],
        "permalink": "abc123",
        "scripts": [ChallengeScript],
        "slug": "xyz789",
        "solution": [987],
        "hasSingleAnswer": false,
        "status": "locked",
        "tabs": [ChallengeTab],
        "teaser": "xyz789",
        "timelimit": 123,
        "started": 987,
        "completed": 123,
        "failed": 987,
        "failMessage": "abc123",
        "title": "xyz789",
        "type": "challenge",
        "unlocks": Challenge,
        "labConfig": ChallengeLabConfig,
        "deletedAt": "10:15:30Z"
      }
    ]
  }
}

updateChallengeLabConfig

Description

Update a challenge lab config

Response

Returns a ChallengeLabConfig!

Arguments
Name Description
challengeID - ID!
input - ChallengeLabConfigInput!

Example

Query
mutation updateChallengeLabConfig(
  $challengeID: ID!,
  $input: ChallengeLabConfigInput!
) {
  updateChallengeLabConfig(
    challengeID: $challengeID,
    input: $input
  ) {
    ...ChallengeLabConfigFragment
  }
}
Variables
{
  "challengeID": "4",
  "input": ChallengeLabConfigInput
}
Response
{
  "data": {
    "updateChallengeLabConfig": {
      "defaultLayout": "AssignmentRight",
      "defaultLayoutSidebarSize": 123,
      "customLayout": "abc123"
    }
  }
}

updateChallengeNote

Description

Update a challenge note

Note: you need to be a developer for this track

Response

Returns a ChallengeNote

Arguments
Name Description
note - ChallengeNoteInput! The note to update

Example

Query
mutation updateChallengeNote($note: ChallengeNoteInput!) {
  updateChallengeNote(note: $note) {
    ...ChallengeNoteFragment
  }
}
Variables
{"note": ChallengeNoteInput}
Response
{
  "data": {
    "updateChallengeNote": {
      "id": 4,
      "contents": "xyz789",
      "index": 987,
      "type": "image",
      "url": "abc123"
    }
  }
}

updateChallengeNoteIndexes

Description

Update challenge note order

Note: you need to be a developer for this track

Response

Returns [ChallengeNote!]

Arguments
Name Description
challengeID - String! ID of the challenge
notes - [String!]! List of note IDs, in the order of which they need to be

Example

Query
mutation updateChallengeNoteIndexes(
  $challengeID: String!,
  $notes: [String!]!
) {
  updateChallengeNoteIndexes(
    challengeID: $challengeID,
    notes: $notes
  ) {
    ...ChallengeNoteFragment
  }
}
Variables
{
  "challengeID": "xyz789",
  "notes": ["abc123"]
}
Response
{
  "data": {
    "updateChallengeNoteIndexes": [
      {
        "id": 4,
        "contents": "xyz789",
        "index": 987,
        "type": "image",
        "url": "abc123"
      }
    ]
  }
}

updateChallengeTab

Description

Update a challenge tab

Note: you need to be a developer for this track

Response

Returns a ChallengeTab

Arguments
Name Description
tab - ChallengeTabInput! The tab to update

Example

Query
mutation updateChallengeTab($tab: ChallengeTabInput!) {
  updateChallengeTab(tab: $tab) {
    ...ChallengeTabFragment
  }
}
Variables
{"tab": ChallengeTabInput}
Response
{
  "data": {
    "updateChallengeTab": {
      "id": "4",
      "index": 123,
      "hostname": "abc123",
      "path": "xyz789",
      "port": 123,
      "target": "xyz789",
      "title": "abc123",
      "type": "service",
      "url": "abc123",
      "new_window": false,
      "workdir": "abc123",
      "cmd": "abc123",
      "custom_headers": [CustomHeader],
      "custom_response_headers": [CustomHeader]
    }
  }
}

updateChallengeTabIndexes

Description

Update challenge tab order

Note: you need to be a developer for this track

Response

Returns [ChallengeTab!]

Arguments
Name Description
challengeID - String! ID of the challenge
tabs - [String!]! List of tab IDs, in the order of which they need to be

Example

Query
mutation updateChallengeTabIndexes(
  $challengeID: String!,
  $tabs: [String!]!
) {
  updateChallengeTabIndexes(
    challengeID: $challengeID,
    tabs: $tabs
  ) {
    ...ChallengeTabFragment
  }
}
Variables
{
  "challengeID": "xyz789",
  "tabs": ["xyz789"]
}
Response
{
  "data": {
    "updateChallengeTabIndexes": [
      {
        "id": "4",
        "index": 123,
        "hostname": "abc123",
        "path": "abc123",
        "port": 123,
        "target": "abc123",
        "title": "abc123",
        "type": "service",
        "url": "xyz789",
        "new_window": false,
        "workdir": "xyz789",
        "cmd": "xyz789",
        "custom_headers": [CustomHeader],
        "custom_response_headers": [CustomHeader]
      }
    ]
  }
}

updateCloudProviderConfig

Description

Update the cloud provider configuration of a team

Response

Returns a CloudProviderConfig!

Arguments
Name Description
teamID - ID!
input - CloudProviderConfigInput!

Example

Query
mutation updateCloudProviderConfig(
  $teamID: ID!,
  $input: CloudProviderConfigInput!
) {
  updateCloudProviderConfig(
    teamID: $teamID,
    input: $input
  ) {
    ...CloudProviderConfigFragment
  }
}
Variables
{
  "teamID": "4",
  "input": CloudProviderConfigInput
}
Response
{
  "data": {
    "updateCloudProviderConfig": {
      "provider": "aws",
      "services": [CloudProviderService],
      "regions": [CloudProviderRegion]
    }
  }
}

updateCompleteTrack

Description

Update a complete track

This is similar to updateTrack, but will also update the developers, challenge scripts and track config. It expects that all these fields are set on the input. If they are not set, it will remove any existing values from the database. The main use-case for this is facilitating the CLI.

Note: you need to be a developer for this track

Response

Returns a Track

Arguments
Name Description
track - TrackInput!

Example

Query
mutation updateCompleteTrack($track: TrackInput!) {
  updateCompleteTrack(track: $track) {
    ...TrackFragment
  }
}
Variables
{"track": TrackInput}
Response
{
  "data": {
    "updateCompleteTrack": {
      "id": "4",
      "slug": "abc123",
      "version": "xyz789",
      "revision": "10:15:30Z",
      "type": "xyz789",
      "title": "xyz789",
      "teaser": "abc123",
      "description": "xyz789",
      "icon": "xyz789",
      "level": "beginner",
      "tags": ["abc123"],
      "trackTags": [Tag],
      "owner": "xyz789",
      "team": Team,
      "developers": [User],
      "userIsTrackDeveloper": false,
      "instructors": [TrackInstructor],
      "updated_by": User,
      "private": false,
      "published": true,
      "maintenance": false,
      "challenges": [Challenge],
      "config": TrackConfig,
      "sandboxConfig": SandboxConfigVersion,
      "trackConfig": TrackConfig,
      "status": "started",
      "started": "10:15:30Z",
      "creating": "10:15:30Z",
      "created": "10:15:30Z",
      "failed": "10:15:30Z",
      "stopped": "10:15:30Z",
      "completed": "10:15:30Z",
      "cleaned": "10:15:30Z",
      "permalink": "xyz789",
      "play_limit": 987,
      "play_count": 123,
      "expiry_date": "10:15:30Z",
      "expiry_count": 987,
      "median_starttime": 123,
      "prestart": true,
      "skipping_to": Challenge,
      "scripts": [TrackScript],
      "actual_pool_size": 123,
      "show_timer": true,
      "skipping_enabled": false,
      "can_skip": false,
      "ttl": "10:15:30Z",
      "last_update": "10:15:30Z",
      "createdAt": "10:15:30Z",
      "deletedAt": "10:15:30Z",
      "learning_paths": [LearningPath],
      "accessible": true,
      "embed_token": "abc123",
      "visibility": "unpublished",
      "trackReviews": TrackReviewConnection,
      "statistics": TrackStatistics,
      "participant": Play,
      "idle_timeout": 987,
      "studentStatistics": StudentTrackStatistics,
      "timelimit": 987,
      "lab_config": LabConfig,
      "sourceTrack": Track,
      "recommendations": ["create_notes"],
      "commits": [Commit],
      "remote_repository": "xyz789"
    }
  }
}

updateCompleteTrackVersioned

Response

Returns a VersionedTrack

Arguments
Name Description
track - TrackInput!
files - [FileInput!] Files that have conflicts

Example

Query
mutation updateCompleteTrackVersioned(
  $track: TrackInput!,
  $files: [FileInput!]
) {
  updateCompleteTrackVersioned(
    track: $track,
    files: $files
  ) {
    ...VersionedTrackFragment
  }
}
Variables
{
  "track": TrackInput,
  "files": [FileInput]
}
Response
{
  "data": {
    "updateCompleteTrackVersioned": {
      "track": Track,
      "conflicts": [File]
    }
  }
}

updateContainerConfig

Use updateSandboxConfig instead
Description

Update a container config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
config - ContainerConfigInput! The container config to update

Example

Query
mutation updateContainerConfig($config: ContainerConfigInput!) {
  updateContainerConfig(config: $config) {
    ...TrackConfigFragment
  }
}
Variables
{"config": ContainerConfigInput}
Response
{
  "data": {
    "updateContainerConfig": {
      "id": "4",
      "version": "xyz789",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

updateCustomResource

Description

updates the custom resource with the given id

Response

Returns a CustomResource!

Arguments
Name Description
id - ID!
input - UpdateCustomResourceInput!

Example

Query
mutation updateCustomResource(
  $id: ID!,
  $input: UpdateCustomResourceInput!
) {
  updateCustomResource(
    id: $id,
    input: $input
  ) {
    ...CustomResourceFragment
  }
}
Variables
{"id": 4, "input": UpdateCustomResourceInput}
Response
{
  "data": {
    "updateCustomResource": {
      "id": 4,
      "name": "abc123",
      "slug": "xyz789",
      "description": "xyz789",
      "version": "xyz789",
      "logo": "xyz789",
      "provider": "terraform",
      "canDelete": false,
      "terraformModule": TerraformModule,
      "inputs": [CustomResourceInput],
      "outputs": [CustomResourceOutput],
      "createdAt": "10:15:30Z",
      "createdBy": User
    }
  }
}

updateForm

Description

Updates the user details form for a team

Response

Returns a Form

Arguments
Name Description
form - FormInput!

Example

Query
mutation updateForm($form: FormInput!) {
  updateForm(form: $form) {
    ...FormFragment
  }
}
Variables
{"form": FormInput}
Response
{
  "data": {
    "updateForm": {
      "id": "4",
      "formTitle": "xyz789",
      "consentNotice": "abc123",
      "fields": [FormField],
      "validateWorkEmail": false
    }
  }
}

updateGcpProjectConfig

Use updateSandboxConfig instead
Description

Update a GCP project config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
config - GcpProjectConfigInput! The gcp project config to update

Example

Query
mutation updateGcpProjectConfig($config: GcpProjectConfigInput!) {
  updateGcpProjectConfig(config: $config) {
    ...TrackConfigFragment
  }
}
Variables
{"config": GcpProjectConfigInput}
Response
{
  "data": {
    "updateGcpProjectConfig": {
      "id": 4,
      "version": "abc123",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

updateHostImage

Description

Updates an existing host image

Response

Returns a HostImage!

Arguments
Name Description
input - HostImageInput!

Example

Query
mutation updateHostImage($input: HostImageInput!) {
  updateHostImage(input: $input) {
    ...HostImageFragment
  }
}
Variables
{"input": HostImageInput}
Response
{
  "data": {
    "updateHostImage": {
      "id": "4",
      "slug": "xyz789",
      "description": "abc123",
      "imageMetadata": ImageMetadata,
      "status": "created",
      "currentSandbox": HostImageSandbox,
      "team": Team,
      "usedInTracks": [Track],
      "usedInSandboxConfigVersions": [
        SandboxConfigVersion
      ],
      "createdAt": "10:15:30Z",
      "createdBy": User,
      "createdWith": HostImageVMInputs
    }
  }
}

updateHotStartPool

Description

Update hot start pool

Response

Returns a HotStartPool

Arguments
Name Description
id - ID! ID of hot start pool to update
pool - HotStartPoolInput! pool to update

Example

Query
mutation updateHotStartPool(
  $id: ID!,
  $pool: HotStartPoolInput!
) {
  updateHotStartPool(
    id: $id,
    pool: $pool
  ) {
    ...HotStartPoolFragment
  }
}
Variables
{
  "id": "4",
  "pool": HotStartPoolInput
}
Response
{
  "data": {
    "updateHotStartPool": {
      "id": "4",
      "type": "dedicated",
      "size": 123,
      "created": "10:15:30Z",
      "deleted": "10:15:30Z",
      "name": "abc123",
      "auto_refill": false,
      "starts_at": "10:15:30Z",
      "ends_at": "10:15:30Z",
      "created_by": User,
      "team": Team,
      "tracks": [HotStartPoolTrackEdge],
      "configs": [HotStartConfigTrackEdge],
      "status": "Running",
      "region": "abc123"
    }
  }
}

updateLandingPage

Response

Returns a LandingPage!

Arguments
Name Description
input - LandingPageInput!

Example

Query
mutation updateLandingPage($input: LandingPageInput!) {
  updateLandingPage(input: $input) {
    ...LandingPageFragment
  }
}
Variables
{"input": LandingPageInput}
Response
{
  "data": {
    "updateLandingPage": {
      "id": "4",
      "team": Team,
      "internalPageName": "xyz789",
      "path": "abc123",
      "archivedAt": "10:15:30Z",
      "publishedAt": "10:15:30Z",
      "updatedAt": "10:15:30Z",
      "trackPlayLimit": 987,
      "formEnabled": true,
      "privacyPolicyUrl": "xyz789",
      "termsAndConditionsUrl": "abc123",
      "pageTitle": "abc123",
      "seoDescription": "abc123",
      "robotsIndexingEnabled": false,
      "backgroundColor": "xyz789",
      "textColor": "abc123",
      "logoUrl": "abc123",
      "logoLink": "abc123",
      "pageHeading": "xyz789",
      "pageSubtitle": "abc123",
      "linkedInUrl": "xyz789",
      "xUrl": "xyz789",
      "youtubeUrl": "xyz789",
      "githubUrl": "xyz789",
      "slackUrl": "abc123",
      "tracks": [LandingPageTrackEdge]
    }
  }
}

updateLearningPath

No longer supported
Description

Update a learning path

Note: you need to be a member of the organization that owns the learning path

Response

Returns a LearningPath

Arguments
Name Description
learningPath - LearningPathInput! The learning path to update

Example

Query
mutation updateLearningPath($learningPath: LearningPathInput!) {
  updateLearningPath(learningPath: $learningPath) {
    ...LearningPathFragment
  }
}
Variables
{"learningPath": LearningPathInput}
Response
{
  "data": {
    "updateLearningPath": {
      "id": "4",
      "slug": "abc123",
      "owner": "abc123",
      "permalink": "abc123",
      "title": "abc123",
      "teaser": "abc123",
      "description": "xyz789",
      "image": "xyz789",
      "level": "beginner",
      "published": false,
      "preview": true,
      "accessible": false,
      "courses": [Track],
      "authors": [User],
      "access_type": "purchased"
    }
  }
}

updateLtiToolRegistration

Description

Update an LTI 1.3 tool

Response

Returns a LtiToolRegistration!

Arguments
Name Description
teamID - ID!
id - ID!
input - LtiToolRegistrationInput!

Example

Query
mutation updateLtiToolRegistration(
  $teamID: ID!,
  $id: ID!,
  $input: LtiToolRegistrationInput!
) {
  updateLtiToolRegistration(
    teamID: $teamID,
    id: $id,
    input: $input
  ) {
    ...LtiToolRegistrationFragment
  }
}
Variables
{
  "teamID": "4",
  "id": 4,
  "input": LtiToolRegistrationInput
}
Response
{
  "data": {
    "updateLtiToolRegistration": {
      "id": 4,
      "name": "abc123",
      "teamID": "abc123",
      "issuer": "xyz789",
      "clientID": "abc123",
      "keySetURL": "abc123",
      "publicKey": "xyz789",
      "accessTokenURL": "xyz789",
      "authURL": "abc123",
      "deploymentIDs": ["xyz789"]
    }
  }
}

updateOrganization

No longer supported
Description

Update an organization

Response

Returns an Organization

Arguments
Name Description
organization - OrganizationInput!

Example

Query
mutation updateOrganization($organization: OrganizationInput!) {
  updateOrganization(organization: $organization) {
    ...OrganizationFragment
  }
}
Variables
{"organization": OrganizationInput}
Response
{
  "data": {
    "updateOrganization": {
      "id": "4",
      "members": [OrganizationMember],
      "users": [OrganizationUserEdge],
      "name": "abc123",
      "logo": "xyz789",
      "title": "xyz789",
      "subtitle": "xyz789",
      "slug": "xyz789",
      "primary_link_text": "abc123",
      "primary_link_url": "xyz789",
      "secondary_link_text": "abc123",
      "secondary_link_url": "abc123",
      "api_key": "abc123",
      "theme": OrganizationTheme,
      "personal": false,
      "features": OrganizationFeatures,
      "invited": ["xyz789"],
      "invites": [OrganizationInvite],
      "privacy_policy": "abc123",
      "webhook_dashboard_url": "abc123",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z"
    }
  }
}

updateRemoteRepository

Description

Update remote git repository in a track

Response

Returns a Track!

Arguments
Name Description
trackID - String!
repository - String!

Example

Query
mutation updateRemoteRepository(
  $trackID: String!,
  $repository: String!
) {
  updateRemoteRepository(
    trackID: $trackID,
    repository: $repository
  ) {
    ...TrackFragment
  }
}
Variables
{
  "trackID": "abc123",
  "repository": "abc123"
}
Response
{
  "data": {
    "updateRemoteRepository": {
      "id": 4,
      "slug": "abc123",
      "version": "xyz789",
      "revision": "10:15:30Z",
      "type": "xyz789",
      "title": "xyz789",
      "teaser": "xyz789",
      "description": "abc123",
      "icon": "abc123",
      "level": "beginner",
      "tags": ["abc123"],
      "trackTags": [Tag],
      "owner": "abc123",
      "team": Team,
      "developers": [User],
      "userIsTrackDeveloper": false,
      "instructors": [TrackInstructor],
      "updated_by": User,
      "private": true,
      "published": false,
      "maintenance": false,
      "challenges": [Challenge],
      "config": TrackConfig,
      "sandboxConfig": SandboxConfigVersion,
      "trackConfig": TrackConfig,
      "status": "started",
      "started": "10:15:30Z",
      "creating": "10:15:30Z",
      "created": "10:15:30Z",
      "failed": "10:15:30Z",
      "stopped": "10:15:30Z",
      "completed": "10:15:30Z",
      "cleaned": "10:15:30Z",
      "permalink": "xyz789",
      "play_limit": 123,
      "play_count": 123,
      "expiry_date": "10:15:30Z",
      "expiry_count": 987,
      "median_starttime": 123,
      "prestart": true,
      "skipping_to": Challenge,
      "scripts": [TrackScript],
      "actual_pool_size": 987,
      "show_timer": false,
      "skipping_enabled": true,
      "can_skip": false,
      "ttl": "10:15:30Z",
      "last_update": "10:15:30Z",
      "createdAt": "10:15:30Z",
      "deletedAt": "10:15:30Z",
      "learning_paths": [LearningPath],
      "accessible": false,
      "embed_token": "abc123",
      "visibility": "unpublished",
      "trackReviews": TrackReviewConnection,
      "statistics": TrackStatistics,
      "participant": Play,
      "idle_timeout": 123,
      "studentStatistics": StudentTrackStatistics,
      "timelimit": 123,
      "lab_config": LabConfig,
      "sourceTrack": Track,
      "recommendations": ["create_notes"],
      "commits": [Commit],
      "remote_repository": "abc123"
    }
  }
}

updateSamlSsoConnection

Response

Returns a SsoConnection

Arguments
Name Description
teamID - ID!
connectionName - String! Name of the connection being updated
ssoConnection - SsoSamlConnectionInput! The connection values being updated

Example

Query
mutation updateSamlSsoConnection(
  $teamID: ID!,
  $connectionName: String!,
  $ssoConnection: SsoSamlConnectionInput!
) {
  updateSamlSsoConnection(
    teamID: $teamID,
    connectionName: $connectionName,
    ssoConnection: $ssoConnection
  ) {
    ...SsoConnectionFragment
  }
}
Variables
{
  "teamID": "4",
  "connectionName": "abc123",
  "ssoConnection": SsoSamlConnectionInput
}
Response
{
  "data": {
    "updateSamlSsoConnection": {
      "name": "abc123",
      "organizationID": "abc123",
      "strategy": "okta",
      "options": DefaultSsoConnectionOptions
    }
  }
}

updateSandboxConfig

Description

Updates the given config

Response

Returns a SandboxConfigVersion

Arguments
Name Description
configID - String! The config id
config - SandboxConfigInput! The config

Example

Query
mutation updateSandboxConfig(
  $configID: String!,
  $config: SandboxConfigInput!
) {
  updateSandboxConfig(
    configID: $configID,
    config: $config
  ) {
    ...SandboxConfigVersionFragment
  }
}
Variables
{
  "configID": "abc123",
  "config": SandboxConfigInput
}
Response
{
  "data": {
    "updateSandboxConfig": {
      "id": "4",
      "config": SandboxConfig,
      "version": 987,
      "description": "xyz789",
      "status": "draft",
      "published_at": "10:15:30Z",
      "published_by": User,
      "change_log_entry": "xyz789",
      "resources": SandboxResources,
      "scripts": [SandboxScript],
      "tracks": [Track],
      "hot_start_pools": [HotStartPool]
    }
  }
}

updateSandboxTTL

Description

Update the sandbox ttl time

Response

Returns a Sandbox

Arguments
Name Description
sandboxID - String! Sandbox id to set value for
until - Time! The time the sandbox ttl should be extended until

Example

Query
mutation updateSandboxTTL(
  $sandboxID: String!,
  $until: Time!
) {
  updateSandboxTTL(
    sandboxID: $sandboxID,
    until: $until
  ) {
    ...SandboxFragment
  }
}
Variables
{
  "sandboxID": "xyz789",
  "until": "10:15:30Z"
}
Response
{
  "data": {
    "updateSandboxTTL": {
      "id": 4,
      "track": Track,
      "state": "creating",
      "invite": TrackInvite,
      "hot_start_pool": HotStartPool,
      "ttl": "10:15:30Z",
      "created": "10:15:30Z",
      "user": User,
      "last_activity_at": "10:15:30Z"
    }
  }
}

updateSecretConfig

Description

Updates the secret configs for a track

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
trackID - String! The ID of the track
configs - [SecretConfigInput!]! The secret configs to add

Example

Query
mutation updateSecretConfig(
  $trackID: String!,
  $configs: [SecretConfigInput!]!
) {
  updateSecretConfig(
    trackID: $trackID,
    configs: $configs
  ) {
    ...TrackConfigFragment
  }
}
Variables
{
  "trackID": "xyz789",
  "configs": [SecretConfigInput]
}
Response
{
  "data": {
    "updateSecretConfig": {
      "id": 4,
      "version": "xyz789",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

updateSsoConnection

Response

Returns a SsoConnection

Arguments
Name Description
teamID - ID!
connectionName - String! Name of the connection being updated
ssoConnection - SsoConnectionInput! The connection values being updated

Example

Query
mutation updateSsoConnection(
  $teamID: ID!,
  $connectionName: String!,
  $ssoConnection: SsoConnectionInput!
) {
  updateSsoConnection(
    teamID: $teamID,
    connectionName: $connectionName,
    ssoConnection: $ssoConnection
  ) {
    ...SsoConnectionFragment
  }
}
Variables
{
  "teamID": "4",
  "connectionName": "abc123",
  "ssoConnection": SsoConnectionInput
}
Response
{
  "data": {
    "updateSsoConnection": {
      "name": "abc123",
      "organizationID": "xyz789",
      "strategy": "okta",
      "options": DefaultSsoConnectionOptions
    }
  }
}

updateTag

Description

Updates an existing tag

Response

Returns a Tag!

Arguments
Name Description
id - ID!
input - TagInput!

Example

Query
mutation updateTag(
  $id: ID!,
  $input: TagInput!
) {
  updateTag(
    id: $id,
    input: $input
  ) {
    ...TagFragment
  }
}
Variables
{"id": 4, "input": TagInput}
Response
{
  "data": {
    "updateTag": {
      "id": "4",
      "value": "xyz789",
      "createdAt": "10:15:30Z",
      "tracks": [Track],
      "groups": [TagGroup]
    }
  }
}

updateTagGroup

Description

Updates an existing tag group

Response

Returns a TagGroup!

Arguments
Name Description
id - ID!
input - TagGroupInput!
tagIDs - [ID!]!

Example

Query
mutation updateTagGroup(
  $id: ID!,
  $input: TagGroupInput!,
  $tagIDs: [ID!]!
) {
  updateTagGroup(
    id: $id,
    input: $input,
    tagIDs: $tagIDs
  ) {
    ...TagGroupFragment
  }
}
Variables
{
  "id": "4",
  "input": TagGroupInput,
  "tagIDs": [4]
}
Response
{
  "data": {
    "updateTagGroup": {
      "id": "4",
      "name": "abc123",
      "createdAt": "10:15:30Z",
      "tags": [Tag]
    }
  }
}

updateTeam

Description

Update a team

Response

Returns a Team

Arguments
Name Description
team - TeamInput!

Example

Query
mutation updateTeam($team: TeamInput!) {
  updateTeam(team: $team) {
    ...TeamFragment
  }
}
Variables
{"team": TeamInput}
Response
{
  "data": {
    "updateTeam": {
      "id": "4",
      "members": [TeamMember],
      "users": [TeamUserEdge],
      "userInTeam": false,
      "userReportPage": UserReportPage,
      "userDetails": [UserDetails],
      "name": "xyz789",
      "logo": "xyz789",
      "title": "xyz789",
      "subtitle": "abc123",
      "slug": "abc123",
      "primary_link_text": "xyz789",
      "primary_link_url": "abc123",
      "secondary_link_text": "xyz789",
      "secondary_link_url": "abc123",
      "api_key": "abc123",
      "theme": TeamTheme,
      "themes": [TrackTheme],
      "personal": false,
      "features": TeamFeatures,
      "invited": ["abc123"],
      "invites": [TeamInvite],
      "insights": Insights,
      "tracks": [Track],
      "hotStartPools": [HotStartPool],
      "privacy_policy": "xyz789",
      "webhook_dashboard_url": "abc123",
      "created_at": "10:15:30Z",
      "customer_since": "10:15:30Z",
      "trial_end_at": "10:15:30Z",
      "lti_credentials": LTICredentials,
      "form": Form,
      "ssoConnection": SsoConnection,
      "tags": [Tag],
      "tagGroups": [TagGroup],
      "customResources": [CustomResource],
      "hostImages": [HostImage],
      "integrations": Integrations,
      "landingPages": [LandingPage],
      "ltiToolRegistrations": [LtiToolRegistration],
      "cloudProviderConfigs": [CloudProviderConfig],
      "githubInstallationID": 987,
      "enabledRepositories": ["abc123"]
    }
  }
}

updateTeamFeatures

Description

Update team features

Response

Returns a TeamFeatures

Arguments
Name Description
teamID - String! ID of the team
features - TeamFeaturesInput! Features to be updated

Example

Query
mutation updateTeamFeatures(
  $teamID: String!,
  $features: TeamFeaturesInput!
) {
  updateTeamFeatures(
    teamID: $teamID,
    features: $features
  ) {
    ...TeamFeaturesFragment
  }
}
Variables
{
  "teamID": "xyz789",
  "features": TeamFeaturesInput
}
Response
{
  "data": {
    "updateTeamFeatures": {
      "max_tracks": 987,
      "max_timelimit": 987,
      "max_hot_start_pool_size_always_on": 123,
      "max_hot_start_pool_size_scheduled": 123,
      "containers": false,
      "virtual_machines": true,
      "gcp_projects": false,
      "aws_accounts": false,
      "azure_subscriptions": true,
      "blueprint_sandbox": false,
      "embedded": true,
      "members_skip_to_challenge": false,
      "track_reviews": true,
      "accept_terms_checkbox": false,
      "hot_start": false,
      "custom_machine_type": false,
      "shared_hotstart_pools": true,
      "scripts_over_http": false,
      "global_sandboxes": false,
      "use_new_terminal": true,
      "custom_resources": true,
      "crm_integration": true,
      "can_hide_sidebar": false,
      "can_add_feedback_tab": false,
      "exclude_instruqt_plays": true,
      "new_content_structure": false,
      "user_completion_rate": true,
      "labV2": false,
      "landingPages": true,
      "exposeCloudAccountCredentials": true,
      "instantSandboxes": true,
      "cloudProvidersConfig": true
    }
  }
}

updateTopic

Description

Update a topic

Note: you need to be a member of the organization that owns the topic

Response

Returns a Topic

Arguments
Name Description
topic - TopicInput! The topic to update

Example

Query
mutation updateTopic($topic: TopicInput!) {
  updateTopic(topic: $topic) {
    ...TopicFragment
  }
}
Variables
{"topic": TopicInput}
Response
{
  "data": {
    "updateTopic": {
      "id": 4,
      "permalink": "abc123",
      "description": "xyz789",
      "icon": "abc123",
      "slug": "abc123",
      "title": "abc123",
      "tags": ["abc123"],
      "teaser": "abc123",
      "tracks": [Track],
      "private": true,
      "owner": "xyz789"
    }
  }
}

updateTopicTrackIndexes

Description

Update the indexes of tracks in a topic

Note: you need to be a member of the organization that owns the topic

Response

Returns a Topic

Arguments
Name Description
topicID - String! ID of the challenge
tracks - [String!]! List of tracks IDs, in the order of which they need to be

Example

Query
mutation updateTopicTrackIndexes(
  $topicID: String!,
  $tracks: [String!]!
) {
  updateTopicTrackIndexes(
    topicID: $topicID,
    tracks: $tracks
  ) {
    ...TopicFragment
  }
}
Variables
{
  "topicID": "xyz789",
  "tracks": ["xyz789"]
}
Response
{
  "data": {
    "updateTopicTrackIndexes": {
      "id": 4,
      "permalink": "abc123",
      "description": "abc123",
      "icon": "xyz789",
      "slug": "abc123",
      "title": "xyz789",
      "tags": ["abc123"],
      "teaser": "abc123",
      "tracks": [Track],
      "private": true,
      "owner": "xyz789"
    }
  }
}

updateTrack

Description

Update a track

Note: you need to be a developer for this track

Response

Returns a Track

Arguments
Name Description
track - TrackInput! The track to update

Example

Query
mutation updateTrack($track: TrackInput!) {
  updateTrack(track: $track) {
    ...TrackFragment
  }
}
Variables
{"track": TrackInput}
Response
{
  "data": {
    "updateTrack": {
      "id": 4,
      "slug": "abc123",
      "version": "xyz789",
      "revision": "10:15:30Z",
      "type": "xyz789",
      "title": "xyz789",
      "teaser": "xyz789",
      "description": "xyz789",
      "icon": "abc123",
      "level": "beginner",
      "tags": ["xyz789"],
      "trackTags": [Tag],
      "owner": "xyz789",
      "team": Team,
      "developers": [User],
      "userIsTrackDeveloper": true,
      "instructors": [TrackInstructor],
      "updated_by": User,
      "private": true,
      "published": true,
      "maintenance": true,
      "challenges": [Challenge],
      "config": TrackConfig,
      "sandboxConfig": SandboxConfigVersion,
      "trackConfig": TrackConfig,
      "status": "started",
      "started": "10:15:30Z",
      "creating": "10:15:30Z",
      "created": "10:15:30Z",
      "failed": "10:15:30Z",
      "stopped": "10:15:30Z",
      "completed": "10:15:30Z",
      "cleaned": "10:15:30Z",
      "permalink": "abc123",
      "play_limit": 123,
      "play_count": 987,
      "expiry_date": "10:15:30Z",
      "expiry_count": 123,
      "median_starttime": 987,
      "prestart": false,
      "skipping_to": Challenge,
      "scripts": [TrackScript],
      "actual_pool_size": 123,
      "show_timer": true,
      "skipping_enabled": false,
      "can_skip": false,
      "ttl": "10:15:30Z",
      "last_update": "10:15:30Z",
      "createdAt": "10:15:30Z",
      "deletedAt": "10:15:30Z",
      "learning_paths": [LearningPath],
      "accessible": false,
      "embed_token": "xyz789",
      "visibility": "unpublished",
      "trackReviews": TrackReviewConnection,
      "statistics": TrackStatistics,
      "participant": Play,
      "idle_timeout": 123,
      "studentStatistics": StudentTrackStatistics,
      "timelimit": 987,
      "lab_config": LabConfig,
      "sourceTrack": Track,
      "recommendations": ["create_notes"],
      "commits": [Commit],
      "remote_repository": "xyz789"
    }
  }
}

updateTrackInvite

Description

Update a track invite

Note: you need to be a member of the organization of the track the invite is for

Response

Returns a TrackInvite

Arguments
Name Description
invite - TrackInviteInput! invite to update

Example

Query
mutation updateTrackInvite($invite: TrackInviteInput!) {
  updateTrackInvite(invite: $invite) {
    ...TrackInviteFragment
  }
}
Variables
{"invite": TrackInviteInput}
Response
{
  "data": {
    "updateTrackInvite": {
      "id": 4,
      "title": "xyz789",
      "publicTitle": "xyz789",
      "publicDescription": "abc123",
      "tracks": [Track],
      "trackEdges": [TrackInviteTrackEdge],
      "authors": [TrackInviteAuthor],
      "trackLibrary": TrackLibraryEntryConnection,
      "organization": Organization,
      "team": Team,
      "accessSetting": "anyone",
      "inviteLimit": 987,
      "inviteCount": 123,
      "claimCount": 987,
      "inviteTTL": "10:15:30Z",
      "expiresAt": "10:15:30Z",
      "startsAt": "10:15:30Z",
      "playLimit": 123,
      "playTTL": 123,
      "created": "10:15:30Z",
      "last_updated": "10:15:30Z",
      "allowAnonymous": false,
      "allowedEmailAddresses": ["xyz789"],
      "allowedEmailAddressesOnly": true,
      "currentUserAllowed": false,
      "currentUserClaim": InviteClaim,
      "currentUserClaimed": false,
      "claims": [InviteClaim],
      "activeUsers": [UserActivity],
      "plays": [InvitePlay],
      "type": "self_paced",
      "status": "active",
      "daysUntil": 987,
      "enableLearnerSharing": true,
      "canClaim": true,
      "runtimeParameters": RuntimeParameters,
      "shareMethod": "link",
      "deletedAt": "10:15:30Z"
    }
  }
}

updateTrackReview

Description

Update track review with content.

Note: this updates track review as the currently authenticated user.

Response

Returns a TrackReview

Arguments
Name Description
id - ID!
input - TrackReviewInput!

Example

Query
mutation updateTrackReview(
  $id: ID!,
  $input: TrackReviewInput!
) {
  updateTrackReview(
    id: $id,
    input: $input
  ) {
    ...TrackReviewFragment
  }
}
Variables
{
  "id": "4",
  "input": TrackReviewInput
}
Response
{
  "data": {
    "updateTrackReview": {
      "id": 4,
      "track": Track,
      "challenge": Challenge,
      "user": User,
      "play": Play,
      "created_at": "10:15:30Z",
      "updated_at": "10:15:30Z",
      "score": 123,
      "content": "xyz789"
    }
  }
}

updateUser

Description

Update a user with displayName and/or slug (username)

Response

Returns a User

Arguments
Name Description
userID - String Unique ID
displayName - String Display name
slug - String Slug (username)

Example

Query
mutation updateUser(
  $userID: String,
  $displayName: String,
  $slug: String
) {
  updateUser(
    userID: $userID,
    displayName: $displayName,
    slug: $slug
  ) {
    ...UserFragment
  }
}
Variables
{
  "userID": "abc123",
  "displayName": "abc123",
  "slug": "xyz789"
}
Response
{
  "data": {
    "updateUser": {
      "id": "4",
      "profile": UserProfile,
      "details": UserDetails,
      "organizations": [UserOrganizationEdge],
      "teams": [UserTeamEdge],
      "is_anonymous": false,
      "is_global_admin": false,
      "segments": ["instruqt_employee"],
      "claims": [InviteClaim],
      "accessibleTracks": [Track],
      "reportItem": UserReportItem
    }
  }
}

updateVirtualBrowserConfig

Use updateSandboxConfig instead
Description

Update a virtualbrowser config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
config - VirtualBrowserConfigInput! The vm config to update

Example

Query
mutation updateVirtualBrowserConfig($config: VirtualBrowserConfigInput!) {
  updateVirtualBrowserConfig(config: $config) {
    ...TrackConfigFragment
  }
}
Variables
{"config": VirtualBrowserConfigInput}
Response
{
  "data": {
    "updateVirtualBrowserConfig": {
      "id": "4",
      "version": "abc123",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

updateVirtualMachineConfig

Use updateSandboxConfig instead
Description

Update a virtualmachine config

Note: you need to be a developer for this track

Response

Returns a TrackConfig

Arguments
Name Description
config - VirtualMachineConfigInput! The vm config to update

Example

Query
mutation updateVirtualMachineConfig($config: VirtualMachineConfigInput!) {
  updateVirtualMachineConfig(config: $config) {
    ...TrackConfigFragment
  }
}
Variables
{"config": VirtualMachineConfigInput}
Response
{
  "data": {
    "updateVirtualMachineConfig": {
      "id": 4,
      "version": "xyz789",
      "containers": [ContainerConfig],
      "virtualmachines": [VirtualMachineConfig],
      "virtualbrowsers": [VirtualBrowserConfig],
      "gcp_projects": [GcpProjectConfig],
      "aws_accounts": [AwsAccountConfig],
      "azure_subscriptions": [AzureSubscriptionConfig],
      "secrets": [SecretConfig],
      "custom_resources": [CustomResourceConfig],
      "blueprint": Blueprint
    }
  }
}

updateWebhook

Description

Update a webhook

Response

Returns a Webhook!

Arguments
Name Description
id - String! The ID of the webhook to be updated
teamID - String ID of the team
teamSlug - String Slug of the team
webhook - WebhookInput! The input properties of the new webhook

Example

Query
mutation updateWebhook(
  $id: String!,
  $teamID: String,
  $teamSlug: String,
  $webhook: WebhookInput!
) {
  updateWebhook(
    id: $id,
    teamID: $teamID,
    teamSlug: $teamSlug,
    webhook: $webhook
  ) {
    ...WebhookFragment
  }
}
Variables
{
  "id": "abc123",
  "teamID": "xyz789",
  "teamSlug": "abc123",
  "webhook": WebhookInput
}
Response
{
  "data": {
    "updateWebhook": {
      "id": "4",
      "name": "abc123",
      "url": "abc123",
      "created_at": "10:15:30Z",
      "updated_at": "10:15:30Z",
      "events": ["abc123"],
      "custom_headers": [CustomHeader]
    }
  }
}

upsertTeamSecret

Response

Returns a Secret

Arguments
Name Description
teamSlug - String Slug of the team
teamID - String Unique ID
name - String! The secrets name
description - String! A description of the secret
secret - String! The secrets value

Example

Query
mutation upsertTeamSecret(
  $teamSlug: String,
  $teamID: String,
  $name: String!,
  $description: String!,
  $secret: String!
) {
  upsertTeamSecret(
    teamSlug: $teamSlug,
    teamID: $teamID,
    name: $name,
    description: $description,
    secret: $secret
  ) {
    ...SecretFragment
  }
}
Variables
{
  "teamSlug": "abc123",
  "teamID": "xyz789",
  "name": "xyz789",
  "description": "abc123",
  "secret": "xyz789"
}
Response
{
  "data": {
    "upsertTeamSecret": {
      "name": "abc123",
      "description": "abc123",
      "teamID": "abc123",
      "created_at": "10:15:30Z",
      "created_by": User,
      "updated_at": "10:15:30Z",
      "updated_by": User,
      "tracks": [Track],
      "config_versions": [SandboxConfigVersion]
    }
  }
}

upsertVirtualBrowserCheck

Description

Create a new virtual browser check

Response

Returns a VirtualBrowserCheck!

Arguments
Name Description
virtualBrowserCheck - VirtualBrowserCheckInput! The input properties of the new virtual browser check

Example

Query
mutation upsertVirtualBrowserCheck($virtualBrowserCheck: VirtualBrowserCheckInput!) {
  upsertVirtualBrowserCheck(virtualBrowserCheck: $virtualBrowserCheck) {
    ...VirtualBrowserCheckFragment
  }
}
Variables
{"virtualBrowserCheck": VirtualBrowserCheckInput}
Response
{
  "data": {
    "upsertVirtualBrowserCheck": {
      "id": "4",
      "challenge": Challenge,
      "host": "abc123",
      "browserLocation": Location,
      "element": [HtmlElement],
      "innerText": [HtmlElement]
    }
  }
}

Types

AccessSetting

Values
Enum Value Description

anyone

anyone_leaving_details

allowed_emails_only

Example
"anyone"

AwsAccountConfig

Description

An AwsAccountConfig stores the details of an AWS account

Fields
Field Name Description
id - ID! Unique ID
name - String! Name of the project
iam_policy - String IAM policy that should be applied to the account, can be empty
managed_policies - [String!]! List of managed policies that should be applied to the account. See https://console.aws.amazon.com/iam/home?region=eu-west-1#/policies
scp_policy - String Service Control policy that will be applied to the account, can be empty
expose_to_user - Boolean! Whether the project should be exposed to the user
Example
{
  "id": "4",
  "name": "abc123",
  "iam_policy": "abc123",
  "managed_policies": ["xyz789"],
  "scp_policy": "abc123",
  "expose_to_user": false
}

AwsAccountConfigInput

Description

An AwsAccountConfigInput stores the details of an AWS account

Fields
Input Field Description
id - ID Unique ID
track - String ID of the track this config belongs to
name - String Name of the project
iam_policy - String IAM policy that should be applied to the account, can be empty
managed_policies - [String!] List of managed policies that should be applied to the account. See https://console.aws.amazon.com/iam/home?region=eu-west-1#/policies
scp_policy - String Service Control policy that will be applied to the account, can be empty
expose_to_user - Boolean Whether the project should be exposed to the user
services - [String!] List of services that should be enabled
regions - [String!] List of regions that should be enabled
Example
{
  "id": 4,
  "track": "xyz789",
  "name": "xyz789",
  "iam_policy": "abc123",
  "managed_policies": ["abc123"],
  "scp_policy": "xyz789",
  "expose_to_user": false,
  "services": ["xyz789"],
  "regions": ["abc123"]
}

AzureSubscriptionConfig

Description

An AzureSubscriptionConfig stores the details of an Azure Subscription

Fields
Field Name Description
id - ID! Unique ID
name - String! Name of the project
user_only - Boolean! Only create an AAD user
roles - [String!]! Roles to assign to the user
expose_to_user - Boolean! Whether the project should be exposed to the user
Example
{
  "id": 4,
  "name": "abc123",
  "user_only": true,
  "roles": ["xyz789"],
  "expose_to_user": true
}

AzureSubscriptionConfigInput

Description

An AzureSubscriptionInput stores the details of an Azure Subscription

Fields
Input Field Description
id - ID Unique ID
track - String ID of the track this config belongs to
name - String Name of the project
user_only - Boolean Only create an AAD user
roles - [String!] Roles to assign to the user
expose_to_user - Boolean Whether the project should be exposed to the user
services - [String!] List of services that should be enabled
regions - [String!] List of regions that should be enabled
Example
{
  "id": "4",
  "track": "xyz789",
  "name": "xyz789",
  "user_only": false,
  "roles": ["abc123"],
  "expose_to_user": true,
  "services": ["xyz789"],
  "regions": ["abc123"]
}

Blueprint

Fields
Field Name Description
id - ID!
repository - String!
path - String!
variables - [BlueprintVariable!]!
resources - BlueprintResources!
Example
{
  "id": 4,
  "repository": "abc123",
  "path": "xyz789",
  "variables": [BlueprintVariable],
  "resources": BlueprintResources
}

BlueprintInput

Fields
Input Field Description
repository - String! URL to the repository where the blueprint is located
path - String The path of the blueprint within the repository
variables - [BlueprintVariableInput!]! The variables that are passed to the blueprint
resources - BlueprintResourcesInput The resources the blueprint needs to start
Example
{
  "repository": "xyz789",
  "path": "xyz789",
  "variables": [BlueprintVariableInput],
  "resources": BlueprintResourcesInput
}

BlueprintResources

Fields
Field Name Description
cpu - Int!
memory - Int!
Example
{"cpu": 987, "memory": 987}

BlueprintResourcesInput

Fields
Input Field Description
cpu - Int!
memory - Int!
Example
{"cpu": 987, "memory": 123}

BlueprintVariable

Fields
Field Name Description
key - String!
value - String!
Example
{
  "key": "abc123",
  "value": "abc123"
}

BlueprintVariableInput

Fields
Input Field Description
key - String!
value - String!
Example
{
  "key": "xyz789",
  "value": "xyz789"
}

Boolean

Description

The Boolean scalar type represents true or false.

Challenge

Description

A challenge is a bite-sized problem that needs to be solved. Each challenge consists of the explanation followed by a hands-on assignment or quiz.

Fields
Field Name Description
id - ID! Unique ID
track - Track! The track associated with the challenge
answers - [String!]! List of possible answers in case of a quiz type challenge
assignment - String! The assignment a user has to complete. In case of a quiz, this is the question.
Arguments
parseAssignmentVariables - Boolean

Enable this to replace runtime variable placeholders

attempts - [ChallengeAttempt!]! List of attempts the user has done to solve the challenge
can_check - Boolean Whether checking is available or not, this is dependent on the presence of a check script
difficulty - String! Difficulty of the challenge. This field is currently not used
index - Int! Index of the challenge, used for ordering the challenges in a track. Starts at 0.
notes - [ChallengeNote!]! List of notes for this challenge
permalink - String Permalink for this challenge. Will be generated automatically, based on the slugs of the team, track and challenge.
scripts - [ChallengeScript!]! List of scripts for this challenge
slug - String! Slug of the challenge. This will be visible in the address bar of the browser
solution - [Int!]! List of valid answers for a quiz
hasSingleAnswer - Boolean! True if there is only one correct answer
status - ChallengeStatus! Status of the challenge
tabs - [ChallengeTab!]! List of tabs for this challenge
teaser - String! Teaser of the challenge. This will be visible for the user when the challenge is not yet unlocked.
timelimit - Int Maximum time the challenge is available. The sum of timelimits of all challenges determine the total TTL for a track.
started - Int! Timestamp when the challenge was started. Will be 0 when not yet started
completed - Int! Timestamp when the challenge was completed. Will be 0 when not yet completed
failed - Int! Timestamp when the challenge was failed. Will be 0 when there was no error
failMessage - String Error message for when the challenge was failed. Will be null if there was no error
title - String! Title of the challenge
type - ChallengeType! Type of the challenge
unlocks - Challenge Which challenge will be unlocked after this challenge has been successfully completed. This field is currently not used (the next challenge in the list will automatically be unlocked)
labConfig - ChallengeLabConfig ChallengeLabConfig represents the configuration settings for the challenge lab
deletedAt - Time Timestamp of when challenge has been deleted
Example
{
  "id": "4",
  "track": Track,
  "answers": ["xyz789"],
  "assignment": "xyz789",
  "attempts": [ChallengeAttempt],
  "can_check": true,
  "difficulty": "abc123",
  "index": 987,
  "notes": [ChallengeNote],
  "permalink": "abc123",
  "scripts": [ChallengeScript],
  "slug": "xyz789",
  "solution": [987],
  "hasSingleAnswer": true,
  "status": "locked",
  "tabs": [ChallengeTab],
  "teaser": "xyz789",
  "timelimit": 987,
  "started": 987,
  "completed": 123,
  "failed": 123,
  "failMessage": "abc123",
  "title": "abc123",
  "type": "challenge",
  "unlocks": Challenge,
  "labConfig": ChallengeLabConfig,
  "deletedAt": "10:15:30Z"
}

ChallengeAttempt

Description

ChallengeAttempt stores an attempt to solve a challenge

Fields
Field Name Description
message - String! Result message of the attempt
timestamp - Time! Timestamp of the attempt
Example
{
  "message": "abc123",
  "timestamp": "10:15:30Z"
}

ChallengeInput

Description

A challenge is a bite-sized problem that needs to be solved. Each challenge consists of the explanation followed by a hands-on assignment or quiz.

Fields
Input Field Description
id - ID Unique ID
type - String Type of the challenge
track - String ID of the track this challenge belongs to
assignment - String The assignment a user has to complete. In case of a quiz, this is the question.
difficulty - String Difficulty of the challenge. This field is currently not used
slug - String Slug of the challenge. This will be visible in the address bar of the browser
teaser - String Teaser of the challenge. This will be visible for the user when the challenge is not yet unlocked.
timelimit - Int Maximum time the challenge is available. The sum of timelimits of all challenges determine the total TTL for a track.
title - String Title of the challenge
answers - [String!] List of possible answers in case of a quiz type challenge
solution - [Int!] List of valid answers for a quiz
tabs - [ChallengeTabInput!] List of tabs for this challenge
notes - [ChallengeNoteInput!] List of notes for this challenge
scripts - [ChallengeScriptInput!] List of scripts for this challenge
index - Int Index of the challenge, used for ordering the challenges in a track. Starts at 0.
labConfig - ChallengeLabConfigInput Configuration of the lab for this challenge
Example
{
  "id": "4",
  "type": "xyz789",
  "track": "abc123",
  "assignment": "abc123",
  "difficulty": "xyz789",
  "slug": "abc123",
  "teaser": "abc123",
  "timelimit": 123,
  "title": "abc123",
  "answers": ["abc123"],
  "solution": [123],
  "tabs": [ChallengeTabInput],
  "notes": [ChallengeNoteInput],
  "scripts": [ChallengeScriptInput],
  "index": 987,
  "labConfig": ChallengeLabConfigInput
}

ChallengeLabConfig

Description

ChallengeLabConfig represents the configuration settings for the challenge lab

Fields
Field Name Description
defaultLayout - DefaultLabLayout The default layout for the challenge layout
defaultLayoutSidebarSize - Int The default size of the sidebar in the default layout
customLayout - String A custom layout specified as a string JSON
Example
{
  "defaultLayout": "AssignmentRight",
  "defaultLayoutSidebarSize": 123,
  "customLayout": "abc123"
}

ChallengeLabConfigInput

Fields
Input Field Description
defaultLayout - DefaultLabLayout The default layout for the challenge layout
defaultLayoutSidebarSize - Int The default size of the sidebar in the default layout
customLayout - LabLayoutInput A custom layout specified as a string JSON
Example
{
  "defaultLayout": "AssignmentRight",
  "defaultLayoutSidebarSize": 987,
  "customLayout": LabLayoutInput
}

ChallengeNote

Description

A ChallengeNote is displayed when the infrastructure of your challenge is being created. You can display markdown text but also show an image or video.

Fields
Field Name Description
id - ID! Unique ID
contents - String Text contents
index - Int! Index of the note, used for ordering the notes of a challenge. Starts at 0.
type - ChallengeNoteType! Type of the note
url - String URL for image and video notes
Example
{
  "id": "4",
  "contents": "abc123",
  "index": 987,
  "type": "image",
  "url": "abc123"
}

ChallengeNoteInput

Description

A ChallengeNote is displayed when the infrastructure of your challenge is being created. You can display markdown text but also show an image or video.

Fields
Input Field Description
id - ID Unique ID
track - String ID of the track this note belongs to
challenge - String ID of the challenge this note belongs to
contents - String Text contents
type - ChallengeNoteType Type of the note
url - String URL for image and video notes
index - Int Index of the note, used for ordering the notes of a challenge. Starts at 0.
Example
{
  "id": 4,
  "track": "xyz789",
  "challenge": "abc123",
  "contents": "xyz789",
  "type": "image",
  "url": "xyz789",
  "index": 987
}

ChallengeNoteType

Description

ChallengeNoteType enumerated the possible note types

Values
Enum Value Description

image

text

video

Example
"image"

ChallengeScript

Description

Challenge scripts provide the automation hooks for interacting with the infrastructure of the track. There are 4 actions: setup, check, cleanup and solve

Fields
Field Name Description
id - ID! Unique ID
action - String! One of: setup, check, cleanup and solve
contents - String! The script contents
host - String! On which host the script is executed. Must reference a host in the track config
Example
{
  "id": "4",
  "action": "xyz789",
  "contents": "abc123",
  "host": "abc123"
}

ChallengeScriptInput

Description

Challenge scripts provide the automation hooks for interacting with the infrastructure of the track. There are 4 actions: setup, check, cleanup and solve

Fields
Input Field Description
id - ID Unique ID
track - String ID of the track this script belongs to
challenge - String ID of the track this challenge belongs to
host - String On which host the script is executed. Must reference a host in the track config
action - String One of: setup, check, cleanup and solve
contents - String The script contents
Example
{
  "id": 4,
  "track": "abc123",
  "challenge": "xyz789",
  "host": "abc123",
  "action": "xyz789",
  "contents": "xyz789"
}

ChallengeSeries

Fields
Field Name Description
date - String!
unlocked - Int!
started - Int!
completed - Int!
Example
{
  "date": "abc123",
  "unlocked": 123,
  "started": 123,
  "completed": 987
}

ChallengeStatistics

Fields
Field Name Description
id - ID!
title - String
unlocked_total - Int
started_total - Int
completed_total - Int
series - [ChallengeSeries!]!
attempts_total - Int
attempts_min - Int
attempts_max - Int
attempts_avg - Int
attempts_stddev - Int
duration_min - Int
duration_max - Int
duration_avg - Int
duration_stddev - Int
Example
{
  "id": 4,
  "title": "abc123",
  "unlocked_total": 123,
  "started_total": 987,
  "completed_total": 987,
  "series": [ChallengeSeries],
  "attempts_total": 987,
  "attempts_min": 123,
  "attempts_max": 123,
  "attempts_avg": 123,
  "attempts_stddev": 123,
  "duration_min": 987,
  "duration_max": 123,
  "duration_avg": 123,
  "duration_stddev": 123
}

ChallengeStatus

Description

ChallengeStatus enumerates the possible states for challenges

Values
Enum Value Description

locked

The challenge is locked, another challenge has to be completed first

unlocked

The challenge is available to play, but has not yet been started by the user

creating

The setup script is being run

created

The challenge is ready for the user to start playing

failed

The setup script has failed to run

started

The user has started the challenge

checking

The check script is being run

completed

The user has completed the challenge successfully
Example
"locked"

ChallengeTab

Description

A tab shows a service, terminal or (external) website for a challenge

Fields
Field Name Description
id - ID! Unique ID
index - Int! Index of the tab, used for ordering the tabs of a challenge. Starts at 0.
hostname - String Refers to a host in the track config. Must be set for types service and terminal.
path - String Path of a service. Only valid for type service, defaults to /
port - Int Port of a service. Only valid for type service
target - String Currently not used
title - String! Title of the tab
type - ChallengeTabType! Type of the tab
url - String URL of an (external) website. Only valid for type website and external
new_window - Boolean! Whether to open this tab in an external window
workdir - String Initial work directory, only valid for terminal tabs
cmd - String initial command to run, only valid for terminal tabs
custom_headers - [CustomHeader!] custom headers to send with proxy response
custom_response_headers - [CustomHeader!] custom headers to send from proxy response
Example
{
  "id": "4",
  "index": 123,
  "hostname": "xyz789",
  "path": "xyz789",
  "port": 123,
  "target": "abc123",
  "title": "abc123",
  "type": "service",
  "url": "abc123",
  "new_window": false,
  "workdir": "xyz789",
  "cmd": "abc123",
  "custom_headers": [CustomHeader],
  "custom_response_headers": [CustomHeader]
}

ChallengeTabInput

Description

A tab shows a service, terminal or (external) website for a challenge

Fields
Input Field Description
id - ID Unique ID
track - String ID of the track this tab belongs to
challenge - String ID of the challenge this tab belongs to
hostname - String Refers to a host in the track config. Must be set for types service and terminal.
path - String Path of a service. Only valid for type service, defaults to /
port - Int Port of a service. Only valid for type service
title - String Title of the tab
type - ChallengeTabType Type of the tab
url - String URL of an (external) website. Only valid for type website and external
index - Int Index of the tab, used for ordering the tabs of a challenge. Starts at 0.
new_window - Boolean Whether to open this tab in an external window
workdir - String Initial work directory, only valid for terminal tabs
cmd - String initial command to run, only valid for terminal tabs
custom_headers - [CustomHeaderInput!] custom headers to send with proxy response
custom_response_headers - [CustomHeaderInput!] custom headers to send from proxy response
Example
{
  "id": 4,
  "track": "abc123",
  "challenge": "xyz789",
  "hostname": "xyz789",
  "path": "abc123",
  "port": 987,
  "title": "xyz789",
  "type": "service",
  "url": "abc123",
  "index": 987,
  "new_window": true,
  "workdir": "abc123",
  "cmd": "abc123",
  "custom_headers": [CustomHeaderInput],
  "custom_response_headers": [CustomHeaderInput]
}

ChallengeTabType

Description

ChallengeTabType enumerates the possible tab types

Values
Enum Value Description

service

Internal service of your track, should reference a host in the track config

terminal

Terminal to a host in the track config

code

Simple code editor

website

URL to a website. The website should be frameable in an iframe

external

URL to an external website. Useful for sites that are not frameable

browser

Virtual browser provided as a service

feedback

Form to collect feedback from the user
Example
"service"

ChallengeType

Description

ChallengeType enumerates the possible challenge types

Values
Enum Value Description

challenge

A challenge has setup and scripts

quiz

A quiz has a question and one or more answers
Example
"challenge"

CloudProvider

Description

The different cloud providers

Values
Enum Value Description

aws

Amazon Web Services

gcp

Google Cloud Platform

azure

Microsoft Azure
Example
"aws"

CloudProviderConfig

Fields
Field Name Description
provider - CloudProvider! The cloud provider
services - [CloudProviderService!]! The list of available services IDs and names
regions - [CloudProviderRegion!]! The list of available regions IDs and names
Example
{
  "provider": "aws",
  "services": [CloudProviderService],
  "regions": [CloudProviderRegion]
}

CloudProviderConfigInput

Fields
Input Field Description
provider - CloudProvider!
services - [String!]
regions - [String!]
Example
{
  "provider": "aws",
  "services": ["xyz789"],
  "regions": ["abc123"]
}

CloudProviderRegion

Fields
Field Name Description
id - ID! The id of the cloud provider config region
name - String! The display name of the cloud provider config region
Example
{"id": 4, "name": "xyz789"}

CloudProviderService

Fields
Field Name Description
id - ID! The id of the cloud provider config service
name - String! The display name of the cloud provider config service
Example
{"id": 4, "name": "abc123"}

Commit

Fields
Field Name Description
hash - String! The commit hash
message - String! The commit message
author - User! The commit author
timestamp - Time! The commit timestamp
content - [File]! The files that have changes
Example
{
  "hash": "xyz789",
  "message": "abc123",
  "author": User,
  "timestamp": "10:15:30Z",
  "content": [File]
}

CompletionRateSeries

Fields
Field Name Description
min - Float!
max - Float!
sum - Float!
average - Float!
Items - [CompletionRateSeriesItem!]!
Example
{
  "min": 123.45,
  "max": 987.65,
  "sum": 123.45,
  "average": 123.45,
  "Items": [CompletionRateSeriesItem]
}

CompletionRateSeriesItem

Fields
Field Name Description
bucketStartTime - Time!
value - Float!
Example
{
  "bucketStartTime": "10:15:30Z",
  "value": 123.45
}

ConditionType

Values
Enum Value Description

equals

contains

starts_with

ends_with

Example
"equals"

ContainerConfig

Description

A ContainerConfig stores the details of a container

Fields
Field Name Description
id - ID! Unique ID
environment - [EnvironmentVariable!] List of key-value pairs that are injected as environment variables
image - String! Container image to use
entrypoint - String Override the ENTRYPOINT from the docker image
cmd - String Override the CMD from the docker image
name - String! Name of the container, will be used as hostname
ports - [Int!] Ports to expose
shell - String! Which shell to expose in the terminal. Defaults to /bin/sh
memory - Int! Amount of memory to use, in megabytes. Defaults to 32
resources - ContainerResources! Deprecated
Example
{
  "id": "4",
  "environment": [EnvironmentVariable],
  "image": "abc123",
  "entrypoint": "abc123",
  "cmd": "xyz789",
  "name": "xyz789",
  "ports": [987],
  "shell": "xyz789",
  "memory": 123,
  "resources": ContainerResources
}

ContainerConfigInput

Description

A ContainerConfig stores the details of a container

Fields
Input Field Description
id - ID Unique ID
track - String ID of the track this config belongs to
name - String Name of the container, will be used as hostname
image - String Container image to use
entrypoint - String Override the ENTRYPOINT from the docker image
cmd - String Override the CMD from the docker image
ports - [Int!] Ports to expose
shell - String Which shell to expose in the terminal. Defaults to /bin/sh
environment - [EnvironmentInput!] List of key-value pairs that are injected as environment variables
memory - Int Amount of memory to use, in megabytes. Defaults to 32
resources - ContainerResourcesInput Deprecated
Example
{
  "id": "4",
  "track": "abc123",
  "name": "abc123",
  "image": "xyz789",
  "entrypoint": "xyz789",
  "cmd": "xyz789",
  "ports": [987],
  "shell": "xyz789",
  "environment": [EnvironmentInput],
  "memory": 123,
  "resources": ContainerResourcesInput
}

ContainerConfigPreset

Description

A ContainerConfigPreset stores the config for a container preset.

Fields
Field Name Description
label - String! The label of the preset
image - String! Container image to use
memory - Int! Amount of memory to use
Example
{
  "label": "abc123",
  "image": "abc123",
  "memory": 987
}

ContainerResources

Description

Deprecated

Fields
Field Name Description
memory - Int!
Example
{"memory": 987}

ContainerResourcesInput

Description

Deprecated

Fields
Input Field Description
memory - Int
Example
{"memory": 123}

CustomHeader

Description

CustomHeader represents a Instruqt CustomHeader

Fields
Field Name Description
key - String! The key of the header
value - String! The value of the header
Example
{
  "key": "xyz789",
  "value": "xyz789"
}

CustomHeaderInput

Description

Parameters used to create or update a webhooks headers

Fields
Input Field Description
key - String! The key of the header
value - String! The value of the header
Example
{
  "key": "xyz789",
  "value": "abc123"
}

CustomParameter

Description

Key value pair of a custom parameter associated with a Play

Fields
Field Name Description
key - String! Key of custom parameter
value - String! Value associated with the key of custom parameter
Example
{
  "key": "abc123",
  "value": "xyz789"
}

CustomParameterFilter

Description

Filter for key value pair

Fields
Input Field Description
key - String! Key of filter
value - String! Value of filter
Example
{
  "key": "xyz789",
  "value": "abc123"
}

CustomParametersInput

Description

A custom parameter can be used to add metadata to a track play. You can use this metadata to integrate with external systems, like an LMS or a marketing automation tool.

Fields
Input Field Description
key - String
value - String
Example
{
  "key": "abc123",
  "value": "xyz789"
}

CustomResource

Fields
Field Name Description
id - ID!
name - String!
slug - String!
description - String!
version - String!
logo - String!
provider - CustomResourceProvider!
canDelete - Boolean!
terraformModule - TerraformModule
inputs - [CustomResourceInput!]!
outputs - [CustomResourceOutput!]!
createdAt - Time!
createdBy - User!
Example
{
  "id": "4",
  "name": "abc123",
  "slug": "abc123",
  "description": "abc123",
  "version": "xyz789",
  "logo": "abc123",
  "provider": "terraform",
  "canDelete": false,
  "terraformModule": TerraformModule,
  "inputs": [CustomResourceInput],
  "outputs": [CustomResourceOutput],
  "createdAt": "10:15:30Z",
  "createdBy": User
}

CustomResourceConfig

Description

A CustomResourceConfig stores the details of a custom resource

Fields
Field Name Description
id - ID! Unique ID
name - String! The name of the custom resource config
slug - String! The slug of the custom resource config
custom_resource - CustomResource! The custom resource
inputs - [CustomResourceInputConfig!]! URL of the custom resource
Example
{
  "id": "4",
  "name": "xyz789",
  "slug": "xyz789",
  "custom_resource": CustomResource,
  "inputs": [CustomResourceInputConfig]
}

CustomResourceConfigInput

Description

A CustomResourceConfigInput is a custom resource that can be used in a sandbox

Fields
Input Field Description
name - String Name of the custom resource
slug - String The slug of the custom resource
inputs - [CustomResourceConfigInputInput!] The inputs for the custom resource
Example
{
  "name": "abc123",
  "slug": "abc123",
  "inputs": [CustomResourceConfigInputInput]
}

CustomResourceConfigInputInput

Description

A CustomResourceConfigInputInput is an input for a custom resource config

Fields
Input Field Description
name - String Name of the input
source - CustomResourceInputSource Source of the input
value - String value of the input
Example
{
  "name": "abc123",
  "source": "secret",
  "value": "xyz789"
}

CustomResourceDataType

Values
Enum Value Description

string

number

bool

json

Example
"string"

CustomResourceInput

Fields
Field Name Description
name - String!
description - String!
type - CustomResourceDataType!
required - Boolean!
readOnly - Boolean!
Example
{
  "name": "abc123",
  "description": "xyz789",
  "type": "string",
  "required": true,
  "readOnly": false
}

CustomResourceInputConfig

Description

A CustomResourceInputConfig stores the details of a custom resource input

Fields
Field Name Description
name - String! Name of the input
source - CustomResourceInputSource! Source of the input
value - String! Value of the input depending on the source
Example
{
  "name": "xyz789",
  "source": "secret",
  "value": "xyz789"
}

CustomResourceInputSource

Description

A CustomResourceInputSource stores of the source of a custom resource input value

Values
Enum Value Description

secret

The input is a secret

user_defined

The input is plain user defined
Example
"secret"

CustomResourceOutput

Fields
Field Name Description
name - String!
description - String!
Example
{
  "name": "abc123",
  "description": "abc123"
}

CustomResourceProvider

Values
Enum Value Description

terraform

Example
"terraform"

DateRangeFilter

Description

Filter for date range

Fields
Input Field Description
from - Time Begining of range
to - Time End of range
Example
{
  "from": "10:15:30Z",
  "to": "10:15:30Z"
}

DefaultLabLayout

Description

DefaultLabLayout is an enumeration representing the available layout options for the default challenge layout

Values
Enum Value Description

AssignmentRight

Assignment pane on the right side of the layout

AssignmentLeft

Assignment pane on the left side of the layout

AssignmentBottom

Assignment pane at the bottom of the layout
Example
"AssignmentRight"

DefaultSsoConnectionOptions

Fields
Field Name Description
clientID - String!
clientSecret - String! We will no longer expose this
domain - String!
Example
{
  "clientID": "xyz789",
  "clientSecret": "xyz789",
  "domain": "xyz789"
}

Direction

Description

Sort direction, can be either Asc or Desc.

Values
Enum Value Description

Asc

Desc

Example
"Asc"

EnvironmentInput

Description

Specifies a Environment Variable

Fields
Input Field Description
key - String Name of the env var
value - String Value of the env var
Example
{
  "key": "abc123",
  "value": "abc123"
}

EnvironmentVariable

Fields
Field Name Description
key - String!
value - String!
Example
{
  "key": "abc123",
  "value": "xyz789"
}

File

Fields
Field Name Description
path - String! The file name
content - String! The file content
Example
{
  "path": "abc123",
  "content": "abc123"
}

FileInput

Fields
Input Field Description
path - String!
content - String!
Example
{
  "path": "abc123",
  "content": "xyz789"
}

Float

Description

The Float scalar type represents signed double-precision fractional values as specified by IEEE 754.

Example
123.45

Form

Fields
Field Name Description
id - ID!
formTitle - String
consentNotice - String
fields - [FormField!]!
validateWorkEmail - Boolean
Example
{
  "id": "4",
  "formTitle": "xyz789",
  "consentNotice": "xyz789",
  "fields": [FormField],
  "validateWorkEmail": false
}

FormField

Fields
Field Name Description
id - ID!
fieldName - FormFieldName! Name of the field
isRequired - Boolean! Is this field required to be filled in by the user
Example
{"id": 4, "fieldName": "first_name", "isRequired": true}

FormFieldInput

Fields
Input Field Description
fieldName - FormFieldName!
isRequired - Boolean!
Example
{"fieldName": "first_name", "isRequired": false}

FormFieldName

Values
Enum Value Description

first_name

last_name

email

company_name

phone_number

job_title

job_level

country_code

us_state

consent

Example
"first_name"

FormInput

Fields
Input Field Description
id - ID
formTitle - String
consentNotice - String
fields - [FormFieldInput!]!
validateWorkEmail - Boolean
Example
{
  "id": 4,
  "formTitle": "abc123",
  "consentNotice": "xyz789",
  "fields": [FormFieldInput],
  "validateWorkEmail": true
}

GcpProjectConfig

Description

A GcpProjectConfig stores the details of a GCP Project

Fields
Field Name Description
id - ID! Unique ID
name - String! Name of the project
services - [String!]! List of services that should be enabled. See https://cloud.google.com/service-usage/docs/list-services
roles - [String!]! List of roles that should be applied to the project Service Account and User, e.g. roles/compute.admin. See predefined list https://cloud.google.com/iam/docs/understanding-roles#predefined
expose_to_user - Boolean! Whether the project should be exposed to the user
Example
{
  "id": 4,
  "name": "abc123",
  "services": ["xyz789"],
  "roles": ["xyz789"],
  "expose_to_user": true
}

GcpProjectConfigInput

Description

A GcpProjectConfig stores the details of a GCP Project

Fields
Input Field Description
id - ID Unique ID
track - String ID of the track this config belongs to
name - String Name of the project
services - [String!] List of services that should be enabled. See https://cloud.google.com/service-usage/docs/list-services
roles - [String!] List of roles that should be applied to the project Service Account and User, e.g. roles/compute.admin. See predefined list https://cloud.google.com/iam/docs/understanding-roles#predefined
expose_to_user - Boolean Whether the project should be exposed to the user
regions - [String!] List of regions that should be enabled
Example
{
  "id": "4",
  "track": "xyz789",
  "name": "abc123",
  "services": ["xyz789"],
  "roles": ["abc123"],
  "expose_to_user": true,
  "regions": ["abc123"]
}

GoogleCloudMachineTypePreset

Description

A GoogleCloudMachineTypePreset defines a Google Cloud machine type.

Fields
Field Name Description
label - String! The label of the Google Cloud machine type preset
machine_type - String! The name of the Google Cloud machine type
Example
{
  "label": "abc123",
  "machine_type": "xyz789"
}

HappinessCount

Fields
Field Name Description
score - Int!
count - Int!
Example
{"score": 987, "count": 123}

HostImage

Fields
Field Name Description
id - ID!
slug - String!
description - String
imageMetadata - ImageMetadata
status - HostImageStatus!
currentSandbox - HostImageSandbox
team - Team
usedInTracks - [Track!]!
usedInSandboxConfigVersions - [SandboxConfigVersion!]!
createdAt - Time!
createdBy - User!
createdWith - HostImageVMInputs
Example
{
  "id": 4,
  "slug": "abc123",
  "description": "xyz789",
  "imageMetadata": ImageMetadata,
  "status": "created",
  "currentSandbox": HostImageSandbox,
  "team": Team,
  "usedInTracks": [Track],
  "usedInSandboxConfigVersions": [SandboxConfigVersion],
  "createdAt": "10:15:30Z",
  "createdBy": User,
  "createdWith": HostImageVMInputs
}

HostImageInput

Fields
Input Field Description
id - ID
slug - String
description - String
teamID - ID
Example
{
  "id": 4,
  "slug": "xyz789",
  "description": "xyz789",
  "teamID": "4"
}

HostImageSandbox

Fields
Field Name Description
id - ID!
terminalUrl - String!
editorUrl - String!
sandbox - Sandbox!
Example
{
  "id": "4",
  "terminalUrl": "abc123",
  "editorUrl": "abc123",
  "sandbox": Sandbox
}

HostImageStatus

Values
Enum Value Description

created

saved

Example
"created"

HostImageVMConfigInput

Fields
Input Field Description
image - String!
region - String!
shell - String
cpus - Int!
memory - Int!
diskSizeGB - Int
Example
{
  "image": "abc123",
  "region": "xyz789",
  "shell": "xyz789",
  "cpus": 123,
  "memory": 987,
  "diskSizeGB": 987
}

HostImageVMInputs

Fields
Field Name Description
id - ID!
baseImage - String
shell - String
cpus - Int
memory - Int
diskSizeGB - Int
hostImage - HostImage
Example
{
  "id": "4",
  "baseImage": "abc123",
  "shell": "xyz789",
  "cpus": 987,
  "memory": 987,
  "diskSizeGB": 123,
  "hostImage": HostImage
}

HotStartConfigTrackEdge

Fields
Field Name Description
claimed - Int! The amount of claimed sandboxes.
available - Int! The amount of available sandboxes.
created - Int! The amount of created sandboxes.
failed - Int! The amount of sandboxes that failed to create.
creating - Int! The amount of sandboxes currently being created.
total - Int! The total amount of sandboxes.
node - SandboxConfig! The config version node
Example
{
  "claimed": 987,
  "available": 987,
  "created": 123,
  "failed": 123,
  "creating": 123,
  "total": 123,
  "node": SandboxConfig
}

HotStartPool

Description

A hot start pool manages the hot sandboxes available per track

Fields
Field Name Description
id - ID! ID of the hot start pool
type - HotStartPoolType! The type of hot start pool
size - Int! Number of sandboxes available per track
created - Time Creation time of the hot start pool
deleted - Time Deletion time of the hot start pool
name - String! Name given to the hot start pool
auto_refill - Boolean! Flag that signals if the sandboxes should be auto refillable
starts_at - Time Schedule time for the hot start pool to start creating sandboxes
ends_at - Time Schedule time for the hot start pool to stop creating sandboxes
created_by - User The user that created the pool
team - Team! The team that owns the hot start pool
tracks - [HotStartPoolTrackEdge!]! Tracks in the hot start pool
configs - [HotStartConfigTrackEdge!]! Tracks in the hot start pool
status - HotStartStatus! Status of the hot start pool
region - String Region of a hotstart pool
Example
{
  "id": 4,
  "type": "dedicated",
  "size": 987,
  "created": "10:15:30Z",
  "deleted": "10:15:30Z",
  "name": "abc123",
  "auto_refill": false,
  "starts_at": "10:15:30Z",
  "ends_at": "10:15:30Z",
  "created_by": User,
  "team": Team,
  "tracks": [HotStartPoolTrackEdge],
  "configs": [HotStartConfigTrackEdge],
  "status": "Running",
  "region": "xyz789"
}

HotStartPoolConnection

Fields
Field Name Description
edges - [HotStartPoolEdge!]! A list of edges containing cursors to each node.
nodes - [HotStartPool!]! A list of nodes.
pageInfo - PageInfo! Pagination information.
totalCount - Int! Total items in the current result set.
Example
{
  "edges": [HotStartPoolEdge],
  "nodes": [HotStartPool],
  "pageInfo": PageInfo,
  "totalCount": 123
}

HotStartPoolEdge

Fields
Field Name Description
cursor - String! Cursor to the current node.
node - HotStartPool The current node.
Example
{
  "cursor": "xyz789",
  "node": HotStartPool
}

HotStartPoolInput

Description

A hot start pool is a pool of sandboxes available before the tracks start

Fields
Input Field Description
type - HotStartPoolType The type of hotstart pool
tracks - [String!] List of track IDs
configs - [String!] List of config IDs
size - Int The amount of sandboxes per track
name - String Name of the hot start pool
auto_refill - Boolean If the pool should be auto refilled
starts_at - Time Scheduled time for the pool to start creating sandboxes
ends_at - Time Scheduled time for the pool to start stopping sandboxes
organization_slug - String Organization Slug of the organization creating the pool
team_slug - String Team Slug of the organization creating the pool
region - String Region of the hotstart pool
Example
{
  "type": "dedicated",
  "tracks": ["xyz789"],
  "configs": ["xyz789"],
  "size": 987,
  "name": "xyz789",
  "auto_refill": false,
  "starts_at": "10:15:30Z",
  "ends_at": "10:15:30Z",
  "organization_slug": "xyz789",
  "team_slug": "abc123",
  "region": "xyz789"
}

HotStartPoolTrackEdge

Fields
Field Name Description
claimed - Int! The amount of claimed sandboxes.
available - Int! The amount of available sandboxes.
created - Int! The amount of created sandboxes.
failed - Int! The amount of sandboxes that failed to create.
creating - Int! The amount of sandboxes currently being created.
total - Int! The total amount of sandboxes.
node - Track! The track node
Example
{
  "claimed": 123,
  "available": 123,
  "created": 123,
  "failed": 987,
  "creating": 987,
  "total": 123,
  "node": Track
}

HotStartPoolType

Values
Enum Value Description

dedicated

shared

Example
"dedicated"

HotStartStatus

Values
Enum Value Description

Running

Provisioning

Inactive

Expired

Deleted

AutoRefill

Example
"Running"

HtmlElement

Description

Represents a criterium to match against

Fields
Field Name Description
selector - String! The CSS selector of the element
value - String! The expected value of the element
errorMsg - String The custom error message that will be displayed if the check fails
Example
{
  "selector": "xyz789",
  "value": "abc123",
  "errorMsg": "xyz789"
}

HtmlElementInput

Fields
Input Field Description
selector - String!
value - String!
errorMsg - String
Example
{
  "selector": "xyz789",
  "value": "xyz789",
  "errorMsg": "abc123"
}

ID

Description

The ID scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as "4") or integer (such as 4) input value will be accepted as an ID.

Example
"4"

ImageMetadata

Fields
Field Name Description
id - ID!
image - String!
os - ImageOS
diskSizeGB - Int
Example
{
  "id": "4",
  "image": "xyz789",
  "os": "windows",
  "diskSizeGB": 987
}

ImageOS

Values
Enum Value Description

windows

linux

Example
"windows"

ImportTerraformModuleInput

Fields
Input Field Description
terraformModuleID - String! id of the terraform module
name - String name of the custom resource
slug - String slug of the custom resource
description - String description of the custom resource
Example
{
  "terraformModuleID": "abc123",
  "name": "abc123",
  "slug": "abc123",
  "description": "xyz789"
}

Insights

Description

An Insights has list of different insights

Fields
Field Name Description
play - PlayInsight!
track - TrackInsight!
Example
{
  "play": PlayInsight,
  "track": TrackInsight
}

Int

Description

The Int scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.

Example
987

Integrations

Fields
Field Name Description
paragon - ParagonIntegration!
Example
{"paragon": ParagonIntegration}

InviteClaim

Description

A claim is a used that has accepted an invite

Fields
Field Name Description
id - ID! Unique ID
username - String! Username of the user that has accepted the invite Replaced by user object
user - User! The user that has accepted the invite
trackInvite - TrackInvite The invite associated with this claim
playLimit - Int The number of plays the end user is allowed to do
playCount - Int! The number of plays the end user has done
playTTL - Time The TTL until when the end user can play the track
claimedAt - Time When the user claimed the invite
customParameters - [CustomParameter!]! Custom parameters associated with this claim
events - [InviteEvent!]! A list of events for this track
trackLibrary - [TrackLibraryEntry!]! The list of library entries for the claim
Example
{
  "id": "4",
  "username": "xyz789",
  "user": User,
  "trackInvite": TrackInvite,
  "playLimit": 987,
  "playCount": 123,
  "playTTL": "10:15:30Z",
  "claimedAt": "10:15:30Z",
  "customParameters": [CustomParameter],
  "events": [InviteEvent],
  "trackLibrary": [TrackLibraryEntry]
}

InviteEvent

Description

An event stores the timestamp and status of an invite

Fields
Field Name Description
participantID - String participantID of the event
time - Time! Time of the event
status - InviteStatus! Status of the event
message - String! Message of the event
track - Track Track of the event
challenge - Challenge Challenge of the event
Example
{
  "participantID": "abc123",
  "time": "10:15:30Z",
  "status": "invited",
  "message": "xyz789",
  "track": Track,
  "challenge": Challenge
}

InviteFilterStatus

Description

InviteFilterStatus options

Values
Enum Value Description

active

Active invites

upcoming

Upcoming invites

expired

Expired invites

all

All invites
Example
"active"

InviteFilters

Description

InviteFilters applies filters to the invite

Fields
Input Field Description
status - InviteFilterStatus Status filters the invite status. Deprecated: Use statuses.
statuses - [TrackInviteStatus!] Status filters the invite status
Example
{"status": "active", "statuses": ["active"]}

InvitePlay

Description

InvitePlay the metadata of a user's track play.

Fields
Field Name Description
participant - Play! The play.
track_started_at - Time! The instant the track was started.
track_completed_at - Time The instant the track was completed.
total_challenges - Int! The amount of challenges associated with the track.
completed_challenges - Int! Number of completed challenges.
failed_challenge_attempts - Int! The number of failed challenge attempts.
last_activity - Time! The last instant the user was active on this track.
track - Track! The track that the user played.
time_spent - Int! The time spent on this play in seconds.
user - User! The user.
Example
{
  "participant": Play,
  "track_started_at": "10:15:30Z",
  "track_completed_at": "10:15:30Z",
  "total_challenges": 987,
  "completed_challenges": 123,
  "failed_challenge_attempts": 987,
  "last_activity": "10:15:30Z",
  "track": Track,
  "time_spent": 123,
  "user": User
}

InviteStatus

Description

InviteStatus enumerated the status of the invite

Values
Enum Value Description

invited

User has accepted the invite invited was ambiguous, use 'accessed' instead.

accessed

User has accessed the invite

started

User has started the track

stopped

User has stopped the track

created

User has created the track

completed

User has completed the track

attempted

User has attempted to solve the challange

skipped

User has skipped the challenge
Example
"invited"

LTICredentials

Fields
Field Name Description
id - ID! The id of the LTI credentials.
consumer_name - String! The consumer name of LTI credentials.
consumer_key - String! The consumer key of LTI credentials.
instruqt_public_key - String! The public key of LTI credentials.
instruqt_public_key_set_url - String! The set URL of LTI credentials.
instruqt_login_url - String! The login URL of LTI credentials.
Example
{
  "id": "4",
  "consumer_name": "abc123",
  "consumer_key": "abc123",
  "instruqt_public_key": "xyz789",
  "instruqt_public_key_set_url": "abc123",
  "instruqt_login_url": "abc123"
}

LabConfig

Fields
Field Name Description
overlay - Boolean! Defines if the assignment side bar for the track's lab will overlay on top of the content
width - Int! The amount of space the asignment side bar will take for the track's lab
position - String! Where in the screen will the assignment side bar show
extendTTL - Int The seconds lab can be extended for
hideStopButton - Boolean! Whether to present a stop button to learners
enableLoadingMessages - Boolean! Whether to show loading messages (e.g. "Beep boop beep... loading...")
loadingMessages - [String!]! The loading messages to show when the lab is loading
sidebarEnabled - Boolean! Whether to show the sidebar on all challenges
feedbackTabEnabled - Boolean! Whether to show the feedback tab on all challenges
feedbackRecapEnabled - Boolean! Whether to show the feedback screen on the recap screen at the end of a track
labV2 - Boolean Is new lab layout v2 enabled for this track
theme - TrackTheme The track lab theme.
overrideChallengeLayout - Boolean The flag indicates whether the challenge layout should be overridden
defaultLayout - DefaultLabLayout The default layout for the track layout
defaultLayoutSidebarSize - Int The default size of the sidebar in the default layout
Example
{
  "overlay": false,
  "width": 987,
  "position": "xyz789",
  "extendTTL": 123,
  "hideStopButton": true,
  "enableLoadingMessages": false,
  "loadingMessages": ["abc123"],
  "sidebarEnabled": true,
  "feedbackTabEnabled": true,
  "feedbackRecapEnabled": true,
  "labV2": false,
  "theme": TrackTheme,
  "overrideChallengeLayout": false,
  "defaultLayout": "AssignmentRight",
  "defaultLayoutSidebarSize": 123
}

LabConfigInput

Fields
Input Field Description
overlay - Boolean The lab's assignement side pannel overlays on top of the content
width - Int The width the assignment side pannel starts with
position - String The position the side pannel starts on
extendTTL - Int The amount of time the sandbox will be extended
hideStopButton - Boolean Whether to present a stop button to learners
enableLoadingMessages - Boolean Whether to show loading messages (e.g. "Beep boop beep... loading...")
loadingMessages - [String!] loadingMessages is a list of messages to show while loading
sidebarEnabled - Boolean Whether to show the sidebar on all challenges
feedbackTabEnabled - Boolean Whether to show the feedback tab for all challenges
feedbackRecapEnabled - Boolean Whether to show the feedback screen on the recap screen at the end of a track
labV2 - Boolean The flag that indicates if the track is using the new lab layout
theme - TrackThemeInput The v2 lab layout theme
overrideChallengeLayout - Boolean The flag indicates whether the challenge layout should be overridden
defaultLayout - DefaultLabLayout The default layout for the track layout
defaultLayoutSidebarSize - Int The default size of the sidebar in the default layout
Example
{
  "overlay": true,
  "width": 987,
  "position": "abc123",
  "extendTTL": 987,
  "hideStopButton": true,
  "enableLoadingMessages": false,
  "loadingMessages": ["xyz789"],
  "sidebarEnabled": true,
  "feedbackTabEnabled": false,
  "feedbackRecapEnabled": false,
  "labV2": true,
  "theme": TrackThemeInput,
  "overrideChallengeLayout": true,
  "defaultLayout": "AssignmentRight",
  "defaultLayoutSidebarSize": 987
}

LabLayoutBranchChildInput

Fields
Input Field Description
branch - LabLayoutBranchInput
leaf - LabLayoutLeafInput
Example
{
  "branch": LabLayoutBranchInput,
  "leaf": LabLayoutLeafInput
}

LabLayoutBranchInput

Fields
Input Field Description
children - [LabLayoutBranchChildInput!]!
split - LabLayoutSplit!
size - String
Example
{
  "children": [LabLayoutBranchChildInput],
  "split": "Vertical",
  "size": "xyz789"
}

LabLayoutInput

Description

Input values for lab layout

Fields
Input Field Description
root - LabLayoutBranchInput!
Example
{"root": LabLayoutBranchInput}

LabLayoutLeafInput

Fields
Input Field Description
tabs - [String!]!
activeTabId - String!
size - String
Example
{
  "tabs": ["xyz789"],
  "activeTabId": "abc123",
  "size": "abc123"
}

LabLayoutSplit

Values
Enum Value Description

Vertical

Horizontal

Example
"Vertical"

LandingPage

Fields
Field Name Description
id - ID!
team - Team!
internalPageName - String
path - String!
archivedAt - Time
publishedAt - Time
updatedAt - Time
trackPlayLimit - Int
formEnabled - Boolean!
privacyPolicyUrl - String
termsAndConditionsUrl - String
pageTitle - String
seoDescription - String
robotsIndexingEnabled - Boolean!
backgroundColor - String
textColor - String
logoUrl - String
logoLink - String
pageHeading - String
pageSubtitle - String
linkedInUrl - String
xUrl - String
youtubeUrl - String
githubUrl - String
slackUrl - String
tracks - [LandingPageTrackEdge!]!
Example
{
  "id": "4",
  "team": Team,
  "internalPageName": "abc123",
  "path": "xyz789",
  "archivedAt": "10:15:30Z",
  "publishedAt": "10:15:30Z",
  "updatedAt": "10:15:30Z",
  "trackPlayLimit": 987,
  "formEnabled": true,
  "privacyPolicyUrl": "xyz789",
  "termsAndConditionsUrl": "xyz789",
  "pageTitle": "xyz789",
  "seoDescription": "abc123",
  "robotsIndexingEnabled": true,
  "backgroundColor": "abc123",
  "textColor": "xyz789",
  "logoUrl": "abc123",
  "logoLink": "xyz789",
  "pageHeading": "abc123",
  "pageSubtitle": "abc123",
  "linkedInUrl": "xyz789",
  "xUrl": "abc123",
  "youtubeUrl": "xyz789",
  "githubUrl": "xyz789",
  "slackUrl": "abc123",
  "tracks": [LandingPageTrackEdge]
}

LandingPageInput

Fields
Input Field Description
id - ID
teamId - ID
internalPageName - String
path - String
archivedAt - Time
publishedAt - Time
trackPlayLimit - Int
formEnabled - Boolean
privacyPolicyUrl - String
termsAndConditionsUrl - String
pageTitle - String
seoDescription - String
robotsIndexingEnabled - Boolean
backgroundColor - String
textColor - String
logoUrl - String
logoLink - String
pageHeading - String
pageSubtitle - String
linkedInUrl - String
xUrl - String
youtubeUrl - String
githubUrl - String
slackUrl - String
tracks - [LandingPageTrackInput!]
Example
{
  "id": "4",
  "teamId": 4,
  "internalPageName": "xyz789",
  "path": "xyz789",
  "archivedAt": "10:15:30Z",
  "publishedAt": "10:15:30Z",
  "trackPlayLimit": 123,
  "formEnabled": false,
  "privacyPolicyUrl": "xyz789",
  "termsAndConditionsUrl": "xyz789",
  "pageTitle": "abc123",
  "seoDescription": "abc123",
  "robotsIndexingEnabled": true,
  "backgroundColor": "xyz789",
  "textColor": "xyz789",
  "logoUrl": "abc123",
  "logoLink": "xyz789",
  "pageHeading": "xyz789",
  "pageSubtitle": "abc123",
  "linkedInUrl": "abc123",
  "xUrl": "xyz789",
  "youtubeUrl": "abc123",
  "githubUrl": "abc123",
  "slackUrl": "xyz789",
  "tracks": [LandingPageTrackInput]
}

LandingPageTrackEdge

Fields
Field Name Description
id - ID!
node - Track!
index - Int
thumbnailUrl - String
Example
{
  "id": "4",
  "node": Track,
  "index": 987,
  "thumbnailUrl": "xyz789"
}

LandingPageTrackInput

Fields
Input Field Description
trackId - ID
thumbnailUrl - String
Example
{
  "trackId": "4",
  "thumbnailUrl": "xyz789"
}

LearnersReachedSeries

Fields
Field Name Description
min - Int!
max - Int!
sum - Int!
items - [LearnersReachedSeriesItem!]!
Example
{
  "min": 987,
  "max": 987,
  "sum": 123,
  "items": [LearnersReachedSeriesItem]
}

LearnersReachedSeriesItem

Fields
Field Name Description
bucketStartTime - Time!
value - Int!
Example
{
  "bucketStartTime": "10:15:30Z",
  "value": 123
}

LearningPath

Description

A Learning path is a set of courses

Fields
Field Name Description
id - ID! Unique ID
slug - String! Slug. This will be visible in the address bar of the browser
owner - String! Slug of the team that owns the learning path
permalink - String! Permalink will be generated automatically, based on the slug of the learning path
title - String! Learning Path Title
teaser - String! Short Teaser for the learning path
description - String! Description of the learning path
image - String! Hero image, must be a URL to an image
level - Level! Level defines the for what skill level the learning path is designed
published - Boolean! Published defines whether the learning path is published
preview - Boolean! Preview defines whether the learning path is in preview or not
accessible - Boolean! Accessible defines whether the learning path is accessible for the user, and thus is ready to play
courses - [Track!]! List of courses that are part of this learning path
authors - [User!]! List of authors for this learning path
access_type - LearningPathAccessType The reason this user has access to this learning path. Empty if the user has no access.
Example
{
  "id": "4",
  "slug": "xyz789",
  "owner": "abc123",
  "permalink": "xyz789",
  "title": "abc123",
  "teaser": "abc123",
  "description": "abc123",
  "image": "abc123",
  "level": "beginner",
  "published": false,
  "preview": true,
  "accessible": false,
  "courses": [Track],
  "authors": [User],
  "access_type": "purchased"
}

LearningPathAccessType

Description

The reason a user has access to a learning path.

Values
Enum Value Description

purchased

One of the user's teams purchased this content.

owner

One of the user's teams is the owner of this learning path.
Example
"purchased"

LearningPathInput

Description

A Learning path is a set of courses

Fields
Input Field Description
id - ID Unique ID
slug - String Slug. This will be visible in the address bar of the browser
owner - String Slug of the organization that owns the learning path
title - String Learning Path Title
teaser - String Short Teaser for the learning path
description - String Description of the learning path
image - String Hero image, must be a URL to an image
level - Level Level defines the for what skill level the learning path is designed
published - Boolean Published defines whether the learning path is published
preview - Boolean Preview defines whether the learning path is in preview or not
courses - [String!] List of course slugs that are part of this learning path
authors - [String!] List of authors (by email) for this learning path
Example
{
  "id": "4",
  "slug": "xyz789",
  "owner": "abc123",
  "title": "xyz789",
  "teaser": "xyz789",
  "description": "abc123",
  "image": "abc123",
  "level": "beginner",
  "published": false,
  "preview": true,
  "courses": ["xyz789"],
  "authors": ["abc123"]
}

LearningPathProgress

Fields
Field Name Description
last_played_at - Time The last time this learning path was played.
completed - Boolean! Whether the user has completed all the tracks belonging to this learning path.
completed_tracks - Int! The number of tracks the user has completed.
learning_path - LearningPath! The learning path.
Example
{
  "last_played_at": "10:15:30Z",
  "completed": false,
  "completed_tracks": 123,
  "learning_path": LearningPath
}

Level

Description

Level defines the skill level, that is used in Learning Paths and Courses/Tracks

Values
Enum Value Description

beginner

intermediate

expert

Example
"beginner"

Location

Description

Represents a browser URL criterium to match against

Fields
Field Name Description
errorMsg - String The custom error message that will be displayed if none of the URLs match
conditions - [UrlCondition!]! URLs to match against together with their string matching rules
Example
{
  "errorMsg": "abc123",
  "conditions": [UrlCondition]
}

LocationCheckConditionInput

Fields
Input Field Description
urlPart - String!
condition - ConditionType!
Example
{"urlPart": "xyz789", "condition": "equals"}

LocationCheckInput

Fields
Input Field Description
errorMsg - String Error message if any of the conditions don't match
conditions - [LocationCheckConditionInput!] All conditions must be met for check to pass
Example
{
  "errorMsg": "abc123",
  "conditions": [LocationCheckConditionInput]
}

LtiToolRegistration

Fields
Field Name Description
id - ID!
name - String!
teamID - String!
issuer - String!
clientID - String!
keySetURL - String!
publicKey - String!
accessTokenURL - String!
authURL - String!
deploymentIDs - [String!]!
Example
{
  "id": 4,
  "name": "abc123",
  "teamID": "abc123",
  "issuer": "xyz789",
  "clientID": "xyz789",
  "keySetURL": "xyz789",
  "publicKey": "xyz789",
  "accessTokenURL": "abc123",
  "authURL": "abc123",
  "deploymentIDs": ["abc123"]
}

LtiToolRegistrationInput

Fields
Input Field Description
name - String!
issuer - String!
clientID - String!
keySetURL - String
publicKey - String
accessTokenURL - String!
authURL - String!
deploymentIDs - [String!]!
Example
{
  "name": "abc123",
  "issuer": "abc123",
  "clientID": "xyz789",
  "keySetURL": "xyz789",
  "publicKey": "abc123",
  "accessTokenURL": "xyz789",
  "authURL": "abc123",
  "deploymentIDs": ["xyz789"]
}

MachineTypePreset

Description

A MachineTypePreset defines an instruqt machine type.

Fields
Field Name Description
label - String! The label of the machine type preset
memory - Int! The amount of memory for the machine in MB
cpus - Int! The amount of cpus for the machine
Example
{
  "label": "xyz789",
  "memory": 987,
  "cpus": 123
}

Mode

Description

The mode in which a play was started.

Values
Enum Value Description

embed

Embedded play

platform

Platform play

test

CI test play
Example
"embed"

Ordering

Description

Parameters to sort a result set.

Fields
Input Field Description
orderBy - String! The column to sort by.
direction - Direction The sort direction to use, either Asc or Desc.
Example
{"orderBy": "abc123", "direction": "Asc"}

Organization

Description

An organization has members, and owns topics and tracks

Fields
Field Name Description
id - ID! Unique ID
members - [OrganizationMember!]! List of members TODO: IN-364 Remove deprecated members field from organization. use users field
users - [OrganizationUserEdge!] List of users
name - String! Name of the organization
logo - String Logo of the organization
title - String Title of the organization
subtitle - String Subtitle of the organization
slug - String! Slug of the organization
primary_link_text - String Text of the primary link of the organization
primary_link_url - String URL of the primary link of the organization
secondary_link_text - String Text of the secondary link of the organization
secondary_link_url - String URL of the secondary link of the organization
api_key - String API Key for the organization
theme - OrganizationTheme The theme that is used to style the organization page
personal - Boolean Whether the organization is personal or not
features - OrganizationFeatures The list of features that an organization can access or use
invited - [String!]! Invited shows a list of email addresses that are invites TODO: IN-378 Remove deprecated field. use field invites
invites - [OrganizationInvite!] A list of active invites for this organization
privacy_policy - String The URL of the organization's privacy policy, if any.
webhook_dashboard_url - String! The one time use URL for the Svix dashboard to configure webhook endpoints.
created_at - Time The time the organization was created at.
customer_since - Time The time the organization has become a customer at.
trial_end_at - Time The time the organization's trial terminates.
Example
{
  "id": 4,
  "members": [OrganizationMember],
  "users": [OrganizationUserEdge],
  "name": "abc123",
  "logo": "xyz789",
  "title": "abc123",
  "subtitle": "xyz789",
  "slug": "xyz789",
  "primary_link_text": "xyz789",
  "primary_link_url": "xyz789",
  "secondary_link_text": "xyz789",
  "secondary_link_url": "xyz789",
  "api_key": "xyz789",
  "theme": OrganizationTheme,
  "personal": true,
  "features": OrganizationFeatures,
  "invited": ["xyz789"],
  "invites": [OrganizationInvite],
  "privacy_policy": "xyz789",
  "webhook_dashboard_url": "xyz789",
  "created_at": "10:15:30Z",
  "customer_since": "10:15:30Z",
  "trial_end_at": "10:15:30Z"
}

OrganizationFeatures

Description

OrganizationFeatures define what features are enabled for an organization

Fields
Field Name Description
max_tracks - Int! The maximum number of tracks that can be created
max_timelimit - Int! The maximum timelimit for a single track
max_hot_start_pool_size_always_on - Int! The maximum size of an always on hot start pool
max_hot_start_pool_size_scheduled - Int! The maximum size of a scheduled hot start pool
containers - Boolean! Whether containers can be used
virtual_machines - Boolean! Whether virtual machines can be used
gcp_projects - Boolean! Whether GCP projects can be used
aws_accounts - Boolean! Whether AWS accounts can be used
azure_subscriptions - Boolean! Whether Azure subscriptions can be used
embedded - Boolean! Whether tracks can be embedded in other pages
members_skip_to_challenge - Boolean! Whether organization members can skip to a challenge
track_reviews - Boolean! Whether students can leave a track review after finishing a track.
accept_terms_checkbox - Boolean! Whether the user has a custom invite with the terms of service
hot_start - Boolean! Whether hot start is enabled for this organization
Example
{
  "max_tracks": 123,
  "max_timelimit": 123,
  "max_hot_start_pool_size_always_on": 987,
  "max_hot_start_pool_size_scheduled": 987,
  "containers": true,
  "virtual_machines": true,
  "gcp_projects": true,
  "aws_accounts": true,
  "azure_subscriptions": true,
  "embedded": true,
  "members_skip_to_challenge": true,
  "track_reviews": true,
  "accept_terms_checkbox": false,
  "hot_start": true
}

OrganizationInput

Description

An organization has members, and owns topics and tracks

Fields
Input Field Description
id - ID Unique ID
slug - String Slug of the organization
name - String Name of the organization
logo - String Logo of the organization
title - String Title of the organization
subtitle - String Subtitle of the organization
customer_since - Time time when the organization became a customer
trial_end_at - Time instant at which the organization's ends / ended
primary_link_text - String Text of the primary link of the organization
primary_link_url - String URL of the primary link of the organization
secondary_link_text - String Text of the secondary link of the organization
secondary_link_url - String URL of the secondary link of the organization
theme - OrganizationThemeInput The theme that is used to style the organization page
Example
{
  "id": 4,
  "slug": "xyz789",
  "name": "xyz789",
  "logo": "abc123",
  "title": "xyz789",
  "subtitle": "abc123",
  "customer_since": "10:15:30Z",
  "trial_end_at": "10:15:30Z",
  "primary_link_text": "abc123",
  "primary_link_url": "xyz789",
  "secondary_link_text": "abc123",
  "secondary_link_url": "xyz789",
  "theme": OrganizationThemeInput
}

OrganizationInvite

Description

OrganizationInvite represents an outstanding invite for an email address to join the organization

Fields
Field Name Description
email - String! The email of the invite
role - RoleName! The role that the user will get when accepting the invite
token_expired - Boolean! Whether the token in the email invite has expired
organization - Organization The organization this invite belongs to
accepted_at - Time The time the invite was accepted
created_by - User The user the invite was created by
Example
{
  "email": "abc123",
  "role": "owner",
  "token_expired": false,
  "organization": Organization,
  "accepted_at": "10:15:30Z",
  "created_by": User
}

OrganizationMember

Description

Member of an organization TODO: IN-364 Remove deprecated type.

Fields
Field Name Description
id - ID! The user's ID use field user
profile - UserProfile The user's profile use field user
user - User! The user
role - RoleName! The user's role in the organization
Example
{
  "id": "4",
  "profile": UserProfile,
  "user": User,
  "role": "owner"
}

OrganizationSeries

Fields
Field Name Description
date - String!
started - Int!
completed - Int!
Example
{
  "date": "abc123",
  "started": 987,
  "completed": 987
}

OrganizationStatistics

Fields
Field Name Description
started_total - Int
completed_total - Int
restarted_total - Int
organization_series - [OrganizationSeries!]!
track_statistics - [TrackStatistics!]!
Example
{
  "started_total": 987,
  "completed_total": 987,
  "restarted_total": 123,
  "organization_series": [OrganizationSeries],
  "track_statistics": [TrackStatistics]
}

OrganizationTheme

Description

An OrganizationTeme defines the look and feel for an organization

Fields
Field Name Description
foreground_color - String The color used for the text in the header
foreground_image - String The image that is shown in the header
background_color - String The color used for the background of the header
background_image - String The image used for the background of the header
primary_foreground_color - String The color used for the text of the primary button
primary_background_color - String The color used for the background of the primary button
secondary_foreground_color - String The color used for the text of the secondary button
secondary_background_color - String The color used for the background of the secondary button
Example
{
  "foreground_color": "xyz789",
  "foreground_image": "abc123",
  "background_color": "xyz789",
  "background_image": "abc123",
  "primary_foreground_color": "abc123",
  "primary_background_color": "abc123",
  "secondary_foreground_color": "abc123",
  "secondary_background_color": "xyz789"
}

OrganizationThemeInput

Fields
Input Field Description
foreground_color - String The color used for the text in the header
foreground_image - String The image that is shown in the header
background_color - String The color used for the background of the header
background_image - String The image used for the background of the header
primary_foreground_color - String The color used for the text of the primary button
primary_background_color - String The color used for the background of the primary button
secondary_foreground_color - String The color used for the text of the secondary button
secondary_background_color - String The color used for the background of the secondary button
Example
{
  "foreground_color": "xyz789",
  "foreground_image": "abc123",
  "background_color": "xyz789",
  "background_image": "xyz789",
  "primary_foreground_color": "abc123",
  "primary_background_color": "xyz789",
  "secondary_foreground_color": "xyz789",
  "secondary_background_color": "abc123"
}

OrganizationUserEdge

Description

Represents the user's which are member of an organization.

Fields
Field Name Description
id - ID! ID of this edge; the compound of the org ID and the user ID.
node - User! The target user.
role - RoleName! The user's role within this organization.
Example
{
  "id": "4",
  "node": User,
  "role": "owner"
}

PageInfo

Description

Information about pagination in a connection.

Fields
Field Name Description
endCursor - String When paginating forwards, the cursor to continue.
hasNextPage - Boolean! When paginating forwards, are there more items?
hasPreviousPage - Boolean! When paginating backwards, are there more items?
startCursor - String When paginating backwards, the cursor to continue.
Example
{
  "endCursor": "abc123",
  "hasNextPage": true,
  "hasPreviousPage": true,
  "startCursor": "abc123"
}

Pagination

Description

Parameters to paginate a result set.

Fields
Input Field Description
First - Int
After - String
Example
{"First": 987, "After": "xyz789"}

ParagonIntegration

Fields
Field Name Description
projectID - String The project ID of Paragon that is used for authentication
token - String The project ID of Paragon that is used for authentication
Example
{
  "projectID": "xyz789",
  "token": "xyz789"
}

Play

Description

Play is the domain model of a user's journey through a track.

Fields
Field Name Description
id - ID! The ID of this user's play.
user - User The user of a play.
track - Track The track of a play.
startedAt - Time The time of track start
mode - Mode The way this track was played
ttlExtendedByUser - Boolean! TTL has been extended by the user
track_invite - TrackInvite The track invitation of a play.
hotStartPool - HotStartPool The hot start pool used for the play, if the track was hot started.
customParameters - [CustomParameter!]! Custom parameters associated with this play.
Example
{
  "id": "4",
  "user": User,
  "track": Track,
  "startedAt": "10:15:30Z",
  "mode": "embed",
  "ttlExtendedByUser": false,
  "track_invite": TrackInvite,
  "hotStartPool": HotStartPool,
  "customParameters": [CustomParameter]
}

PlayActivity

Description

Events for play user's activity log

Fields
Field Name Description
challenge - Challenge Challange from play, where event was triggered
time - Time! Time of event trigger
message - String! Description message of activity
Example
{
  "challenge": Challenge,
  "time": "10:15:30Z",
  "message": "xyz789"
}

PlayInsight

Fields
Field Name Description
series - PlayInsightSeries!
Arguments
Example
{"series": PlayInsightSeries}

PlayInsightSeries

Fields
Field Name Description
granularity - TimeSeriesGranularity!
plays - PlaySeries!
learnersReached - LearnersReachedSeries!
timeSpent - TimeSpentSeries!
completionRate - CompletionRateSeries!
Example
{
  "granularity": "HOURLY",
  "plays": PlaySeries,
  "learnersReached": LearnersReachedSeries,
  "timeSpent": TimeSpentSeries,
  "completionRate": CompletionRateSeries
}

PlayInsightSeriesInput

Description

Input types for track table

Fields
Input Field Description
dateRangeFilter - DateRangeFilter Date range filter for plays
trackIds - [String!] IDs of tracks for which we want to get plays
trackAuthorIds - [String!] IDs of track auhtors as context
tagIds - [String!] IDs of content tags for context
trackInviteIds - [String!] track invite IDs for context
landingPageIds - [String!] Landing page IDs for context
playType - PlayType! Filter for play type
granularity - TimeSeriesGranularity Specify which granularity the time series should return
Example
{
  "dateRangeFilter": DateRangeFilter,
  "trackIds": ["abc123"],
  "trackAuthorIds": ["xyz789"],
  "tagIds": ["xyz789"],
  "trackInviteIds": ["abc123"],
  "landingPageIds": ["abc123"],
  "playType": "ALL",
  "granularity": "HOURLY"
}

PlayReportInput

Description

PlayInput defines input for plays for team tracks

Fields
Input Field Description
teamSlug - String! Slug of a team for which we want to get plays
dateRangeFilter - DateRangeFilter Date range filter for plays
trackIds - [String!] IDs of tracks for which we want to get plays
trackInviteIds - [String!] Track invite IDs to filter on
landingPageIds - [String!] Landing page IDs to filter on
tags - [String!] Track tags to filter on
customParameterFilters - [CustomParameterFilter!] Filter for custom parameters
userIds - [String!] IDs of users as context
ordering - Ordering Sorting parameters
pagination - SkipTakePagination Pagination parameters
playType - PlayType Filter for play type
Example
{
  "teamSlug": "xyz789",
  "dateRangeFilter": DateRangeFilter,
  "trackIds": ["xyz789"],
  "trackInviteIds": ["xyz789"],
  "landingPageIds": ["xyz789"],
  "tags": ["abc123"],
  "customParameterFilters": [CustomParameterFilter],
  "userIds": ["xyz789"],
  "ordering": Ordering,
  "pagination": SkipTakePagination,
  "playType": "ALL"
}

PlayReportItem

Description

Play is the domain model of a user's journey through a track.

Fields
Field Name Description
id - ID! The ID of this user's play.
trackInvite - TrackInvite The track invitation of a play.
hotStartPool - HotStartPool The hot start pool used for the play, if the track was hot started.
customParameters - [CustomParameter!]! Custom parameters associated with this play.
track - Track! Track associated with this play
user - User! User associated with this play
completionPercent - Float! Percentage of play chellenges completed in track
timeSpent - Int! Time spent on play
activity - [PlayActivity!]! Log of activities in play
playReview - TrackReview The review of the user for the play
totalChallenges - Int! The number of all the challenges of a user
completedChallenges - Int! The number of the completed challenges of a user in all plays
startedAt - Time The time of track start
mode - Mode The way this track was played
stoppedReason - String The reason the track was stopped
Example
{
  "id": 4,
  "trackInvite": TrackInvite,
  "hotStartPool": HotStartPool,
  "customParameters": [CustomParameter],
  "track": Track,
  "user": User,
  "completionPercent": 123.45,
  "timeSpent": 123,
  "activity": [PlayActivity],
  "playReview": TrackReview,
  "totalChallenges": 123,
  "completedChallenges": 987,
  "startedAt": "10:15:30Z",
  "mode": "embed",
  "stoppedReason": "abc123"
}

PlayReportPage

Fields
Field Name Description
items - [PlayReportItem!]!
totalItems - Int!
Example
{"items": [PlayReportItem], "totalItems": 987}

PlaySeries

Fields
Field Name Description
min - Int!
max - Int!
sum - Int!
items - [PlaySeriesItem!]!
Example
{
  "min": 987,
  "max": 123,
  "sum": 123,
  "items": [PlaySeriesItem]
}

PlaySeriesItem

Fields
Field Name Description
bucketStartTime - Time!
value - Int!
Example
{
  "bucketStartTime": "10:15:30Z",
  "value": 987
}

PlayType

Description

Types of play that could be played

Values
Enum Value Description

ALL

DEVELOPER

NORMAL

Example
"ALL"

Progress

Fields
Field Name Description
last_played_at - Time The last time this content was played by the user.
Possible Types
Progress Types

TrackProgress

LearningPathProgress

Example
{"last_played_at": "10:15:30Z"}

RecommendationType

Values
Enum Value Description

create_notes

enable_hot_start

Example
"create_notes"

RoleName

Values
Enum Value Description

owner

content_creator

member

instructor

Example
"owner"

RuntimeParameters

Fields
Field Name Description
secrets - [RuntimeSecret!]!
environmentVariables - [EnvironmentVariable!]!
Example
{
  "secrets": [RuntimeSecret],
  "environmentVariables": [EnvironmentVariable]
}

RuntimeParametersInput

Description

Runtime parameters can be used to inject additional metadata, such as secrets and environment variables, into script executions.

Fields
Input Field Description
secrets - [SecretInput!]
environmentVariables - [EnvironmentInput!]
Example
{
  "secrets": [SecretInput],
  "environmentVariables": [EnvironmentInput]
}

RuntimeSecret

Fields
Field Name Description
key - String!
secret - String!
Example
{
  "key": "abc123",
  "secret": "abc123"
}

SamlSsoConnectionOptions

Fields
Field Name Description
signingCert - String!
signingEndpoint - String!
entityID - String!
Example
{
  "signingCert": "xyz789",
  "signingEndpoint": "abc123",
  "entityID": "abc123"
}

Sandbox

Fields
Field Name Description
id - ID! Unique ID
track - Track Track for which the sandbox is for
state - SandboxState! State of the sandbox
invite - TrackInvite The invite for the sandbox
hot_start_pool - HotStartPool The hot start pool of the sandbox
ttl - Time The TTL of the current active environment
created - Time The created time of the sandbox
user - User The user of the sandbox
last_activity_at - Time The last time there was recorded activity in the sandbox
Example
{
  "id": "4",
  "track": Track,
  "state": "creating",
  "invite": TrackInvite,
  "hot_start_pool": HotStartPool,
  "ttl": "10:15:30Z",
  "created": "10:15:30Z",
  "user": User,
  "last_activity_at": "10:15:30Z"
}

SandboxConfig

Fields
Field Name Description
id - ID! Unique ID
name - String! The name of the config
slug - String! The slug of the config
version - Int! Version of the config
deleted - Time Deleted time of the config
Example
{
  "id": 4,
  "name": "xyz789",
  "slug": "abc123",
  "version": 987,
  "deleted": "10:15:30Z"
}

SandboxConfigInput

Fields
Input Field Description
description - String Description of the config
resources - SandboxResourcesInput Resources for the config
scripts - [SandboxScriptInput!] Scripts for the config
Example
{
  "description": "xyz789",
  "resources": SandboxResourcesInput,
  "scripts": [SandboxScriptInput]
}

SandboxConfigVersion

Fields
Field Name Description
id - ID! Unique ID
config - SandboxConfig The config
version - Int! Version of the config
description - String! Description of the config
status - SandboxConfigVersionStatus! Status of the version
published_at - Time The time the config was published
published_by - User The user who published the config
change_log_entry - String! The change log entry of the config
resources - SandboxResources The resources for the config
scripts - [SandboxScript!] The scripts for the config version
tracks - [Track]! The tracks using the config version
hot_start_pools - [HotStartPool]! The hot-start pools using the config version
Example
{
  "id": 4,
  "config": SandboxConfig,
  "version": 987,
  "description": "xyz789",
  "status": "draft",
  "published_at": "10:15:30Z",
  "published_by": User,
  "change_log_entry": "xyz789",
  "resources": SandboxResources,
  "scripts": [SandboxScript],
  "tracks": [Track],
  "hot_start_pools": [HotStartPool]
}

SandboxConfigVersionDiff

Fields
Field Name Description
diff - String! The diff text
Example
{"diff": "abc123"}

SandboxConfigVersionStatus

Description

Sandbox config statuses

Values
Enum Value Description

draft

published

archived

isolated

Example
"draft"

SandboxConfigVersionsFilterInput

Fields
Input Field Description
config_id - String Config ID to filter on
statuses - [SandboxConfigVersionStatus!] Config version statuses to filter on
Example
{
  "config_id": "abc123",
  "statuses": ["draft"]
}

SandboxConnection

Fields
Field Name Description
edges - [SandboxEdge!]! A list of edges containing cursors to each node.
nodes - [Sandbox!]! A list of nodes.
pageInfo - PageInfo! Pagination information.
totalCount - Int! Total items in the current result set.
pageCount - Int! Total number of pages
Example
{
  "edges": [SandboxEdge],
  "nodes": [Sandbox],
  "pageInfo": PageInfo,
  "totalCount": 123,
  "pageCount": 123
}

SandboxEdge

Fields
Field Name Description
cursor - String! Cursor to the current node.
node - Sandbox The current node.
Example
{
  "cursor": "xyz789",
  "node": Sandbox
}

SandboxFilterInput

Description

Filter fields for querying sandboxes

Fields
Input Field Description
track_ids - [String!] ID a track to filter on
invite_ids - [String!] ID an invite to filter on
pool_ids - [String!] ID a hot start pool to filter on
user_name_or_id - String The users name or id
state - [SandboxState!] Status to filter on
from - Time From time to filter on
to - Time To time to filter on
Example
{
  "track_ids": ["abc123"],
  "invite_ids": ["xyz789"],
  "pool_ids": ["xyz789"],
  "user_name_or_id": "xyz789",
  "state": ["creating"],
  "from": "10:15:30Z",
  "to": "10:15:30Z"
}

SandboxResources

Fields
Field Name Description
containers - [ContainerConfig!]! List of containers
virtualmachines - [VirtualMachineConfig!]! List of virtual machines
virtualbrowsers - [VirtualBrowserConfig!]! List of virtual browsers
gcp_projects - [GcpProjectConfig!]! List of GCP projects
aws_accounts - [AwsAccountConfig!]! List of AWS accounts
azure_subscriptions - [AzureSubscriptionConfig!]! List of Azure subscriptions
secrets - [SecretConfig!]! List of secrets
custom_resources - [CustomResourceConfig!]! List of custom resources
blueprint - Blueprint Blueprint
Example
{
  "containers": [ContainerConfig],
  "virtualmachines": [VirtualMachineConfig],
  "virtualbrowsers": [VirtualBrowserConfig],
  "gcp_projects": [GcpProjectConfig],
  "aws_accounts": [AwsAccountConfig],
  "azure_subscriptions": [AzureSubscriptionConfig],
  "secrets": [SecretConfig],
  "custom_resources": [CustomResourceConfig],
  "blueprint": Blueprint
}

SandboxResourcesInput

Fields
Input Field Description
containers - [ContainerConfigInput!] List of containers
virtualmachines - [VirtualMachineConfigInput!] List of virtual machines
virtualbrowsers - [VirtualBrowserConfigInput!] List of virtual browsers
gcp_projects - [GcpProjectConfigInput!] List of GCP projects
aws_accounts - [AwsAccountConfigInput!] List of AWS accounts
azure_subscriptions - [AzureSubscriptionConfigInput!] List of Azure subscriptions
secrets - [SecretConfigInput!] List of secrets
custom_resources - [CustomResourceConfigInput!] List of custom resources
blueprint - BlueprintInput Blueprint
Example
{
  "containers": [ContainerConfigInput],
  "virtualmachines": [VirtualMachineConfigInput],
  "virtualbrowsers": [VirtualBrowserConfigInput],
  "gcp_projects": [GcpProjectConfigInput],
  "aws_accounts": [AwsAccountConfigInput],
  "azure_subscriptions": [AzureSubscriptionConfigInput],
  "secrets": [SecretConfigInput],
  "custom_resources": [CustomResourceConfigInput],
  "blueprint": BlueprintInput
}

SandboxScript

Fields
Field Name Description
host - String! On which host the script is executed. Must reference a host in the config resources.
action - String! One of: setup, cleanup
contents - String! The script contents
Example
{
  "host": "xyz789",
  "action": "abc123",
  "contents": "abc123"
}

SandboxScriptInput

Fields
Input Field Description
host - String On which host the script is executed. Must reference a host in the config
action - String One of: setup, cleanup
contents - String The script contents
Example
{
  "host": "abc123",
  "action": "abc123",
  "contents": "xyz789"
}

SandboxState

Description

Sandbox states

Values
Enum Value Description

creating

created

failed

pooled

stopped

active

claimed

cleaning

cleaned

Example
"creating"

SandboxVariable

Fields
Field Name Description
key - String!
value - String!
Example
{
  "key": "xyz789",
  "value": "xyz789"
}

SearchTerraformModuleResults

Fields
Field Name Description
modules - [TerraformModule!]!
Example
{"modules": [TerraformModule]}

Secret

Fields
Field Name Description
name - String! The name of the secret.
description - String! A description of the secret.
teamID - String! ID of the team
created_at - Time! The time the secret was created
created_by - User! The user who created the secret
updated_at - Time The time the secret was last updated
updated_by - User The user who last updated the secret
tracks - [Track!]! Tracks which make use of the secret
config_versions - [SandboxConfigVersion!]! Config versions which make use of the secret
Example
{
  "name": "abc123",
  "description": "abc123",
  "teamID": "abc123",
  "created_at": "10:15:30Z",
  "created_by": User,
  "updated_at": "10:15:30Z",
  "updated_by": User,
  "tracks": [Track],
  "config_versions": [SandboxConfigVersion]
}

SecretConfig

Description

A SecretConfig stores the details of an track secret

Fields
Field Name Description
id - ID! Unique ID
name - String! Name of the secret
Example
{
  "id": "4",
  "name": "xyz789"
}

SecretConfigInput

Description

A SecretConfigInput stores details about a secret

Fields
Input Field Description
name - String Name of the secret
Example
{"name": "xyz789"}

SecretInput

Description

Secrets can be used to inject secret value into script executions with with a custom key using runtime parameters.

Fields
Input Field Description
key - String
secret - String
Example
{
  "key": "abc123",
  "secret": "xyz789"
}

SecureToken

Description

SecureToken for a user

Fields
Field Name Description
userID - String! User ID
idToken - String! IDToken for user
refreshToken - String! RefreshToken for user
Example
{
  "userID": "xyz789",
  "idToken": "xyz789",
  "refreshToken": "abc123"
}

SkipTakePagination

Fields
Input Field Description
skip - Int!
take - Int!
Example
{"skip": 123, "take": 123}

SsoConnection

Fields
Field Name Description
name - String!
organizationID - String!
strategy - Strategy!
options - SsoConnectionOptions!
Example
{
  "name": "xyz789",
  "organizationID": "abc123",
  "strategy": "okta",
  "options": DefaultSsoConnectionOptions
}

SsoConnectionInput

Fields
Input Field Description
strategy - Strategy!
clientID - String!
clientSecret - String!
domain - String!
Example
{
  "strategy": "okta",
  "clientID": "xyz789",
  "clientSecret": "xyz789",
  "domain": "abc123"
}

SsoConnectionOptions

Example
DefaultSsoConnectionOptions

SsoSamlConnectionInput

Fields
Input Field Description
signingCert - String!
signingEndpoint - String!
entityID - String!
Example
{
  "signingCert": "xyz789",
  "signingEndpoint": "xyz789",
  "entityID": "abc123"
}

Statistics

Fields
Field Name Description
track - TrackStatistics
Example
{"track": TrackStatistics}

Strategy

Values
Enum Value Description

okta

waad

samlp

google_apps

Example
"okta"

String

Description

The String scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.

Example
"abc123"

Student

Fields
Field Name Description
user - User Student user.
track - Track Name of the track the student is currently on.
challenge - Challenge Challenge the student currently is within the track.
last_activity_at - Time Last activity the user had in track's challenge.
completed_at - Time Last time that the user has completed a track.
accessed_at - Time The time when the user has accessed the invite.
inspectable - Boolean Whether the student machine is available to inspect or not
claim - InviteClaim The claim associated to the student
activeSandboxesTotal - Int The amount of active sandboxes for the user
Example
{
  "user": User,
  "track": Track,
  "challenge": Challenge,
  "last_activity_at": "10:15:30Z",
  "completed_at": "10:15:30Z",
  "accessed_at": "10:15:30Z",
  "inspectable": true,
  "claim": InviteClaim,
  "activeSandboxesTotal": 987
}

StudentStatistics

Fields
Field Name Description
inProgressTotal - Int Total number of students that have tracks in progress within a live event.
completedTotal - Int Total number of students that have completed all tracks within a live event.
Example
{"inProgressTotal": 987, "completedTotal": 123}

StudentTrackStatistics

Description

Track statistics for a specific classroom.

Fields
Field Name Description
inProgressTotal - Int Number of students that have started the track but not completed it.
completedTotal - Int Number of students that have completed the track.
Example
{"inProgressTotal": 123, "completedTotal": 123}

Tag

Fields
Field Name Description
id - ID!
value - String!
createdAt - Time!
tracks - [Track!]!
groups - [TagGroup!]!
Example
{
  "id": 4,
  "value": "xyz789",
  "createdAt": "10:15:30Z",
  "tracks": [Track],
  "groups": [TagGroup]
}

TagGroup

Fields
Field Name Description
id - ID!
name - String!
createdAt - Time!
tags - [Tag!]!
Example
{
  "id": "4",
  "name": "abc123",
  "createdAt": "10:15:30Z",
  "tags": [Tag]
}

TagGroupInput

Fields
Input Field Description
name - String!
Example
{"name": "xyz789"}

TagInput

Fields
Input Field Description
value - String!
Example
{"value": "xyz789"}

Team

Description

A team has members, and owns topics and tracks

Fields
Field Name Description
id - ID! Unique ID
members - [TeamMember!]! List of members TODO: IN-364 Remove deprecated members field from team. use users field
users - [TeamUserEdge!]! List of users
userInTeam - Boolean! Check if the currently logged in user is in the team
userReportPage - UserReportPage! userReportPage retrieves a page users with related statistics
Arguments
userDetails - [UserDetails!]! userDetails resolves all collected user details for the resolved team
name - String! Name of the team
logo - String Logo of the team
title - String Title of the team
subtitle - String Subtitle of the team
slug - String! Slug of the team
primary_link_text - String Text of the primary link of the team
primary_link_url - String URL of the primary link of the team
secondary_link_text - String Text of the secondary link of the team
secondary_link_url - String URL of the secondary link of the team
api_key - String API Key for the team
theme - TeamTheme The theme that is used to style the team page
themes - [TrackTheme!]! List of available themes
personal - Boolean Whether the team is personal or not
features - TeamFeatures The list of features that a team can access or use
invited - [String!]! Invited shows a list of email addresses that are invites TODO: IN-378 Remove deprecated field. use field invites
invites - [TeamInvite!] A list of active invites for this team
insights - Insights! A list of insights for this team
tracks - [Track!]! A list of tracks for this team
hotStartPools - [HotStartPool!]! A list of hot start pools for this team
privacy_policy - String The URL of the team's privacy policy, if any.
webhook_dashboard_url - String! The one time use URL for the Svix dashboard to configure webhook endpoints.
created_at - Time The time the team was created at.
customer_since - Time The time the team has become a customer at.
trial_end_at - Time The time the team's trial terminates.
lti_credentials - LTICredentials The LTI credentials for a team.
form - Form The user details form for a team.
ssoConnection - SsoConnection The SSO configuration for a team
tags - [Tag!]! The tags for a team
tagGroups - [TagGroup!]! The tag groups for a team
customResources - [CustomResource!]! The custom resources for a team
hostImages - [HostImage!]! Host images for a team
integrations - Integrations! The integrations that the team has configured
landingPages - [LandingPage!]!
ltiToolRegistrations - [LtiToolRegistration!]!
cloudProviderConfigs - [CloudProviderConfig!]!
githubInstallationID - Int
enabledRepositories - [String!]!
Example
{
  "id": 4,
  "members": [TeamMember],
  "users": [TeamUserEdge],
  "userInTeam": true,
  "userReportPage": UserReportPage,
  "userDetails": [UserDetails],
  "name": "abc123",
  "logo": "xyz789",
  "title": "abc123",
  "subtitle": "abc123",
  "slug": "abc123",
  "primary_link_text": "xyz789",
  "primary_link_url": "abc123",
  "secondary_link_text": "xyz789",
  "secondary_link_url": "xyz789",
  "api_key": "abc123",
  "theme": TeamTheme,
  "themes": [TrackTheme],
  "personal": true,
  "features": TeamFeatures,
  "invited": ["xyz789"],
  "invites": [TeamInvite],
  "insights": Insights,
  "tracks": [Track],
  "hotStartPools": [HotStartPool],
  "privacy_policy": "abc123",
  "webhook_dashboard_url": "abc123",
  "created_at": "10:15:30Z",
  "customer_since": "10:15:30Z",
  "trial_end_at": "10:15:30Z",
  "lti_credentials": LTICredentials,
  "form": Form,
  "ssoConnection": SsoConnection,
  "tags": [Tag],
  "tagGroups": [TagGroup],
  "customResources": [CustomResource],
  "hostImages": [HostImage],
  "integrations": Integrations,
  "landingPages": [LandingPage],
  "ltiToolRegistrations": [LtiToolRegistration],
  "cloudProviderConfigs": [CloudProviderConfig],
  "githubInstallationID": 987,
  "enabledRepositories": ["abc123"]
}

TeamFeatures

Description

TeamFeatures define what features are enabled for a team

Fields
Field Name Description
max_tracks - Int! The maximum number of tracks that can be created
max_timelimit - Int! The maximum timelimit for a single track
max_hot_start_pool_size_always_on - Int! The maximum size of an always on hot start pool
max_hot_start_pool_size_scheduled - Int! The maximum size of a scheduled hot start pool
containers - Boolean! Whether containers can be used
virtual_machines - Boolean! Whether virtual machines can be used
gcp_projects - Boolean! Whether GCP projects can be used
aws_accounts - Boolean! Whether AWS accounts can be used
azure_subscriptions - Boolean! Whether Azure subscriptions can be used
blueprint_sandbox - Boolean! Whether Jumppad blueprints can be used to define a sandbox
embedded - Boolean! Whether tracks can be embedded in other pages
members_skip_to_challenge - Boolean! Whether team members can skip to a challenge
track_reviews - Boolean! Whether students can leave a track review after finishing a track.
accept_terms_checkbox - Boolean! Whether the user has a custom invite with the terms of service
hot_start - Boolean! Whether hot start is enabled for this team
custom_machine_type - Boolean! Where resource based virtual machines is enabled for this team
shared_hotstart_pools - Boolean! Whether the new shared hotstart pools invite flow is enabled for this team
scripts_over_http - Boolean! Whether the new scripts over http is enabled for this team
global_sandboxes - Boolean! Whether multi-region setup is enabled for this team
use_new_terminal - Boolean! Whether we should replace the terminal iframe with xterm directly on the frontend
custom_resources - Boolean! Whether custom resources are enabled for this team
crm_integration - Boolean! Whether CRM integration is enabled for this team
can_hide_sidebar - Boolean! Whether team is allowed to hide the sidebar on track config
can_add_feedback_tab - Boolean! Whether team is allowed to enable feedback tabs on track config
exclude_instruqt_plays - Boolean! Whether instruqt plays should be excluded
new_content_structure - Boolean! Whether the new content structure is enabled for this team
user_completion_rate - Boolean! Whether the new report metric user completion rate is enabled for this team
labV2 - Boolean! Whether the team has access to the new lab v2 layout feature
landingPages - Boolean! Whether the team has access to the landing pages feature
exposeCloudAccountCredentials - Boolean! Whether the exposeCloudAccountCredentials is enabled for this team
instantSandboxes - Boolean! Whether instant sandboxes are enabled for this team
cloudProvidersConfig - Boolean! Whether cloud providers configuration is enabled for this team
Example
{
  "max_tracks": 123,
  "max_timelimit": 987,
  "max_hot_start_pool_size_always_on": 123,
  "max_hot_start_pool_size_scheduled": 123,
  "containers": true,
  "virtual_machines": true,
  "gcp_projects": false,
  "aws_accounts": false,
  "azure_subscriptions": false,
  "blueprint_sandbox": true,
  "embedded": false,
  "members_skip_to_challenge": false,
  "track_reviews": false,
  "accept_terms_checkbox": true,
  "hot_start": false,
  "custom_machine_type": true,
  "shared_hotstart_pools": true,
  "scripts_over_http": true,
  "global_sandboxes": true,
  "use_new_terminal": true,
  "custom_resources": false,
  "crm_integration": false,
  "can_hide_sidebar": true,
  "can_add_feedback_tab": true,
  "exclude_instruqt_plays": false,
  "new_content_structure": true,
  "user_completion_rate": true,
  "labV2": true,
  "landingPages": false,
  "exposeCloudAccountCredentials": true,
  "instantSandboxes": false,
  "cloudProvidersConfig": false
}

TeamFeaturesInput

Description

TeamFeaturesInput defines the input for mutating features of a team.

Fields
Input Field Description
max_tracks - Int The maximum number of tracks that can be created
max_timelimit - Int The maximum timelimit for a single track
max_hot_start_pool_size_always_on - Int The maximum size of an always on hot start pool
max_hot_start_pool_size_scheduled - Int The maximum size of a scheduled hot start pool
containers - Boolean Whether containers can be used
virtual_machines - Boolean Whether virtual machines can be used
gcp_projects - Boolean Whether GCP projects can be used
aws_accounts - Boolean Whether AWS accounts can be used
azure_subscriptions - Boolean Whether Azure subscriptions can be used
blueprint_sandbox - Boolean Whether Jumppad blueprints can be used to define a sandbox
embedded - Boolean Whether tracks can be embedded in other pages
members_skip_to_challenge - Boolean Whether team members can skip to a challenge
track_reviews - Boolean Whether students can leave a track review after finishing a track.
accept_terms_checkbox - Boolean Whether the user has a custom invite with the terms of service
hot_start - Boolean Whether hot start is enabled for this team
custom_machine_type - Boolean Where resource based virtual machines is enabled for this team
shared_hotstart_pools - Boolean Whether the new shared hotstart pools invite flow is enabled for this team
scripts_over_http - Boolean Whether the new scripts over http is enabled for this team
global_sandboxes - Boolean Whether multi-region setup is enabled for this team
use_new_terminal - Boolean Whether we should replace the terminal iframe with xterm directly on the frontend
custom_resources - Boolean Whether custom_resources are enabled for this team
crm_integration - Boolean Whether CRM integration is enabled for this team
can_hide_sidebar - Boolean Whether team is allowed to hide the sidebar on track config
can_add_feedback_tab - Boolean Whether team is allowed to enable feedback tabs on track config
exclude_instruqt_plays - Boolean Whether instruqt plays should be excluded
new_content_structure - Boolean Wether the team is allowed to use the new content flow
user_completion_rate - Boolean Whether the new report metric user completion rate is enabled for this team
labV2 - Boolean Whether the new lab v2 layout is enabled for this team
landingPages - Boolean Whether the team has access to the landing pages feature
exposeCloudAccountCredentials - Boolean Whether the exposeCloudAccountCredentials is enabled for this team
instantSandboxes - Boolean Whether instant sandboxes are enabled for this team
cloudProvidersConfig - Boolean Whether cloud providers configuration is enabled for this team
Example
{
  "max_tracks": 123,
  "max_timelimit": 123,
  "max_hot_start_pool_size_always_on": 123,
  "max_hot_start_pool_size_scheduled": 123,
  "containers": false,
  "virtual_machines": true,
  "gcp_projects": false,
  "aws_accounts": true,
  "azure_subscriptions": true,
  "blueprint_sandbox": true,
  "embedded": true,
  "members_skip_to_challenge": false,
  "track_reviews": true,
  "accept_terms_checkbox": false,
  "hot_start": false,
  "custom_machine_type": true,
  "shared_hotstart_pools": true,
  "scripts_over_http": true,
  "global_sandboxes": false,
  "use_new_terminal": true,
  "custom_resources": false,
  "crm_integration": true,
  "can_hide_sidebar": true,
  "can_add_feedback_tab": true,
  "exclude_instruqt_plays": false,
  "new_content_structure": false,
  "user_completion_rate": true,
  "labV2": false,
  "landingPages": false,
  "exposeCloudAccountCredentials": false,
  "instantSandboxes": false,
  "cloudProvidersConfig": false
}

TeamInput

Description

A team has members, and owns topics and tracks

Fields
Input Field Description
id - ID Unique ID
slug - String Slug of the team
name - String Name of the team
logo - String Logo of the team
title - String Title of the team
subtitle - String Subtitle of the team
customer_since - Time time when the team became a customer
trial_end_at - Time instant at which the team's ends / ended
primary_link_text - String Text of the primary link of the team
primary_link_url - String URL of the primary link of the team
secondary_link_text - String Text of the secondary link of the team
secondary_link_url - String URL of the secondary link of the team
theme - TeamThemeInput The theme that is used to style the team page
Example
{
  "id": 4,
  "slug": "xyz789",
  "name": "abc123",
  "logo": "abc123",
  "title": "abc123",
  "subtitle": "abc123",
  "customer_since": "10:15:30Z",
  "trial_end_at": "10:15:30Z",
  "primary_link_text": "xyz789",
  "primary_link_url": "xyz789",
  "secondary_link_text": "xyz789",
  "secondary_link_url": "abc123",
  "theme": TeamThemeInput
}

TeamInvite

Description

TeamInvite represents an outstanding invite for an email address to join the team

Fields
Field Name Description
email - String! The email of the invite
role - RoleName! The role that the user will get when accepting the invite
token_expired - Boolean! Whether the token in the email invite has expired
team - Team The team this invite belongs to
accepted_at - Time The time the invite was accepted
created_by - User The user the invite was created by
Example
{
  "email": "abc123",
  "role": "owner",
  "token_expired": false,
  "team": Team,
  "accepted_at": "10:15:30Z",
  "created_by": User
}

TeamMember

Description

Member of a team

Fields
Field Name Description
id - ID! The user's ID use field user
profile - UserProfile The user's profile use field user
user - User! The user
role - RoleName! The user's role in the organization
Example
{
  "id": 4,
  "profile": UserProfile,
  "user": User,
  "role": "owner"
}

TeamSeries

Fields
Field Name Description
date - String!
started - Int!
completed - Int!
Example
{
  "date": "xyz789",
  "started": 123,
  "completed": 987
}

TeamStatistics

Fields
Field Name Description
started_total - Int
completed_total - Int
restarted_total - Int
team_series - [TeamSeries!]!
track_statistics - [TrackStatistics!]!
Example
{
  "started_total": 123,
  "completed_total": 123,
  "restarted_total": 123,
  "team_series": [TeamSeries],
  "track_statistics": [TrackStatistics]
}

TeamTheme

Description

A TeamTeme defines the look and feel for a team

Fields
Field Name Description
foreground_color - String The color used for the text in the header
foreground_image - String The image that is shown in the header
background_color - String The color used for the background of the header
background_image - String The image used for the background of the header
primary_foreground_color - String The color used for the text of the primary button
primary_background_color - String The color used for the background of the primary button
secondary_foreground_color - String The color used for the text of the secondary button
secondary_background_color - String The color used for the background of the secondary button
Example
{
  "foreground_color": "xyz789",
  "foreground_image": "abc123",
  "background_color": "abc123",
  "background_image": "xyz789",
  "primary_foreground_color": "xyz789",
  "primary_background_color": "abc123",
  "secondary_foreground_color": "xyz789",
  "secondary_background_color": "abc123"
}

TeamThemeInput

Fields
Input Field Description
foreground_color - String The color used for the text in the header
foreground_image - String The image that is shown in the header
background_color - String The color used for the background of the header
background_image - String The image used for the background of the header
primary_foreground_color - String The color used for the text of the primary button
primary_background_color - String The color used for the background of the primary button
secondary_foreground_color - String The color used for the text of the secondary button
secondary_background_color - String The color used for the background of the secondary button
Example
{
  "foreground_color": "xyz789",
  "foreground_image": "abc123",
  "background_color": "abc123",
  "background_image": "abc123",
  "primary_foreground_color": "abc123",
  "primary_background_color": "xyz789",
  "secondary_foreground_color": "abc123",
  "secondary_background_color": "xyz789"
}

TeamUserEdge

Description

Represents the user's which are member of a team.

Fields
Field Name Description
id - ID! ID of this edge; the compound of the team ID and the user ID.
node - User! The target user.
role - RoleName! The user's role within this team.
Example
{"id": 4, "node": User, "role": "owner"}

TerraformModule

Fields
Field Name Description
id - ID!
name - String!
module - String!
description - String!
source - String!
provider - String!
version - String!
availableVersions - [String!]!
logo - String!
publishedAt - Time!
namespace - String!
owner - String!
inputs - [TerraformModuleInput!]!
outputs - [TerraformModuleOutput!]!
Example
{
  "id": 4,
  "name": "abc123",
  "module": "abc123",
  "description": "abc123",
  "source": "abc123",
  "provider": "xyz789",
  "version": "abc123",
  "availableVersions": ["xyz789"],
  "logo": "abc123",
  "publishedAt": "10:15:30Z",
  "namespace": "xyz789",
  "owner": "abc123",
  "inputs": [TerraformModuleInput],
  "outputs": [TerraformModuleOutput]
}

TerraformModuleInput

Fields
Field Name Description
name - String!
type - String!
description - String!
default - String!
required - Boolean!
Example
{
  "name": "abc123",
  "type": "xyz789",
  "description": "xyz789",
  "default": "abc123",
  "required": false
}

TerraformModuleOutput

Fields
Field Name Description
name - String!
description - String!
Example
{
  "name": "xyz789",
  "description": "xyz789"
}

Time

Example
"10:15:30Z"

TimeSeriesGranularity

Description

The time series granularity

Values
Enum Value Description

HOURLY

DAILY

WEEKLY

MONTHLY

Example
"HOURLY"

TimeSpentSeries

Fields
Field Name Description
min - Float!
max - Float!
sum - Float!
average - Float!
items - [TimeSpentSeriesItem!]!
Example
{
  "min": 987.65,
  "max": 987.65,
  "sum": 987.65,
  "average": 987.65,
  "items": [TimeSpentSeriesItem]
}

TimeSpentSeriesItem

Fields
Field Name Description
bucketStartTime - Time!
value - Float!
Example
{
  "bucketStartTime": "10:15:30Z",
  "value": 987.65
}

Topic

Description

A topic is a group of tracks, all centered around a certain topic

Fields
Field Name Description
id - ID! Unique ID
permalink - String Permalink for this topic. Will be generated automatically, based on the slugs of the organization and topic
description - String! Description of the topic
icon - String! Icon for the topic, must be a URL to an image
slug - String! Slug for the topic. This will be visible in the address bar of the browser
title - String! Title of the topic
tags - [String!]! List of tags of the topic
teaser - String! Teaser of the topic
tracks - [Track!]! List of tracks that are part of this topic
private - Boolean! If a topic is private, it is only visible for organization members
owner - String Slug of the organization that owns the track
Example
{
  "id": "4",
  "permalink": "abc123",
  "description": "xyz789",
  "icon": "xyz789",
  "slug": "xyz789",
  "title": "abc123",
  "tags": ["xyz789"],
  "teaser": "abc123",
  "tracks": [Track],
  "private": false,
  "owner": "xyz789"
}

TopicInput

Description

A topic is a group of tracks, all centered around a certain topic

Fields
Input Field Description
id - ID Unique ID
slug - String Slug for the topic. This will be visible in the address bar of the browser
title - String Title of the topic
teaser - String Teaser of the topic
description - String Description of the topic
icon - String Icon for the topic, must be a URL to an image
private - Boolean If a topic is private, it is only visible for organization members
owner - String Slug of the organization that owns the track
Example
{
  "id": 4,
  "slug": "abc123",
  "title": "abc123",
  "teaser": "xyz789",
  "description": "abc123",
  "icon": "xyz789",
  "private": false,
  "owner": "xyz789"
}

Track

Description

A track consists of a list of challenges

Fields
Field Name Description
id - ID! Unique ID
slug - String! Slug of the track
version - String! Version of the track. Currently not used
revision - Time! Revision of the track. Currently not used
type - String! Type of the track. One of: track, sandbox. Defaults to track. When choosing sandbox, the 'check' button changes to 'next'. no longer used
title - String! Title of the track
teaser - String! Teaser of the track
description - String! Description of the track
icon - String! Icon of the track
level - Level Level defines the skill level the track is designed for
tags - [String!]! List of tags for this track Use the trackTags field
trackTags - [Tag!]! List of tags for this track
owner - String Slug of the team that owns the track Use the team field
team - Team The team that owns the track
developers - [User!]! List of developers for this track
userIsTrackDeveloper - Boolean! Checks if the currently logged in user is a developer for this track
instructors - [TrackInstructor!]! List of users with access to this track
updated_by - User User that last updated the track
private - Boolean! If a track is private, it is only visible for team members No longer in use
published - Boolean! If a track is not published, it is only visible to track developers No longer in use
maintenance - Boolean! Whether the track is in maintenance mode. If it is, a maintenance banner will be shown and the track will not be playable.
challenges - [Challenge!]! List of challenges for this track
config - TrackConfig The config for this track
sandboxConfig - SandboxConfigVersion The sandbox config for the track
trackConfig - TrackConfig The config for a track
status - TrackStatus Status of the track
started - Time! Start time of this track
creating - Time! Time when track creation has started
created - Time! Time when track was created successfully
failed - Time! Time when track failed to create
stopped - Time! Time when track was stopped
completed - Time! Time when track was completed
cleaned - Time! Time when track was cleaned
permalink - String Permalink for this topic. Will be generated automatically, based on the slugs of the team and track
play_limit - Int Amount of public plays allowed for this track
play_count - Int Amount of public plays done
expiry_date - Time When the access to this track expires. Only set when track is made available through an invite Should be resolved from the relevant track_invite
expiry_count - Int How many plays are left on this track. Only set when track is made available through an invite Should be resolved from the relevant track_library entry
median_starttime - Int Median starting time of the track and the first challenge
prestart - Boolean! Whether the track has pre start capabilities.
skipping_to - Challenge Which challenge the track is currently skipping to.
scripts - [TrackScript!]! Scripts that belong to the track
actual_pool_size - Int! Actual pool size repesents the amount of actual enviroments in the stand-by pool
show_timer - Boolean! Show timer represents the track setting whether to show a timer or not.
skipping_enabled - Boolean! Whether skipping is enabled for the challenges in this track
can_skip - Boolean! Whether skipping is available or not, this is dependent on the presence of check & solve scripts
ttl - Time The TTL of the current active environment
last_update - Time! Timestamp of when track has been last updated
createdAt - Time! Timestamp of when track was created
deletedAt - Time Timestamp of when track has been deleted
learning_paths - [LearningPath!]! List of learning paths this track is part of No longer supported
accessible - Boolean! Whether the current user can play this track.
embed_token - String! Embed token
visibility - VisibilityStatus! Visibility status of the track Replaced by private, published and maintenance
trackReviews - TrackReviewConnection Get reviews for a specific track
Arguments
after - String
first - Int
statistics - TrackStatistics Track statistics
Arguments
start - Time

Start time, defaults to 30 days ago

end - Time

End time, defaults to now

filterDevelopers - Boolean

Filter developers

participant - Play The latest play of the current user on this track if available
idle_timeout - Int The timeout value in seconds before the underlying sandbox will be detroyed.
studentStatistics - StudentTrackStatistics Track statistics for a specific live event.
Arguments
inviteID - ID!
timelimit - Int the time limit value in seconds that the sandbox will be available for the track as a whole.
lab_config - LabConfig The lab configuration for the track.
sourceTrack - Track The track the current track has been copied from.
recommendations - [RecommendationType!]! Array of recommended actions for the track
commits - [Commit!]! Array of commits pushed to the track
remote_repository - String Track git repository
Example
{
  "id": "4",
  "slug": "abc123",
  "version": "xyz789",
  "revision": "10:15:30Z",
  "type": "xyz789",
  "title": "xyz789",
  "teaser": "abc123",
  "description": "xyz789",
  "icon": "abc123",
  "level": "beginner",
  "tags": ["xyz789"],
  "trackTags": [Tag],
  "owner": "abc123",
  "team": Team,
  "developers": [User],
  "userIsTrackDeveloper": true,
  "instructors": [TrackInstructor],
  "updated_by": User,
  "private": false,
  "published": false,
  "maintenance": true,
  "challenges": [Challenge],
  "config": TrackConfig,
  "sandboxConfig": SandboxConfigVersion,
  "trackConfig": TrackConfig,
  "status": "started",
  "started": "10:15:30Z",
  "creating": "10:15:30Z",
  "created": "10:15:30Z",
  "failed": "10:15:30Z",
  "stopped": "10:15:30Z",
  "completed": "10:15:30Z",
  "cleaned": "10:15:30Z",
  "permalink": "abc123",
  "play_limit": 123,
  "play_count": 987,
  "expiry_date": "10:15:30Z",
  "expiry_count": 987,
  "median_starttime": 987,
  "prestart": true,
  "skipping_to": Challenge,
  "scripts": [TrackScript],
  "actual_pool_size": 987,
  "show_timer": true,
  "skipping_enabled": true,
  "can_skip": true,
  "ttl": "10:15:30Z",
  "last_update": "10:15:30Z",
  "createdAt": "10:15:30Z",
  "deletedAt": "10:15:30Z",
  "learning_paths": [LearningPath],
  "accessible": false,
  "embed_token": "abc123",
  "visibility": "unpublished",
  "trackReviews": TrackReviewConnection,
  "statistics": TrackStatistics,
  "participant": Play,
  "idle_timeout": 123,
  "studentStatistics": StudentTrackStatistics,
  "timelimit": 987,
  "lab_config": LabConfig,
  "sourceTrack": Track,
  "recommendations": ["create_notes"],
  "commits": [Commit],
  "remote_repository": "xyz789"
}

TrackConfig

Description

A track config contains the infrastructure needed for the challenges

Fields
Field Name Description
id - ID! Unique ID
version - String Version of the config, latest version is "2"
containers - [ContainerConfig!]! List of containers
virtualmachines - [VirtualMachineConfig!]! List of virtual machines
virtualbrowsers - [VirtualBrowserConfig!]! List of virtual browsers
gcp_projects - [GcpProjectConfig!]! List of GCP projects
aws_accounts - [AwsAccountConfig!]! List of AWS accounts
azure_subscriptions - [AzureSubscriptionConfig!]! List of Azure subscriptions
secrets - [SecretConfig!]! List of secrets
custom_resources - [CustomResourceConfig!]! List of custom resources
blueprint - Blueprint Blueprint
Example
{
  "id": "4",
  "version": "xyz789",
  "containers": [ContainerConfig],
  "virtualmachines": [VirtualMachineConfig],
  "virtualbrowsers": [VirtualBrowserConfig],
  "gcp_projects": [GcpProjectConfig],
  "aws_accounts": [AwsAccountConfig],
  "azure_subscriptions": [AzureSubscriptionConfig],
  "secrets": [SecretConfig],
  "custom_resources": [CustomResourceConfig],
  "blueprint": Blueprint
}

TrackConfigInput

Description

A track config contains the infrastructure needed for the challenges

Fields
Input Field Description
id - ID Unique ID
version - String Version of the config, latest version is "2"
containers - [ContainerConfigInput!] List of containers
virtualmachines - [VirtualMachineConfigInput!] List of virtual machines
virtualbrowsers - [VirtualBrowserConfigInput!] List of virtual browsers
gcp_projects - [GcpProjectConfigInput!] List of GCP projects
aws_accounts - [AwsAccountConfigInput!] List of AWS accounts
azure_subscriptions - [AzureSubscriptionConfigInput!] List of Azure Subscriptions
secrets - [SecretConfigInput!] List of secret configs
blueprint - BlueprintInput Blueprint
Example
{
  "id": 4,
  "version": "abc123",
  "containers": [ContainerConfigInput],
  "virtualmachines": [VirtualMachineConfigInput],
  "virtualbrowsers": [VirtualBrowserConfigInput],
  "gcp_projects": [GcpProjectConfigInput],
  "aws_accounts": [AwsAccountConfigInput],
  "azure_subscriptions": [AzureSubscriptionConfigInput],
  "secrets": [SecretConfigInput],
  "blueprint": BlueprintInput
}

TrackConfigPresets

Description

A track config presets contains presets for track configs

Fields
Field Name Description
containers - [ContainerConfigPreset!]! List of container presets
virtualmachines - [VirtualMachineConfigPreset!]! List of virtual machine presets
machinetypes - [MachineTypePreset!]! List of all Instruqt machine types
googlecloudmachinetypes - [GoogleCloudMachineTypePreset!]! List of all Google Cloud machine types
Example
{
  "containers": [ContainerConfigPreset],
  "virtualmachines": [VirtualMachineConfigPreset],
  "machinetypes": [MachineTypePreset],
  "googlecloudmachinetypes": [
    GoogleCloudMachineTypePreset
  ]
}

TrackInput

Description

A track consists of a list of challenges

Fields
Input Field Description
id - ID Unique ID
slug - String Slug of the track
version - String Version of the track. Currently not used
revision - Time Revision of the track. Currently not used
title - String Title of the track
teaser - String Teaser of the track
description - String Description of the track
icon - String Icon of the track
level - Level Level defines the skill level the track is designed for
tags - [String!] List of tags for this track
owner - String Slug of the team that owns the track
developers - [UserInput!] List of developers for this track
private - Boolean If a track is private, it is only visible for team members
published - Boolean If a track is not published, it is only visible to track developers
maintenance - Boolean If a track is in maintenance, it can only be played by developers, but is visible to others
show_timer - Boolean If the track should show a timer while playing the track
skipping_enabled - Boolean If the end user is able to skip to a specific challenge
challenges - [ChallengeInput!] List of challenges for this track
config - TrackConfigInput The config for this track
scripts - [TrackScriptInput!] The scripts for this track
idle_timeout - Int The timeout value in seconds before the underlying sandbox will be detroyed.
timelimit - Int the time limit value in seconds that the sandbox will be available for the track as a whole.
lab_config - LabConfigInput lab configuration for the track
sandboxConfig - String The slug of the sandbox config to use for the track
sourceTrackID - ID The track the current track has been copied from.
commitMessage - String Commit message when the track is updated.
remote_repository - String Remote repository connected to the track
Example
{
  "id": "abc123",
  "slug": "example-track",
  "version": "1",
  "revision": "10:15:30Z",
  "title": "Example Track",
  "teaser": "An introduction to the content of the track",
  "description": "A detailed description of the content of the track",
  "icon": "https://storage.googleapis.com/instruqt-frontend/img/tracks/default.png",
  "level": "beginner",
  "tags": ["cloud"],
  "owner": "abc123",
  "developers": [UserInput],
  "private": true,
  "published": false,
  "maintenance": true,
  "show_timer": true,
  "skipping_enabled": false,
  "challenges": [ChallengeInput],
  "config": TrackConfigInput,
  "scripts": [TrackScriptInput],
  "idle_timeout": 987,
  "timelimit": 987,
  "lab_config": LabConfigInput,
  "sandboxConfig": "xyz789",
  "sourceTrackID": 4,
  "commitMessage": "xyz789",
  "remote_repository": "abc123"
}

TrackInsight

Fields
Field Name Description
page - TrackInsightPage!
Arguments
Example
{"page": TrackInsightPage}

TrackInsightItem

Fields
Field Name Description
id - ID!
track - Track!
currentPeriod - TrackInsightsItemPeriod!
previousPeriod - TrackInsightsItemPeriod!
Example
{
  "id": "4",
  "track": Track,
  "currentPeriod": TrackInsightsItemPeriod,
  "previousPeriod": TrackInsightsItemPeriod
}

TrackInsightPage

Fields
Field Name Description
items - [TrackInsightItem!]!
totalItems - Int!
Example
{"items": [TrackInsightItem], "totalItems": 123}

TrackInsightPageInput

Description

Input types for track

Fields
Input Field Description
dateRangeFilter - DateRangeFilter Date range filter for plays
trackIds - [String!] IDs of tracks for which we want to get plays
customParameterFilters - [CustomParameterFilter!] Filter for custom parameters
trackAuthorIds - [String!] IDs of track authors as context
tagIds - [String!] IDs of content tags for context
trackInviteIds - [String!] track invite IDs for context
landingPageIds - [String!] Landing page IDs for context
ordering - Ordering Sorting parameters
pagination - SkipTakePagination Pagination parameters
playType - PlayType! Filter for play type
Example
{
  "dateRangeFilter": DateRangeFilter,
  "trackIds": ["xyz789"],
  "customParameterFilters": [CustomParameterFilter],
  "trackAuthorIds": ["abc123"],
  "tagIds": ["abc123"],
  "trackInviteIds": ["abc123"],
  "landingPageIds": ["xyz789"],
  "ordering": Ordering,
  "pagination": SkipTakePagination,
  "playType": "ALL"
}

TrackInsightsItemPeriod

Fields
Field Name Description
plays - Int!
learnersReached - Int!
timeSpent - Int!
completionRate - Float!
averageReviewScore - Float!
userCompletionRate - Float!
Example
{
  "plays": 123,
  "learnersReached": 987,
  "timeSpent": 987,
  "completionRate": 987.65,
  "averageReviewScore": 123.45,
  "userCompletionRate": 987.65
}

TrackInstructor

Fields
Field Name Description
id - ID!
user - User!
Example
{"id": 4, "user": User}

TrackInvite

Description

An invite can be used to invite users outside of an organization to access private tracks

Fields
Field Name Description
id - ID! Unique ID
title - String! The title of the invite. Will not be shown to end users, but is only for administration purposes
publicTitle - String The public title of the invite. This title will be shown to end users
publicDescription - String The public description of the invite. This description will be shown to end users
tracks - [Track!]! The tracks this invite applies to Use 'trackEdges' instead.
trackEdges - [TrackInviteTrackEdge!]! The tracks this invite applies to
authors - [TrackInviteAuthor!]! The authors of the invite
trackLibrary - TrackLibraryEntryConnection The track library of the invite for the current user No longer supported
Arguments
paging - Pagination

Pagination parameters

organization - Organization! The organization this invite belongs to No longer supported
team - Team! The team this invite belongs to
accessSetting - AccessSetting The access setting of the invite
inviteLimit - Int The number of times this invite can be used
inviteCount - Int The number of times this invite has been used name is ambiguous, use 'claimCount' instead.
claimCount - Int The number of times this invite has been claimed
inviteTTL - Time The TTL until when this invite can be used name is ambiguous, use 'expiresAt' instead.
expiresAt - Time The expiry date for this invite
startsAt - Time The start time for a type:live_event invite. Invites will get status:active 24 hours before.
playLimit - Int The number of plays the end user is allowed to do
playTTL - Int The amount of time the track is available to the end user
created - Time When this invite was created
last_updated - Time When the invite got claimed Can be obtained through TrackInvite.currentUserClaim or User.claims
allowAnonymous - Boolean! Whether anyone with the link is able to access the invite anonymously (true), or is asked to leave their details (false, default).
allowedEmailAddresses - [String!]! List of email addresses that are allowed to accept invite
allowedEmailAddressesOnly - Boolean! Whether a specific email addresses must be used to accept invite
currentUserAllowed - Boolean! Whether the currently logged in user is allowed to accept invite
currentUserClaim - InviteClaim The invite claim for the current user, if this invite was claimed
currentUserClaimed - Boolean! Whether the currently logged in user has claimed this invite
claims - [InviteClaim!]! A list of claims for this invite
activeUsers - [UserActivity!]! List the currently active users
plays - [InvitePlay!]! List all the plays using this invite
type - TrackInviteType Type of invite
status - TrackInviteStatus The status of the invite.
daysUntil - Int The number of days until the live event's start. This can be resolved from the startsAt field in the frontend
enableLearnerSharing - Boolean! Whether learner sharing is enabled
canClaim - Boolean! Can the current user claim the invite
runtimeParameters - RuntimeParameters The runtime parameters for the invite
shareMethod - TrackInviteShareMethod Describes the method used to share the invite
deletedAt - Time Timestamp of when track invite has been deleted
Example
{
  "id": "4",
  "title": "abc123",
  "publicTitle": "abc123",
  "publicDescription": "xyz789",
  "tracks": [Track],
  "trackEdges": [TrackInviteTrackEdge],
  "authors": [TrackInviteAuthor],
  "trackLibrary": TrackLibraryEntryConnection,
  "organization": Organization,
  "team": Team,
  "accessSetting": "anyone",
  "inviteLimit": 987,
  "inviteCount": 987,
  "claimCount": 123,
  "inviteTTL": "10:15:30Z",
  "expiresAt": "10:15:30Z",
  "startsAt": "10:15:30Z",
  "playLimit": 987,
  "playTTL": 987,
  "created": "10:15:30Z",
  "last_updated": "10:15:30Z",
  "allowAnonymous": false,
  "allowedEmailAddresses": ["abc123"],
  "allowedEmailAddressesOnly": false,
  "currentUserAllowed": true,
  "currentUserClaim": InviteClaim,
  "currentUserClaimed": true,
  "claims": [InviteClaim],
  "activeUsers": [UserActivity],
  "plays": [InvitePlay],
  "type": "self_paced",
  "status": "active",
  "daysUntil": 987,
  "enableLearnerSharing": false,
  "canClaim": true,
  "runtimeParameters": RuntimeParameters,
  "shareMethod": "link",
  "deletedAt": "10:15:30Z"
}

TrackInviteAuthor

Fields
Field Name Description
id - ID!
user - User!
Example
{"id": 4, "user": User}

TrackInviteInput

Description

An invite can be used to invite users outside of an organization to access private tracks

Fields
Input Field Description
id - ID Unique ID
title - String The title of the invite. Will not be shown to end users, but is only for administration purposes
publicTitle - String The public title of the invite. This title will be shown to end users
publicDescription - String The public description of the invite. This description will be shown to end users
trackIDs - [String!] The IDs of the tracks this invite applies to
inviteLimit - Int The number of times this invite can be used
inviteTTL - Time The TTL until when this invite can be used
expiresAt - Time The expiry date for this invite
startsAt - Time The start time for a type:live_event invite. Invites will be accessible (status:active) for new users 24 hours before start.
playLimit - Int The number of plays the end user is allowed to do
playTTL - Int The amount of time the track is available to the end user
allowAnonymous - Boolean Whether anyone with the link should be able to access the invite anonymously. Set to false (default) to gate your content with a form asking for details.
allowedEmailAddresses - [String!] List of email addresses that are allowed to accept invite
type - TrackInviteType Type of invite
enableLearnerSharing - Boolean Whether learner sharing is enabled
runtimeParameters - RuntimeParametersInput Runtime parameters for the invite
shareMethod - TrackInviteShareMethod Describes the method used to share the invite
Example
{
  "id": "4",
  "title": "abc123",
  "publicTitle": "xyz789",
  "publicDescription": "abc123",
  "trackIDs": ["xyz789"],
  "inviteLimit": 987,
  "inviteTTL": "10:15:30Z",
  "expiresAt": "10:15:30Z",
  "startsAt": "10:15:30Z",
  "playLimit": 123,
  "playTTL": 987,
  "allowAnonymous": false,
  "allowedEmailAddresses": ["xyz789"],
  "type": "self_paced",
  "enableLearnerSharing": true,
  "runtimeParameters": RuntimeParametersInput,
  "shareMethod": "link"
}

TrackInviteShareMethod

Values
Enum Value Description

link

Used for sharing a track invite with a link.

embed

Used for gated embedded track invites.
Example
"link"

TrackInviteStatus

Values
Enum Value Description

active

Default status. Allows new users to acces the invite link.

upcoming

If invite.startsAt > 24 hours from now (applies to invite.type: live_event only.) New users are not yet allowed to access the invite link.

expired

After invite.expiresAt has passed. No longer allows new users to access the invite link.
Example
"active"

TrackInviteTrackEdge

Fields
Field Name Description
id - ID!
node - Track!
Example
{
  "id": "4",
  "node": Track
}

TrackInviteType

Values
Enum Value Description

self_paced

Used to deliver content to users to complete in their own time.

live_event

Used to deliver content for instructor-led workshops.
Example
"self_paced"

TrackLibraryEntry

Description

TrackLibraryEntry a track owned by a user by accepting a track invite.

Fields
Field Name Description
playCount - Int The number of times this track was played by the user
viewed_at - Time Instant this track was last viewed by the user, nil if not viewed. No longer supported
track - Track! The track.
Example
{
  "playCount": 987,
  "viewed_at": "10:15:30Z",
  "track": Track
}

TrackLibraryEntryConnection

Fields
Field Name Description
edges - [TrackLibraryEntryEdge!]! A list of edges.
nodes - [TrackLibraryEntry!]! A list of nodes.
pageInfo - PageInfo! Information to aid in pagination.
totalCount - Int! Identifies the total count of items in the connection.
Example
{
  "edges": [TrackLibraryEntryEdge],
  "nodes": [TrackLibraryEntry],
  "pageInfo": PageInfo,
  "totalCount": 123
}

TrackLibraryEntryEdge

Description

An edge to a TackLibraryEntry with its cursor.

Fields
Field Name Description
cursor - String! A cursor for use in pagination.
node - TrackLibraryEntry The entry at the end of this edge.
Example
{
  "cursor": "abc123",
  "node": TrackLibraryEntry
}

TrackOrder

Description

TrackOrder defines the order in which to return tracks

Values
Enum Value Description

last_update_ASC

last_update_DESC

title_ASC

title_DESC

Example
"last_update_ASC"

TrackPlayLimit

Fields
Field Name Description
track - Track The track the limits apply to, if configured for a track
rollingMonth - Int! The amount of times a track can be started for a rolling month period
rollingIPAddressPerHour - Int! The amount of times a track can be started per IP Address for a rolling hour period
calendarMonth - Int! The amount of times a track can be played for a calendar month
concurrentPlaysPerIP - Int! The amount of concurrent plays allowed for a track per IP Address
Example
{
  "track": Track,
  "rollingMonth": 987,
  "rollingIPAddressPerHour": 123,
  "calendarMonth": 987,
  "concurrentPlaysPerIP": 987
}

TrackPlayLimitInput

Description

Input values for track play limits

Fields
Input Field Description
rollingMonth - Int The amount of times a track can be started for a rolling month period
rollingIPAddressPerHour - Int The amount of times a track can be started per IP Address for a rolling hour period
calendarMonth - Int The amount of times a track can be played for a calendar month
concurrentPlaysPerIP - Int The amount of times a track can be played concurrently per IP Address
Example
{
  "rollingMonth": 987,
  "rollingIPAddressPerHour": 123,
  "calendarMonth": 987,
  "concurrentPlaysPerIP": 123
}

TrackProgress

Fields
Field Name Description
last_played_at - Time The last time this track was played.
completed_at - Time The time when the track was completed.
completed_challenges - Int! The amount of challenges completed.
track - Track! The track.
Example
{
  "last_played_at": "10:15:30Z",
  "completed_at": "10:15:30Z",
  "completed_challenges": 123,
  "track": Track
}

TrackReview

Description

A student's review of a track.

Fields
Field Name Description
id - ID! The ID of this track review.
track - Track! The track this review applies to.
challenge - Challenge The challenge this review applies to.
user - User! The user which supplied this review.
play - Play The play this review applies to.
created_at - Time! The time the review was created.
updated_at - Time! The time the review was last updated.
score - Int! The score the user gave to this track; should be between 1-5.
content - String! Written feedback.
Example
{
  "id": 4,
  "track": Track,
  "challenge": Challenge,
  "user": User,
  "play": Play,
  "created_at": "10:15:30Z",
  "updated_at": "10:15:30Z",
  "score": 987,
  "content": "abc123"
}

TrackReviewConnection

Fields
Field Name Description
edges - [TrackReviewEdge!]! A list of edges.
nodes - [TrackReview!]! A list of nodes.
pageInfo - PageInfo! Information to aid in pagination.
totalCount - Int! Identifies the total count of items in the connection.
Example
{
  "edges": [TrackReviewEdge],
  "nodes": [TrackReview],
  "pageInfo": PageInfo,
  "totalCount": 987
}

TrackReviewEdge

Description

An edge to a TrackReview with its cursor.

Fields
Field Name Description
cursor - String! A cursor for use in pagination.
node - TrackReview The entry at the end of this edge.
Example
{
  "cursor": "xyz789",
  "node": TrackReview
}

TrackReviewInput

Fields
Input Field Description
trackID - ID
challengeID - ID
participantID - ID
score - Int
content - String
Example
{
  "trackID": 4,
  "challengeID": 4,
  "participantID": "4",
  "score": 987,
  "content": "abc123"
}

TrackScript

Description

Track scripts provide the automation hooks for interacting with the infrastructure of the track. There are 2 actions: setup,cleanup

Fields
Field Name Description
id - ID! Unique ID
action - String! One of: setup, cleanup
contents - String! The script contents
host - String! On which host the script is executed. Must reference a host in the track config
Example
{
  "id": "4",
  "action": "abc123",
  "contents": "xyz789",
  "host": "abc123"
}

TrackScriptInput

Description

Track scripts provide the automation hooks for interacting with the infrastructure of the track. There are 2 actions: setup, cleanup

Fields
Input Field Description
id - ID Unique ID
track - String ID of the track this script belongs to
host - String On which host the script is executed. Must reference a host in the track config
action - String One of: setup, cleanup
contents - String The script contents
Example
{
  "id": "4",
  "track": "abc123",
  "host": "abc123",
  "action": "xyz789",
  "contents": "abc123"
}

TrackSeries

Fields
Field Name Description
date - String!
started - Int!
completed - Int!
Example
{
  "date": "xyz789",
  "started": 123,
  "completed": 987
}

TrackStatistics

Fields
Field Name Description
track - Track
id - ID! Replaced by track
title - String Replaced by track
slug - String Replaced by track
started_total - Int
completed_total - Int
restarted_total - Int
average_review_score - Float
track_series - [TrackSeries!]!
challenge_series - [ChallengeSeries!]!
challenges - [ChallengeStatistics!]!
happiness - [HappinessCount!]!
Example
{
  "track": Track,
  "id": "4",
  "title": "abc123",
  "slug": "xyz789",
  "started_total": 987,
  "completed_total": 987,
  "restarted_total": 123,
  "average_review_score": 987.65,
  "track_series": [TrackSeries],
  "challenge_series": [ChallengeSeries],
  "challenges": [ChallengeStatistics],
  "happiness": [HappinessCount]
}

TrackStatus

Description

TrackStatus enumerate all track statuses

Values
Enum Value Description

started

The user has started the track

creating

The infrastructure for the track is being created

created

The infrastructure has been completed

failed

The track setup has failed

stopped

Track was stopped by the user

cleaning

Track is being cleaned up

cleaned

Track has been cleaned up
Example
"started"

TrackStopReason

Description

Possible reasons for stopping a track.

Values
Enum Value Description

expired

The track was stopped because its timeout expired.

user

The track was stopped by a user action.
Example
"expired"

TrackTheme

Fields
Field Name Description
name - String! Name of the lab theme
Example
{"name": "xyz789"}

TrackThemeInput

Description

Input values for track theme

Fields
Input Field Description
name - String! The the name of the theme
Example
{"name": "abc123"}

UpdateCustomResourceInput

Fields
Input Field Description
name - String
description - String
Example
{
  "name": "xyz789",
  "description": "xyz789"
}

UrlCondition

Fields
Field Name Description
urlPart - String! The URL to match against
condition - ConditionType! rule to use for staring matching
Example
{"urlPart": "abc123", "condition": "equals"}

User

Description

User

Fields
Field Name Description
id - ID! Unique ID
profile - UserProfile The user's profile
details - UserDetails The details last used to claim an invite
Arguments
teamID - String
teamSlug - String
organizations - [UserOrganizationEdge!]! The organizations this user is a member of Replace with teams
teams - [UserTeamEdge!]! The teams this user is a member of
is_anonymous - Boolean! Whether the user's account is anonymous
is_global_admin - Boolean Whether the user has admin rights
segments - [UserSegment!]! The user's segments.
claims - [InviteClaim!]! The user's invite claims.
accessibleTracks - [Track!]! accessibleTracks resolves the tracks the user has access to.
reportItem - UserReportItem reportItem resolves statistics for the resolved user
Arguments
Example
{
  "id": "4",
  "profile": UserProfile,
  "details": UserDetails,
  "organizations": [UserOrganizationEdge],
  "teams": [UserTeamEdge],
  "is_anonymous": true,
  "is_global_admin": false,
  "segments": ["instruqt_employee"],
  "claims": [InviteClaim],
  "accessibleTracks": [Track],
  "reportItem": UserReportItem
}

UserActivity

Description

UserActivity the current track and challenge a user is playing.

Fields
Field Name Description
last_activity - Time The last instant the user was active on this track.
track - Track The track this user is currently playing.
challenge - Challenge The challenge this user is currently playing.
participant - Play The current play of this user.
user - User The user.
Example
{
  "last_activity": "10:15:30Z",
  "track": Track,
  "challenge": Challenge,
  "participant": Play,
  "user": User
}

UserDetails

Fields
Field Name Description
id - ID!
user - User
team - Team
firstName - String
lastName - String
email - String
companyName - String
phoneNumber - String
jobTitle - String
jobLevel - String
countryCode - String
usState - String
consent - Boolean
Example
{
  "id": 4,
  "user": User,
  "team": Team,
  "firstName": "abc123",
  "lastName": "xyz789",
  "email": "xyz789",
  "companyName": "abc123",
  "phoneNumber": "xyz789",
  "jobTitle": "xyz789",
  "jobLevel": "xyz789",
  "countryCode": "abc123",
  "usState": "xyz789",
  "consent": false
}

UserDetailsInput

Fields
Input Field Description
firstName - String First name field value of submitted user details
lastName - String Last name field value of submitted user details
email - String email field value of submitted user details
companyName - String Company name field value of submitted user details
phoneNumber - String Phone number field value of submitted user details
jobTitle - String Job title field value of submitted user details
jobLevel - String Job level name field value of submitted user details
countryCode - String Country code field value of submitted user details
usState - String US state field value of submitted user details
consent - Boolean Whether the user has accepted the Consent Notice.
Example
{
  "firstName": "abc123",
  "lastName": "abc123",
  "email": "abc123",
  "companyName": "abc123",
  "phoneNumber": "xyz789",
  "jobTitle": "abc123",
  "jobLevel": "abc123",
  "countryCode": "abc123",
  "usState": "abc123",
  "consent": true
}

UserInput

Description

User

Fields
Input Field Description
id - ID Unique ID
profile - UserProfileInput The user's profile
Example
{"id": 4, "profile": UserProfileInput}

UserOrganizationEdge

Description

Represents a user's relationship to an organization

Fields
Field Name Description
id - ID! ID of this edge; a compound of the user ID and org ID.
node - Organization The organization
role - RoleName The user's role in this organization
Example
{
  "id": "4",
  "node": Organization,
  "role": "owner"
}

UserProfile

Description

User Profile

Fields
Field Name Description
avatar - String Avatar for the user, will typically be fetched from a social login
display_name - String Display name of the user
email - String Email address of the user
slug - String Slug or username of the user
Example
{
  "avatar": "xyz789",
  "display_name": "xyz789",
  "email": "abc123",
  "slug": "xyz789"
}

UserProfileInput

Description

User Profile

Fields
Input Field Description
email - String Email address of the user
Example
{"email": "xyz789"}

UserReportInput

Fields
Input Field Description
teamSlug - String Slug of the team you're querying the report for. Only required if not called from Team.
dateRangeFilter - DateRangeFilter Date range filter for plays
trackIds - [String!] IDs of tracks for which we want to get plays
trackInviteIds - [String!] IDs of track invites
landingPageIds - [String!] IDs of landing pages
tags - [String!] Tags to filter the tracks
includeAnonymousUsers - Boolean Show/Hide anonymous users in the report
userIds - [String!] IDs of users
ordering - Ordering Sorting parameters
pagination - SkipTakePagination Pagination parameters
playType - PlayType Filter for play type
Example
{
  "teamSlug": "abc123",
  "dateRangeFilter": DateRangeFilter,
  "trackIds": ["xyz789"],
  "trackInviteIds": ["xyz789"],
  "landingPageIds": ["xyz789"],
  "tags": ["xyz789"],
  "includeAnonymousUsers": true,
  "userIds": ["abc123"],
  "ordering": Ordering,
  "pagination": SkipTakePagination,
  "playType": "ALL"
}

UserReportItem

Description

UserReportItem represents a row of a user report

Fields
Field Name Description
id - ID! Unique ID of the user
user - User! Unique user other fields relate to
plays - Int! number of plays a user has started
playReportItems - [PlayReportItem!]! The play report items for a user report item.
Arguments
tracksStarted - Int! Number of tracks started
tracksCompleted - Int! Number of tracks completed
completionRate - Float! Completion rate of tracks
totalChallenges - Int! Number of challenges started
completedChallenges - Int! Number of challenges completed
averageProgressPercent - Float! The average progress a user has made in their plays
timeSpent - Int! Sum of all queries plays time spent
lastStartedAt - Time! lastStartedAt represents the timestamp the last play was started.
Example
{
  "id": 4,
  "user": User,
  "plays": 987,
  "playReportItems": [PlayReportItem],
  "tracksStarted": 987,
  "tracksCompleted": 987,
  "completionRate": 987.65,
  "totalChallenges": 987,
  "completedChallenges": 123,
  "averageProgressPercent": 987.65,
  "timeSpent": 123,
  "lastStartedAt": "10:15:30Z"
}

UserReportPage

Description

UserReportPage represents a page of a user report

Fields
Field Name Description
items - [UserReportItem!]!
totalItems - Int!
Example
{"items": [UserReportItem], "totalItems": 123}

UserSegment

Description

A user can be in one or more of these user segments.

Values
Enum Value Description

instruqt_employee

Users in this segment have admin rights

content_creator

Users in this segment are allowed to create content.

instructor

Users in this segment can create invites and view content.

member

Users in this segment are part of an organization but cannot create content.

learner

Users in this segment are not part of any organization.
Example
"instruqt_employee"

UserTeamEdge

Description

Represents a user's relationship to a team

Fields
Field Name Description
id - ID! ID of this edge; a compound of the user ID and org ID.
node - Team The team
role - RoleName The user's role in this team
Example
{"id": 4, "node": Team, "role": "owner"}

VersionedTrack

Fields
Field Name Description
track - Track!
conflicts - [File]!
Example
{
  "track": Track,
  "conflicts": [File]
}

VirtualBrowserCheck

Description

Virtual browser specififc check

Fields
Field Name Description
id - ID! Unique ID
challenge - Challenge! The challenge ID this check belongs to
host - String! On which host (name) the script is executed. Must reference a host in the track config.
browserLocation - Location The url inside the virtual browser must be on in order to pass the check more than one url can be provided, in which case the check will pass if any of the urls are matching The DOM element to check
element - [HtmlElement!]!
innerText - [HtmlElement!]! The InnerText of an element to check
Example
{
  "id": 4,
  "challenge": Challenge,
  "host": "xyz789",
  "browserLocation": Location,
  "element": [HtmlElement],
  "innerText": [HtmlElement]
}

VirtualBrowserCheckInput

Fields
Input Field Description
challenge - String!
track - String!
host - String!
browserLocation - LocationCheckInput
element - [HtmlElementInput!]
innerText - [HtmlElementInput!]
Example
{
  "challenge": "abc123",
  "track": "xyz789",
  "host": "abc123",
  "browserLocation": LocationCheckInput,
  "element": [HtmlElementInput],
  "innerText": [HtmlElementInput]
}

VirtualBrowserConfig

Description

A VirtualBrowserConfig stores the details of a virtual browser

Fields
Field Name Description
id - ID! Unique ID
name - String! Name of the virtual browser host
url - String! URL of the virtual browser host
Example
{
  "id": "4",
  "name": "xyz789",
  "url": "abc123"
}

VirtualBrowserConfigInput

Fields
Input Field Description
id - ID Unique ID
track - String ID of the track this config belongs to
name - String Name of the container, will be used as hostname
url - String URL which the virtual browser will point to
Example
{
  "id": "4",
  "track": "abc123",
  "name": "abc123",
  "url": "xyz789"
}

VirtualMachineConfig

Description

A VirtualMachineConfig stores the details of a VM

Fields
Field Name Description
id - ID! Unique ID
allow_external_ingress - [String!]! What port (ranges) to expose for external ingress
environment - [EnvironmentVariable!] List of key-value pairs that are injected as environment variables
image - String! GCP Compute image to use
machine_type - String! Machine type to use. Must be a valid machine type according to https://cloud.google.com/compute/docs/machine-types
name - String! Name of the vm, will be used as hostname
pool_size - Int! The pool size of VMs that will be kept as warm standby. If this is 0, pooling is disabled
preemptible - Boolean! Whether to use preemptible vms. Defaults to false
shell - String! Which shell to expose in the terminal. Defaults to /bin/sh
cpus - Int The number of CPUs the machine should have
memory - Int The amount of memory the machine should have
nested_virtualization - Boolean! Whether nested virtualization is enabled
provision_ssl_certificate - Boolean! Whether an ssl certificate should be provisioned
Example
{
  "id": 4,
  "allow_external_ingress": ["xyz789"],
  "environment": [EnvironmentVariable],
  "image": "abc123",
  "machine_type": "xyz789",
  "name": "xyz789",
  "pool_size": 987,
  "preemptible": true,
  "shell": "xyz789",
  "cpus": 987,
  "memory": 987,
  "nested_virtualization": false,
  "provision_ssl_certificate": true
}

VirtualMachineConfigInput

Description

A VirtualMachineConfig stores the details of a VM

Fields
Input Field Description
id - ID Unique ID
track - String ID of the track this config belongs to
name - String Name of the vm, will be used as hostname
image - String GCP Compute image to use
machine_type - String Machine type to use. Must be a valid machine type according to https://cloud.google.com/compute/docs/machine-types
allow_external_ingress - [String!] What port (ranges) to expose for external ingress
preemptible - Boolean Whether to use preemptible vms. Defaults to false
shell - String Which shell to expose in the terminal. Defaults to /bin/sh
pool_size - Int The pool size of VMs that will be kept as warm standby. If this is 0, pooling is disabled
environment - [EnvironmentInput!] List of key-value pairs that are injected as environment variables
cpus - Int The number of CPUs the machine should have
memory - Int The amount of memory the machine should have
nested_virtualization - Boolean Whether nested virtualization is enabled
provision_ssl_certificate - Boolean Whether an ssl certificate should be provisioned
Example
{
  "id": 4,
  "track": "xyz789",
  "name": "xyz789",
  "image": "xyz789",
  "machine_type": "xyz789",
  "allow_external_ingress": ["xyz789"],
  "preemptible": true,
  "shell": "xyz789",
  "pool_size": 123,
  "environment": [EnvironmentInput],
  "cpus": 123,
  "memory": 987,
  "nested_virtualization": true,
  "provision_ssl_certificate": true
}

VirtualMachineConfigPreset

Description

A VirtualMachineConfigPreset stores the config for a virtual machine preset.

Fields
Field Name Description
label - String! The label of the preset
image - String! Unique ID
machine_type - String! Machine type to use.
memory - Int! The amount of memory for the machine in MB
cpus - Int! The amount of cpus for the machine
Example
{
  "label": "abc123",
  "image": "xyz789",
  "machine_type": "abc123",
  "memory": 987,
  "cpus": 123
}

VisibilityStatus

Values
Enum Value Description

unpublished

Track has not been published

maintenance

Track is in maintenance

private

Track is private

public

Track is public
Example
"unpublished"

Webhook

Description

Webhook represents an Instruqt Webhook

Fields
Field Name Description
id - ID! The ID of the Webhook
name - String! Name of the webhook
url - String! URL of the webhook
created_at - Time! The time the webhook was created
updated_at - Time! The time the webhook was updated
events - [String!]! The events which trigger the webhook
custom_headers - [CustomHeader!]! Custom header for the webhook
Example
{
  "id": "4",
  "name": "abc123",
  "url": "xyz789",
  "created_at": "10:15:30Z",
  "updated_at": "10:15:30Z",
  "events": ["xyz789"],
  "custom_headers": [CustomHeader]
}

WebhookInput

Description

Parameter used to create or update a webhook

Fields
Input Field Description
name - String Name of the webhook
url - String! URL of the webhook
events - [String!] The events which trigger the webhook
custom_headers - [CustomHeaderInput!] Custom header for the webhook
Example
{
  "name": "abc123",
  "url": "xyz789",
  "events": ["xyz789"],
  "custom_headers": [CustomHeaderInput]
}