Quiz & Assessment Endpoints
Load quiz attempts and submit learner answers.
LoadAssessmentAttempts1 ptFetch paginated assessment attempts
Returns a paginated list of all assessment attempts recorded in the school. You can narrow results by date range, a specific course, or a specific user. This query is useful for reporting dashboards, compliance tracking, and grading workflows. It requires an `authToken` header that identifies a manager-level user — the operation will run in the context of that user. Each attempt includes the associated assessment, individual answers, question details, pass/fail status, grade, and linked course and user records.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| startDate | Date | No | Filters the returned results to the specified start date. |
| endDate | Date | No | Filters the returned results to the specified end date. |
| courseId | ID | No | Filters the returned attempts to those belonging to the specified course. |
| userId | ID | No | Filters the returned attempts to those belonging to the specified user. |
| page | Int | No | The page number to return within the collection. |
| perPage | Int | No | The amount of items to be returned on the page. |
Returns
| Field | Type | Description |
|---|---|---|
| pageInfo | CursorPageInfo! | Pagination metadata including total count, cursor, items per page, and whether more pages are available. |
| assessmentAttempts | [AssessmentAttempt!] | The list of assessment attempts for the current page, each containing grade, pass/fail status, answers, associated user, course, and topic details. |
Example
query LoadAssessmentAttempts(
$startDate: Date
$endDate: Date
$courseId: ID
$userId: ID
$page: Int
$perPage: Int
) {
LoadAssessmentAttempts(
startDate: $startDate
endDate: $endDate
courseId: $courseId
userId: $userId
page: $page
perPage: $perPage
) {
pageInfo {
perPage
cursor
total
hasMore
}
assessmentAttempts {
id
status
grade
passed
forgiven
createdAt
updatedAt
timeElapsedInSeconds
courseId
assessment {
id
title
type
minPassingPercent
}
user {
id
email
firstName
lastName
}
course {
id
title
slug
}
answers {
id
question
answer
correct
}
}
}
}Example Response
{
"data": {
"LoadAssessmentAttempts": {
"pageInfo": {
"perPage": 20,
"cursor": "eyJpZCI6IjEwMCJ9",
"total": 142,
"hasMore": true
},
"assessmentAttempts": [
{
"id": "attempt_001",
"status": "finished",
"grade": 85,
"passed": true,
"forgiven": false,
"createdAt": "2024-03-15T10:30:00Z",
"updatedAt": "2024-03-15T10:45:00Z",
"timeElapsedInSeconds": 900,
"courseId": "course_abc123",
"assessment": {
"id": "assessment_xyz789",
"title": "Module 3 Quiz",
"type": "quiz",
"minPassingPercent": 80
},
"user": {
"id": "user_def456",
"email": "[email protected]",
"firstName": "Jane",
"lastName": "Doe"
},
"course": {
"id": "course_abc123",
"title": "Introduction to Data Science",
"slug": "intro-to-data-science"
},
"answers": [
{
"id": "answer_001",
"question": "What is a variable?",
"answer": "A named storage location",
"correct": true
}
]
}
]
}
},
"pageInfo": null,
"assessmentAttempts": null
}This query requires an `authToken` header set to a manager-level user. Without it the operation will fail or return no results.
LoadAssessmentAttemptsByTopicOrCourse1 ptLoad assessment attempts by topic or course
Returns all assessment attempts made by the current user for a given topic and/or course. This is useful for displaying a learner's attempt history, reviewing past grades, and determining whether a user may retake an assessment. At least one of `topicId` or `courseId` should be provided to filter results. The user context is resolved from the session or an `authToken` header.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| topicId | ID | No | The ID of the topic to filter assessment attempts by. At least one of `topicId` or `courseId` should be provided. |
| courseId | ID | No | The ID of the course to filter assessment attempts by. At least one of `topicId` or `courseId` should be provided. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | The unique identifier of the assessment attempt. |
| assessment | Assessment | Metadata about the assessment, including title and minimum passing percentage. |
| answers | [AssessmentAnswer!] | The answers submitted by the user in each attempt. |
| course | Course | The course associated with each assessment attempt. |
| courseId | ID | The ID of the course associated with each attempt. |
| user | User | The user who owns each assessment attempt. |
| createdAt | Date | The date and time when each attempt was created. |
| updatedAt | Date | The date and time when each attempt was last updated. |
| timeElapsedInSeconds | Int | The total time elapsed on each attempt in seconds. |
| status | AssessmentAttemptStatus! | The status of each attempt: `started`, `finished`, or `pending`. |
| grade | Int | The grade achieved on each attempt, expressed as a percentage. |
| originalGrade | Int | The original grade before any admin adjustments. |
| passed | Boolean! | Whether the user passed each attempt. |
| forgiven | Boolean! | Whether a failed attempt has been forgiven by an admin. |
| assignmentSubmissionId | ID | The ID of the linked assignment submission, if applicable. |
| questions | [QuizQuestion!] | The questions included in each attempt along with user responses. |
| topicType | TopicType | The type of topic this assessment belongs to. |
| topic | Topic | The topic associated with each attempt. |
| topicId | ID | The ID of the topic associated with each attempt. |
| questionsCount | Int | The total number of questions in each attempt. |
| correctQuestionsCount | Int | The number of correctly answered questions. |
| answeredQuestionsCount | Int | The number of questions answered by the user. |
| unansweredQuestionsCount | Int | The number of questions left unanswered. |
| questionsWithChoicesCount | Int | The number of questions that include selectable answer choices. |
| poolLabelByQuestionId | JSON | A JSON map of question IDs to their pool labels. |
| linkedWorkbook | ID | The ID of any linked workbook associated with each attempt. |
| adminUpdatedGrade | Boolean! | Whether an admin has manually updated the grade for each attempt. |
| securityToken | String | A security token for proctored or secure assessment flows. |
Example
query LoadAssessmentAttemptsByTopicOrCourse {
LoadAssessmentAttemptsByTopicOrCourse(
topicId: "topic-abc123"
courseId: "course-xyz789"
) {
id
status
grade
passed
forgiven
createdAt
updatedAt
questionsCount
correctQuestionsCount
timeElapsedInSeconds
assessment {
id
title
type
minPassingPercent
}
topic {
id
title
type
}
course {
id
title
slug
}
}
}Example Response
{
"data": {
"LoadAssessmentAttemptsByTopicOrCourse": [
{
"id": "attempt-001",
"status": "finished",
"grade": 75,
"passed": false,
"forgiven": false,
"createdAt": "2024-03-01T10:00:00Z",
"updatedAt": "2024-03-01T10:15:00Z",
"questionsCount": 10,
"correctQuestionsCount": 7,
"timeElapsedInSeconds": 900,
"assessment": {
"id": "assessment-001",
"title": "Module 1 Quiz",
"type": "quiz",
"minPassingPercent": 80
},
"topic": {
"id": "topic-abc123",
"title": "Module 1 Quiz",
"type": "quiz"
},
"course": {
"id": "course-xyz789",
"title": "Introduction to APIs",
"slug": "introduction-to-apis"
}
},
{
"id": "attempt-002",
"status": "finished",
"grade": 90,
"passed": true,
"forgiven": false,
"createdAt": "2024-03-05T14:00:00Z",
"updatedAt": "2024-03-05T14:12:00Z",
"questionsCount": 10,
"correctQuestionsCount": 9,
"timeElapsedInSeconds": 720,
"assessment": {
"id": "assessment-001",
"title": "Module 1 Quiz",
"type": "quiz",
"minPassingPercent": 80
},
"topic": {
"id": "topic-abc123",
"title": "Module 1 Quiz",
"type": "quiz"
},
"course": {
"id": "course-xyz789",
"title": "Introduction to APIs",
"slug": "introduction-to-apis"
}
}
]
},
"id": "abc-123",
"assessment": null,
"answers": null,
"course": null,
"courseId": "abc-123",
"user": null,
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"timeElapsedInSeconds": 0,
"status": "started",
"grade": 0,
"originalGrade": 0,
"passed": false,
"assignmentSubmissionId": "abc-123",
"questions": null,
"topicType": "ad",
"forgiven": false,
"topic": null,
"topicId": "abc-123",
"questionsCount": 0,
"correctQuestionsCount": 0,
"answeredQuestionsCount": 0,
"unansweredQuestionsCount": 0,
"questionsWithChoicesCount": 0,
"poolLabelByQuestionId": {},
"linkedWorkbook": "abc-123",
"adminUpdatedGrade": false,
"securityToken": "example"
}Both `topicId` and `courseId` are optional individually, but providing at least one is recommended to return meaningful results. Results are scoped to the current authenticated user.
LoadAssessmentAttemptWithQuestions1 ptLoad assessment attempt with questions
Returns an existing or newly created assessment attempt for a given topic, populated with all quiz questions. Call this query when a user starts a new attempt or resumes an in-progress one. If `assessmentAttemptId` is supplied, the matching in-progress attempt is resumed; otherwise, a new attempt is initiated. You can optionally shuffle and subset questions, associate the attempt with a course or linked workbook, or take the assessment on behalf of a learner as an instructor. The user context is resolved from the session or an `authToken` header.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| id | ID! | Yes | The ID of the Topic. |
| shouldShuffleAndSubset | Boolean | No | Flag to randomly order questions and choose a subset of questions to use. |
| courseId | ID | No | The ID of the course. |
| linkedWorkbookdeprecated | ID | No | The ID of the linked workbook to associate with this assessment attempt. Deprecated in favor of `linkedWorkbookId`. |
| linkedWorkbookId | ID | No | The ID of the linked workbook. |
| instructorAssessmentUserdeprecated | ID | No | The ID of the user on behalf of whom the instructor is taking the assessment. Deprecated in favor of `instructorAssessmentUserId`. |
| instructorAssessmentUserId | ID | No | The ID of the user on behalf of whom the instructor takes the assessment. |
| topicType | AssessmentTopicType! | Yes | The type of the Topic. |
| assessmentAttemptId | ID | No | The ID of the in-progress assessment attempt to resume from. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | The unique identifier of the assessment attempt. |
| assessment | Assessment | Metadata about the assessment being attempted, including title and minimum passing percentage. |
| answers | [AssessmentAnswer!] | The answers submitted by the user in this attempt, including correctness details. |
| course | Course | The course associated with this assessment attempt. |
| courseId | ID | The ID of the course associated with this attempt. |
| user | User | The user who owns this assessment attempt. |
| createdAt | Date | The date and time when this attempt was created. |
| updatedAt | Date | The date and time when this attempt was last updated. |
| timeElapsedInSeconds | Int | The total time elapsed on this attempt in seconds. |
| status | AssessmentAttemptStatus! | The current status of the attempt: `started`, `finished`, or `pending`. |
| grade | Int | The grade achieved on this attempt, expressed as a percentage. |
| originalGrade | Int | The original grade before any admin adjustments. |
| passed | Boolean! | Whether the user passed this assessment attempt. |
| forgiven | Boolean! | Whether a failed attempt has been forgiven by an admin. |
| assignmentSubmissionId | ID | The ID of the linked assignment submission, if applicable. |
| questions | [QuizQuestion!] | The list of quiz questions included in this attempt, with answer choices and response data. |
| topicType | TopicType | The type of topic this assessment belongs to (e.g., quiz, survey, test). |
| topic | Topic | The topic associated with this assessment attempt. |
| topicId | ID | The ID of the topic associated with this attempt. |
| questionsCount | Int | The total number of questions in this attempt. |
| correctQuestionsCount | Int | The number of questions answered correctly. |
| answeredQuestionsCount | Int | The number of questions the user has answered so far. |
| unansweredQuestionsCount | Int | The number of questions the user has not yet answered. |
| questionsWithChoicesCount | Int | The number of questions that include answer choices. |
| poolLabelByQuestionId | JSON | A JSON map of question IDs to their question pool labels, used when questions are drawn from pools. |
| linkedWorkbook | ID | The ID of the linked workbook associated with this attempt, if any. |
| adminUpdatedGrade | Boolean! | Whether an admin has manually updated the grade for this attempt. |
| securityToken | String | A security token associated with this attempt, used for proctored or secure assessment flows. |
Example
query LoadAssessmentAttemptWithQuestions {
LoadAssessmentAttemptWithQuestions(
id: "topic-abc123"
topicType: quiz
courseId: "course-xyz789"
shouldShuffleAndSubset: true
) {
id
status
grade
passed
forgiven
questionsCount
correctQuestionsCount
answeredQuestionsCount
unansweredQuestionsCount
timeElapsedInSeconds
assessment {
id
title
type
minPassingPercent
}
questions {
questionId
body
type
required
choices {
choiceId
value
correct
}
}
topic {
id
title
type
}
course {
id
title
slug
}
}
}Example Response
{
"data": {
"LoadAssessmentAttemptWithQuestions": {
"id": "attempt-001",
"status": "started",
"grade": null,
"passed": false,
"forgiven": false,
"questionsCount": 10,
"correctQuestionsCount": 0,
"answeredQuestionsCount": 0,
"unansweredQuestionsCount": 10,
"timeElapsedInSeconds": 0,
"assessment": {
"id": "assessment-001",
"title": "Module 1 Quiz",
"type": "quiz",
"minPassingPercent": 80
},
"questions": [
{
"questionId": "q-001",
"body": "What is the primary purpose of GraphQL?",
"type": "multipleChoice",
"required": true,
"choices": [
{
"choiceId": "c-001",
"value": "Query and manipulate data via a typed schema",
"correct": true
},
{
"choiceId": "c-002",
"value": "Style web pages",
"correct": false
},
{
"choiceId": "c-003",
"value": "Manage relational databases",
"correct": false
}
]
}
],
"topic": {
"id": "topic-abc123",
"title": "Module 1 Quiz",
"type": "quiz"
},
"course": {
"id": "course-xyz789",
"title": "Introduction to APIs",
"slug": "introduction-to-apis"
}
}
},
"id": "abc-123",
"assessment": null,
"answers": null,
"course": null,
"courseId": "abc-123",
"user": null,
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"timeElapsedInSeconds": 0,
"status": "started",
"grade": 0,
"originalGrade": 0,
"passed": false,
"assignmentSubmissionId": "abc-123",
"questions": null,
"topicType": "ad",
"forgiven": false,
"topic": null,
"topicId": "abc-123",
"questionsCount": 0,
"correctQuestionsCount": 0,
"answeredQuestionsCount": 0,
"unansweredQuestionsCount": 0,
"questionsWithChoicesCount": 0,
"poolLabelByQuestionId": {},
"linkedWorkbook": "abc-123",
"adminUpdatedGrade": false,
"securityToken": "example"
}Either a new attempt is created or an existing in-progress attempt is resumed depending on whether `assessmentAttemptId` is provided. Pass `shouldShuffleAndSubset: true` to randomize and limit the question set presented to the learner.
LoadSuperQuizInfo1 ptLoad super quiz questions and settings
Retrieves the combined question set and configuration data for one or more quizzes that make up a super quiz experience. This is typically used to assemble a single, unified quiz session that spans multiple underlying quiz topics within a course. You can optionally pass a `courseId` to scope the request and control whether previously correct answers are included. If an `authToken` header is provided, the response may be personalized to reflect the authenticated user's previous answers and progress.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| courseId | ID | No | The ID of the course that contains the quizzes, used to scope the query context. |
| includeCorrectAnswers | Boolean | No | Flag to include questions the user previously got correct. |
| quizzes | [ID!]! | Yes | The IDs of the Quizzes user selects. |
Returns
| Field | Type | Description |
|---|---|---|
| quizzes | [ID!] | The IDs of the quizzes included in this super quiz session. |
| questions | [QuizQuestion!] | The aggregated list of questions drawn from all specified quizzes. |
| totalTimeInSeconds | Int | The total time limit for the entire super quiz session in seconds, if a timer is enabled. |
| questionSkipEnabled | Boolean | Whether the learner is allowed to skip questions and return to them later. |
| timerEnabled | Boolean | Whether a countdown timer is active for this super quiz. |
| navigationDisabled | Boolean | Whether backward navigation between questions is disabled. |
| displayAllHints | Boolean | Whether hints are shown for all questions by default. |
| timePerQuestionInSeconds | Int | Per-question time limit in seconds, if applicable. |
Example
query LoadSuperQuizInfo(
$courseId: ID
$includeCorrectAnswers: Boolean
$quizzes: [ID!]!
) {
LoadSuperQuizInfo(
courseId: $courseId
includeCorrectAnswers: $includeCorrectAnswers
quizzes: $quizzes
) {
quizzes
totalTimeInSeconds
timerEnabled
navigationDisabled
questionSkipEnabled
displayAllHints
timePerQuestionInSeconds
questions {
questionId
body
type
required
isMultipleChoice
isOpenEnded
choices {
choiceId
value
correct
}
}
}
}Example Response
{
"data": {
"LoadSuperQuizInfo": {
"quizzes": [
"quiz_001",
"quiz_002"
],
"totalTimeInSeconds": 1800,
"timerEnabled": true,
"navigationDisabled": false,
"questionSkipEnabled": true,
"displayAllHints": false,
"timePerQuestionInSeconds": null,
"questions": [
{
"questionId": "q_abc123",
"body": "Which of the following is a supervised learning algorithm?",
"type": "multipleChoice",
"required": true,
"isMultipleChoice": true,
"isOpenEnded": false,
"choices": [
{
"choiceId": "choice_1",
"value": "Linear Regression",
"correct": true
},
{
"choiceId": "choice_2",
"value": "K-Means Clustering",
"correct": false
}
]
}
]
}
},
"quizzes": [
"abc-123"
],
"questions": null,
"totalTimeInSeconds": 0,
"questionSkipEnabled": false,
"timerEnabled": false,
"navigationDisabled": false,
"displayAllHints": false,
"timePerQuestionInSeconds": 0
}CreateAssessmentAttempt1 ptCreate an assessment attempt
Creates a new assessment attempt for a learner on a specific course topic. This mutation is primarily used to initiate a super quiz attempt, where the caller supplies the set of questions the learner has selected. An optional `userId` allows an admin or integration to create the attempt on behalf of a specific user; if omitted, the authenticated user is used. A `grade` value can also be provided directly to set the attempt's score at creation time. The acting user can be overridden by supplying an `authToken` header.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| topicId | ID! | Yes | The ID of the topic. |
| courseId | ID! | Yes | The ID of the course. |
| questions | [QuestionInput!]! | Yes | The questions user selected for super quiz. |
| userId | ID | No | The ID of the user to take the assessment. |
| grade | Int | No | The grade of the assessment attempt. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | The unique identifier of the newly created assessment attempt. |
| assessment | Assessment | The assessment definition linked to this attempt. |
| answers | [AssessmentAnswer!] | The individual answers recorded for this attempt. |
| course | Course | The course associated with this attempt. |
| courseId | ID | The ID of the associated course. |
| user | User | The learner who owns this attempt. |
| createdAt | Date | Timestamp when the attempt was created. |
| updatedAt | Date | Timestamp when the attempt was last updated. |
| timeElapsedInSeconds | Int | Time spent on the attempt, in seconds. |
| status | AssessmentAttemptStatus! | Current status of the attempt: started, finished, or pending. |
| grade | Int | The grade assigned to this attempt as a percentage. |
| originalGrade | Int | The grade before any administrative overrides. |
| passed | Boolean! | Whether the learner passed the assessment. |
| assignmentSubmissionId | ID | ID of a related assignment submission, if applicable. |
| questions | [QuizQuestion!] | The quiz questions included in this attempt. |
| topicType | TopicType | The topic type (e.g. quiz, test, survey) for this attempt. |
| forgiven | Boolean! | Whether the attempt has been administratively forgiven. |
| topic | Topic | The topic resource this attempt is associated with. |
| topicId | ID | The ID of the topic. |
| questionsCount | Int | Total number of questions in the attempt. |
| correctQuestionsCount | Int | Number of correctly answered questions. |
| answeredQuestionsCount | Int | Number of questions that received an answer. |
| unansweredQuestionsCount | Int | Number of questions that were not answered. |
| questionsWithChoicesCount | Int | Number of questions that offered selectable choices. |
| poolLabelByQuestionId | JSON | Map of question IDs to their question pool labels. |
| linkedWorkbook | ID | ID of a linked workbook, if any. |
| adminUpdatedGrade | Boolean! | Whether the grade was manually overridden by an administrator. |
| securityToken | String | A security token associated with this attempt. |
Example
mutation CreateAssessmentAttempt {
CreateAssessmentAttempt(
topicId: "topic_quiz_001"
courseId: "course_abc123"
questions: [
{ questionId: "q1", response: "Paris" }
{ questionId: "q2", response: "choice_b" }
]
userId: "user_001"
) {
id
status
grade
passed
forgiven
adminUpdatedGrade
createdAt
updatedAt
timeElapsedInSeconds
assessment {
id
title
type
minPassingPercent
}
questionsCount
correctQuestionsCount
answeredQuestionsCount
unansweredQuestionsCount
topic {
id
title
type
}
user {
id
email
firstName
lastName
}
}
}Example Response
{
"data": {
"CreateAssessmentAttempt": {
"id": "attempt_new_def456",
"status": "finished",
"grade": 90,
"passed": true,
"forgiven": false,
"adminUpdatedGrade": false,
"createdAt": "2024-03-15T09:00:00Z",
"updatedAt": "2024-03-15T09:12:00Z",
"timeElapsedInSeconds": 720,
"assessment": {
"id": "assessment_002",
"title": "Super Quiz - Chapter 5",
"type": "quiz",
"minPassingPercent": 80
},
"questionsCount": 10,
"correctQuestionsCount": 9,
"answeredQuestionsCount": 10,
"unansweredQuestionsCount": 0,
"topic": {
"id": "topic_quiz_001",
"title": "Chapter 5 Quiz",
"type": "quiz"
},
"user": {
"id": "user_001",
"email": "[email protected]",
"firstName": "Jane",
"lastName": "Doe"
}
}
},
"id": "abc-123",
"assessment": null,
"answers": null,
"course": null,
"courseId": "abc-123",
"user": null,
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"timeElapsedInSeconds": 0,
"status": "started",
"grade": 0,
"originalGrade": 0,
"passed": false,
"assignmentSubmissionId": "abc-123",
"questions": null,
"topicType": "ad",
"forgiven": false,
"topic": null,
"topicId": "abc-123",
"questionsCount": 0,
"correctQuestionsCount": 0,
"answeredQuestionsCount": 0,
"unansweredQuestionsCount": 0,
"questionsWithChoicesCount": 0,
"poolLabelByQuestionId": {},
"linkedWorkbook": "abc-123",
"adminUpdatedGrade": false,
"securityToken": "example"
}The `questions` argument accepts a list of `QuestionInput` objects representing the learner's selected questions for a super quiz. If `userId` is omitted, the attempt is created for the authenticated user.
CreateAssignmentSubmission1 ptCreate an assignment submission
Creates a new assignment submission for the current user within a specified course. This mutation is used when a learner completes a manually graded assignment — which may include written text, an uploaded file, a video, or a linked quiz attempt. When a quiz attempt is associated, it ties the assessment answers to the submission for instructor review. The acting user can be overridden by supplying an `authToken` header.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| body | String | No | The body of the assignment submission. |
| videoAsset | String | No | The URL of the video asset. |
| asset | String | No | The URL of the asset. |
| quizAttempt | ID | No | The ID of the assessment attempt. |
| assignment | ID | No | The ID of the assignment. |
| course | ID! | Yes | The ID of the course. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | Unique identifier of the assignment submission. |
| assignment | Assignment | The assignment this submission belongs to. |
| courseId | ID | The ID of the course in which the submission was made. |
| course | Course | The full course object associated with this submission. |
| user | User | The user who created the submission. |
| body | String | The written text body of the submission. |
| asset | URL | URL of an uploaded file asset attached to the submission. |
| additionalAsset | URL | URL of a secondary uploaded file asset, if any. |
| videoAsset | String | Identifier or URL of a video asset attached to the submission. |
| grade | AssignmentSubmissionGrade | The grade applied to the submission: completed or incomplete. |
| numericGrade | Float | A numeric grade value assigned to the submission by an instructor. |
| gradeFeedback | String | Written feedback from the instructor about the submission's grade. |
| commentsCount | Int! | The number of comments attached to this submission. |
| adminUpdatedGrade | Boolean! | Indicates whether an administrator has manually updated the grade. |
| quizAttempt | AssessmentAttempt | An associated assessment attempt linked to this assignment submission, if applicable. |
| license | License | The license under which this submission was made, if applicable. |
| createdAt | Date | Timestamp when the submission was created. |
| updatedAt | Date | Timestamp when the submission was last updated. |
Example
mutation CreateAssignmentSubmission {
CreateAssignmentSubmission(
course: "course_abc123"
assignment: "assignment_def456"
body: "My completed assignment response goes here."
asset: "https://cdn.example.com/uploads/submission_file.pdf"
videoAsset: null
quizAttempt: null
) {
id
body
grade
numericGrade
gradeFeedback
commentsCount
adminUpdatedGrade
createdAt
updatedAt
assignment {
id
title
description
}
course {
id
title
slug
}
user {
id
email
name
}
asset
videoAsset
}
}Example Response
{
"data": {
"CreateAssignmentSubmission": {
"id": "submission_ghi789",
"body": "My completed assignment response goes here.",
"grade": "completed",
"numericGrade": null,
"gradeFeedback": null,
"commentsCount": 0,
"adminUpdatedGrade": false,
"createdAt": "2024-06-01T10:30:00Z",
"updatedAt": "2024-06-01T10:30:00Z",
"assignment": {
"id": "assignment_def456",
"title": "Final Project Essay",
"description": "Write a 500-word essay on the topic covered in Module 5."
},
"course": {
"id": "course_abc123",
"title": "Introduction to Geography",
"slug": "intro-to-geography"
},
"user": {
"id": "user_456",
"email": "[email protected]",
"name": "Jane Doe"
},
"asset": "https://cdn.example.com/uploads/submission_file.pdf",
"videoAsset": null
}
},
"id": "abc-123",
"assignment": null,
"courseId": "abc-123",
"course": null,
"user": null,
"asset": "https://example.com",
"additionalAsset": "https://example.com",
"videoAsset": "example",
"body": "example",
"commentsCount": 0,
"numericGrade": 0,
"grade": "completed",
"gradeFeedback": "example",
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"quizAttempt": null,
"adminUpdatedGrade": false,
"license": null
}CreateUnansweredAssessmentAttempt1 ptCreate an assessment attempt for unanswered questions
Creates a new assessment attempt that contains only the questions the user left unanswered in a prior completed attempt. This is used in assessment flows where question-skipping is enabled and the learner chooses to go back and answer skipped questions after completing the rest of the assessment. You must provide the topic ID, course ID, and the ID of the previously completed attempt to derive which questions were unanswered. The acting user can be overridden by supplying an `authToken` header.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| topicId | ID! | Yes | The ID of the topic. |
| courseId | ID! | Yes | The ID of the course. |
| completedAssessmentAttemptId | ID! | Yes | The ID of the last completed assessment attempt. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | Unique identifier of the newly created unanswered-questions attempt. |
| assessment | Assessment | The assessment this attempt belongs to. |
| answers | [AssessmentAnswer!] | Recorded answers for this attempt (initially empty until questions are answered). |
| course | Course | The course containing the assessment topic. |
| courseId | ID | The ID of the course for this attempt. |
| user | User | The user this attempt belongs to. |
| status | AssessmentAttemptStatus! | Current status of the attempt (started, finished, or pending). |
| grade | Int | The percentage grade for this attempt once completed. |
| passed | Boolean! | Whether the user passed this attempt. |
| forgiven | Boolean! | Whether this attempt has been administratively forgiven. |
| adminUpdatedGrade | Boolean! | Whether an administrator has manually overridden the grade. |
| questions | [QuizQuestion!] | The unanswered questions from the prior attempt, now presented for answering. |
| topic | Topic | The topic that contains the assessment. |
| topicId | ID | The ID of the topic for this attempt. |
| topicType | TopicType | The type of topic (quiz, test, survey, etc.). |
| questionsCount | Int | Total number of questions in this unanswered attempt. |
| unansweredQuestionsCount | Int | Number of questions still unanswered in this attempt. |
| answeredQuestionsCount | Int | Number of questions answered so far in this attempt. |
| correctQuestionsCount | Int | Number of questions answered correctly. |
| assignmentSubmissionId | ID | ID of a linked assignment submission, if applicable. |
| securityToken | String | Security token for proctored assessment validation. |
| createdAt | Date | Timestamp when this attempt was created. |
| updatedAt | Date | Timestamp when this attempt was last updated. |
Example
mutation CreateUnansweredAssessmentAttempt {
CreateUnansweredAssessmentAttempt(
topicId: "topic_pqr678"
courseId: "course_abc123"
completedAssessmentAttemptId: "attempt_xyz789"
) {
id
status
grade
passed
questionsCount
unansweredQuestionsCount
answeredQuestionsCount
forgiven
adminUpdatedGrade
createdAt
assessment {
id
title
minPassingPercent
}
questions {
questionId
body
type
choices {
choiceId
value
correct
}
}
course {
id
title
}
user {
id
email
}
}
}Example Response
{
"data": {
"CreateUnansweredAssessmentAttempt": {
"id": "attempt_stu901",
"status": "started",
"grade": null,
"passed": false,
"questionsCount": 3,
"unansweredQuestionsCount": 3,
"answeredQuestionsCount": 0,
"forgiven": false,
"adminUpdatedGrade": false,
"createdAt": "2024-06-01T12:00:00Z",
"assessment": {
"id": "assessment_001",
"title": "Module 3 Quiz",
"minPassingPercent": 80
},
"questions": [
{
"questionId": "q_003",
"body": "What is the largest ocean on Earth?",
"type": "multipleChoice",
"choices": [
{
"choiceId": "c_001",
"value": "Pacific Ocean",
"correct": true
},
{
"choiceId": "c_002",
"value": "Atlantic Ocean",
"correct": false
}
]
}
],
"course": {
"id": "course_abc123",
"title": "Introduction to Geography"
},
"user": {
"id": "user_456",
"email": "[email protected]"
}
}
},
"id": "abc-123",
"assessment": null,
"answers": null,
"course": null,
"courseId": "abc-123",
"user": null,
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"timeElapsedInSeconds": 0,
"status": "started",
"grade": 0,
"originalGrade": 0,
"passed": false,
"assignmentSubmissionId": "abc-123",
"questions": null,
"topicType": "ad",
"forgiven": false,
"topic": null,
"topicId": "abc-123",
"questionsCount": 0,
"correctQuestionsCount": 0,
"answeredQuestionsCount": 0,
"unansweredQuestionsCount": 0,
"questionsWithChoicesCount": 0,
"poolLabelByQuestionId": {},
"linkedWorkbook": "abc-123",
"adminUpdatedGrade": false,
"securityToken": "example"
}This mutation is intended for assessments where `questionSkipEnabled` is true on the topic. It requires a previously completed attempt ID to determine which questions were skipped.
MergeAssessmentAttemptIntoComplete1 ptMerge assessment attempt into completed attempt
Merges an in-progress assessment attempt into the most recently completed assessment attempt. This mutation is intended for use after a learner finishes reviewing unanswered questions in a resumed session — the answers from the current attempt are folded into the last completed attempt, producing a single unified result. The acting user can be overridden by supplying an `authToken` header.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| completedAssessmentAttemptId | ID! | Yes | The ID of the last completed assessment attempt. |
| assessmentAttemptId | ID! | Yes | The ID of the assessment attempt. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | The unique identifier of the merged assessment attempt. |
| assessment | Assessment | The assessment definition associated with this attempt, including title, type, and passing threshold. |
| answers | [AssessmentAnswer!] | The list of individual answers recorded in this attempt. |
| course | Course | The course to which this assessment attempt belongs. |
| courseId | ID | The ID of the associated course. |
| user | User | The learner who submitted this assessment attempt. |
| createdAt | Date | Timestamp when the attempt was first created. |
| updatedAt | Date | Timestamp when the attempt was last updated. |
| timeElapsedInSeconds | Int | Total time the learner spent on the attempt, in seconds. |
| status | AssessmentAttemptStatus! | Current status of the attempt: started, finished, or pending. |
| grade | Int | The final grade (as a percentage) assigned to this attempt. |
| originalGrade | Int | The grade before any administrative overrides. |
| passed | Boolean! | Whether the learner passed the assessment. |
| assignmentSubmissionId | ID | ID of the associated assignment submission, if applicable. |
| questions | [QuizQuestion!] | The list of quiz questions included in this attempt. |
| topicType | TopicType | The type of topic this assessment belongs to (e.g. quiz, test, survey). |
| forgiven | Boolean! | Whether this attempt has been forgiven by an admin. |
| topic | Topic | The topic resource this assessment attempt is linked to. |
| topicId | ID | The ID of the associated topic. |
| questionsCount | Int | Total number of questions in the attempt. |
| correctQuestionsCount | Int | Number of questions answered correctly. |
| answeredQuestionsCount | Int | Number of questions that were answered. |
| unansweredQuestionsCount | Int | Number of questions left unanswered. |
| questionsWithChoicesCount | Int | Number of questions that included selectable answer choices. |
| poolLabelByQuestionId | JSON | A JSON map of question IDs to their question pool labels. |
| linkedWorkbook | ID | ID of a linked workbook associated with this attempt, if any. |
| adminUpdatedGrade | Boolean! | Whether an administrator has manually overridden the grade. |
| securityToken | String | A security token associated with this assessment attempt. |
Example
mutation MergeAssessmentAttemptIntoComplete {
MergeAssessmentAttemptIntoComplete(
completedAssessmentAttemptId: "attempt_completed_abc123"
assessmentAttemptId: "attempt_current_xyz789"
) {
id
status
grade
passed
forgiven
adminUpdatedGrade
createdAt
updatedAt
timeElapsedInSeconds
assessment {
id
title
type
minPassingPercent
}
answers {
id
question
answer
correct
}
questionsCount
correctQuestionsCount
answeredQuestionsCount
unansweredQuestionsCount
user {
id
email
firstName
lastName
}
}
}Example Response
{
"data": {
"MergeAssessmentAttemptIntoComplete": {
"id": "attempt_completed_abc123",
"status": "finished",
"grade": 85,
"passed": true,
"forgiven": false,
"adminUpdatedGrade": false,
"createdAt": "2024-03-10T14:22:00Z",
"updatedAt": "2024-03-10T14:35:00Z",
"timeElapsedInSeconds": 780,
"assessment": {
"id": "assessment_001",
"title": "Module 3 Final Quiz",
"type": "test",
"minPassingPercent": 75
},
"answers": [
{
"id": "answer_001",
"question": "What is the capital of France?",
"answer": "Paris",
"correct": true
},
{
"id": "answer_002",
"question": "What is 2 + 2?",
"answer": "4",
"correct": true
}
],
"questionsCount": 20,
"correctQuestionsCount": 17,
"answeredQuestionsCount": 20,
"unansweredQuestionsCount": 0,
"user": {
"id": "user_001",
"email": "[email protected]",
"firstName": "Jane",
"lastName": "Doe"
}
}
},
"id": "abc-123",
"assessment": null,
"answers": null,
"course": null,
"courseId": "abc-123",
"user": null,
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"timeElapsedInSeconds": 0,
"status": "started",
"grade": 0,
"originalGrade": 0,
"passed": false,
"assignmentSubmissionId": "abc-123",
"questions": null,
"topicType": "ad",
"forgiven": false,
"topic": null,
"topicId": "abc-123",
"questionsCount": 0,
"correctQuestionsCount": 0,
"answeredQuestionsCount": 0,
"unansweredQuestionsCount": 0,
"questionsWithChoicesCount": 0,
"poolLabelByQuestionId": {},
"linkedWorkbook": "abc-123",
"adminUpdatedGrade": false,
"securityToken": "example"
}The `authToken` request header determines which user's attempt is acted upon. Ensure `assessmentAttemptId` refers to the current in-progress attempt and `completedAssessmentAttemptId` refers to the previously finished attempt for the same assessment.
UpdateAssessmentAttempt1 ptUpdate an assessment attempt
Updates an in-progress assessment attempt for the current user. This mutation is called repeatedly during an assessment session — once per question to record the user's selected answer, and again when the user submits the assessment to mark it as finished. The returned `AssessmentAttempt` includes grading details, question-level data, and associated course and user information. The acting user can be overridden by supplying an `authToken` header.
Arguments
| Name | Type | Required | Description |
|---|---|---|---|
| activeQuestion | QuestionInput | No | The active question with user's selected choice(s). |
| assessmentAttempt | AssessmentAttemptInput | No | The assessment attempt to be updated. |
Returns
| Field | Type | Description |
|---|---|---|
| id | ID! | Unique identifier of the assessment attempt. |
| assessment | Assessment | The assessment associated with this attempt, including its title, type, and minimum passing percentage. |
| answers | [AssessmentAnswer!] | List of recorded answers for this attempt, including correctness indicators. |
| course | Course | The course in which this assessment attempt was made. |
| courseId | ID | The ID of the course associated with this attempt. |
| user | User | The user who made this assessment attempt. |
| status | AssessmentAttemptStatus! | Current status of the attempt: started, finished, or pending. |
| grade | Int | The calculated percentage grade for this attempt. |
| originalGrade | Int | The original grade before any administrative overrides. |
| passed | Boolean! | Whether the user passed the assessment based on the minimum passing percentage. |
| forgiven | Boolean! | Whether this attempt has been forgiven (overridden to passing) by an administrator. |
| adminUpdatedGrade | Boolean! | Indicates whether an administrator has manually updated the grade for this attempt. |
| questions | [QuizQuestion!] | The list of quiz questions included in this attempt, with response and grading details. |
| topic | Topic | The topic (lesson page) that contains the assessment. |
| topicId | ID | The ID of the topic containing the assessment. |
| topicType | TopicType | The type of topic (e.g., quiz, test, survey) for this attempt. |
| questionsCount | Int | Total number of questions in the assessment. |
| correctQuestionsCount | Int | Number of questions answered correctly. |
| answeredQuestionsCount | Int | Number of questions the user has answered. |
| unansweredQuestionsCount | Int | Number of questions left unanswered. |
| questionsWithChoicesCount | Int | Number of questions that have predefined answer choices. |
| timeElapsedInSeconds | Int | Total time the user has spent on this attempt, in seconds. |
| assignmentSubmissionId | ID | If this attempt is linked to an assignment submission, the ID of that submission. |
| linkedWorkbook | ID | The ID of a linked workbook associated with this attempt, if any. |
| poolLabelByQuestionId | JSON | A JSON map of question IDs to their question pool labels, used for pooled assessments. |
| securityToken | String | A security token associated with this attempt, used for proctored assessments. |
| createdAt | Date | Timestamp when the attempt was created. |
| updatedAt | Date | Timestamp when the attempt was last updated. |
Example
mutation UpdateAssessmentAttempt(
$activeQuestion: QuestionInput
$assessmentAttempt: AssessmentAttemptInput
) {
UpdateAssessmentAttempt(
activeQuestion: $activeQuestion
assessmentAttempt: $assessmentAttempt
) {
id
status
grade
passed
questionsCount
correctQuestionsCount
answeredQuestionsCount
unansweredQuestionsCount
timeElapsedInSeconds
forgiven
adminUpdatedGrade
assessment {
id
title
type
minPassingPercent
}
answers {
id
question
answer
correct
}
course {
id
title
slug
}
user {
id
email
name
}
}
}Example Response
{
"data": {
"UpdateAssessmentAttempt": {
"id": "attempt_xyz789",
"status": "finished",
"grade": 85,
"passed": true,
"questionsCount": 10,
"correctQuestionsCount": 8,
"answeredQuestionsCount": 10,
"unansweredQuestionsCount": 0,
"timeElapsedInSeconds": 342,
"forgiven": false,
"adminUpdatedGrade": false,
"assessment": {
"id": "assessment_001",
"title": "Module 3 Quiz",
"type": "quiz",
"minPassingPercent": 80
},
"answers": [
{
"id": "answer_001",
"question": "What is the capital of France?",
"answer": "Paris",
"correct": true
}
],
"course": {
"id": "course_abc123",
"title": "Introduction to Geography",
"slug": "intro-to-geography"
},
"user": {
"id": "user_456",
"email": "[email protected]",
"name": "Jane Doe"
}
}
},
"id": "abc-123",
"assessment": null,
"answers": null,
"course": null,
"courseId": "abc-123",
"user": null,
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"timeElapsedInSeconds": 0,
"status": "started",
"grade": 0,
"originalGrade": 0,
"passed": false,
"assignmentSubmissionId": "abc-123",
"questions": null,
"topicType": "ad",
"forgiven": false,
"topic": null,
"topicId": "abc-123",
"questionsCount": 0,
"correctQuestionsCount": 0,
"answeredQuestionsCount": 0,
"unansweredQuestionsCount": 0,
"questionsWithChoicesCount": 0,
"poolLabelByQuestionId": {},
"linkedWorkbook": "abc-123",
"adminUpdatedGrade": false,
"securityToken": "example"
}