QTI Alpha customer specification

Tests, questions, answers, and results over QTI 3.0

The Alpha surface is the school-language API for QTI content and learner activity. Teachers and app-builder LLMs can import and deliver QTI packages, students can answer activities, parents can understand results, and every friendly name still traces back to the approved 1EdTech data dictionary.

Alpha flow from package to result Package assessment-package Content content Version content-version Activity activity Answers answer-submission Result activity-result Friendly Alpha objects remain traceable to shared qti.* tables, fields, QTI XML, and Alpha ITDs.
9 public Alpha objects school-language objects
84 public fields all with data dictionary anchors
11 API operations each with request and response tables
14 Alpha ITDs cut, restrict, rename, extend
13 shared qti.* tables no Alpha persistence fork
Stripe benchmark top-level auth, errors, examples, schemas
Start here

Routes by customer job

CustomerJobOperationsData objects
Teacher Import a package, find a question or test, start an activity, and inspect a result. importAssessmentPackage
listContent
startActivity
getActivityResult
Assessment package
Content
Activity result
Student app Render one immutable student view and submit answers that match the QTI declarations. getStudentView
startActivity
submitAnswers
Content version
Activity
Answer submission
Parent or family support Understand score, feedback, and grading explanation without seeing raw processing traces. getActivityResult Activity result
Problem
App-builder LLM Generate a client from this page by using endpoint schemas, examples, auth, errors, and field provenance. importAssessmentPackage
listContent
getContent
getStudentView
saveContentDraft
downloadQtiXml
startActivity
submitAnswers
getActivityResult
deleteStudentTestData
getQtiTrustStatus
Workspace
Assessment package
Content
Content version
Activity
Answer submission
Activity result
QTI trust status
Problem
Platform/support engineer Trace Alpha names back to qti.* fields, verify what was cut, and know when to roll back to upstream deliverables. getQtiTrustStatus
deleteStudentTestData
QTI trust status
Workspace
Authentication

Authentication and request controls

Every endpoint card below assumes these controls. They are centralized here so client code can implement auth once and reuse it across the Alpha surface.

ControlRequirementOperationsTrace
Bearer JWT Every Alpha operation requires HTTPS and Bearer authentication unless a later approved Alpha ITD explicitly makes an operation public. Tokens are verified before QTI or learner data is read. importAssessmentPackage
listContent
getContent
getStudentView
saveContentDraft
downloadQtiXml
startActivity
submitAnswers
getActivityResult
deleteStudentTestData
getQtiTrustStatus
Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
Workspace claim matching For /workspaces/{workspaceId}/... routes, the token workspace claim must equal workspaceId. Alpha calls the boundary a workspace; the shared source field is qti.tenant.tenant_id. importAssessmentPackage
listContent
getContent
getStudentView
saveContentDraft
downloadQtiXml
startActivity
submitAnswers
getActivityResult
deleteStudentTestData
workspace.workspaceId, Shared QTI Persistence, Alpha Facade, School Vocabulary Layer
Idempotency-Key Package import requires Idempotency-Key so upload retries return the same package outcome instead of creating duplicate package rows. importAssessmentPackage assessment-package.idempotencyKey, Restricted Assessment Package Import, Plain-Language Problems
If-Match Saving a content draft requires If-Match. Missing preconditions fail with 428; stale content-version state fails with 409. saveContentDraft content.latestVersionId, content-version.versionNumber, Lossless Authoring Commands
studentRef privacy studentRef is an opaque tenant-scoped pseudonymous UUID string. Names, emails, SIS IDs, JWT subjects, phone numbers, and parent contact details are rejected from Alpha learner-runtime inputs. startActivity
deleteStudentTestData
activity.studentRef, StudentRef Privacy Language
Trust status is read-only Public Alpha callers can read current QTI trust status but cannot trigger conformance runs. Release tooling owns conformance mutations. getQtiTrustStatus qti-trust-status.lastRunStatus, Cut Public Conformance Runner, Read-Only QTI Trust Status
curl "$BASE/workspaces/$WORKSPACE/content" \
  -H "Authorization: Bearer $TOKEN"
Errors

HTTP statuses and Problem responses

Alpha uses plain-language Problems so a teacher, student, parent, or LLM can act on failures. Problems preserve the real HTTP status, invalid parameter path, and upstream QTI trace.

CodeNameWhen Alpha returns it
200 OK listContent, getContent, getStudentView, downloadQtiXml, submitAnswers, getActivityResult, and getQtiTrustStatus return successful reads or processing output.
201 Created saveContentDraft returns a new content version; startActivity returns a new activity.
202 Accepted importAssessmentPackage accepted package validation/import work and returns the current package summary.
204 No Content deleteStudentTestData removed runtime rows for one studentRef and returns no body.
400 Bad Request Malformed package, invalid QTI XML, invalid filter, lossy editing draft, direct learner PII, wrong answer cardinality/base type, or unsupported runtime feature. Returned as a plain-language Problem.
401 Unauthorized Missing, malformed, expired, untrusted, or unsigned Bearer token.
403 Forbidden Authenticated principal lacks workspace access, attempts cross-workspace access, lacks deletion rights, or tries to run a conformance mutation through public Alpha.
404 Not Found Workspace-scoped resource is absent or belongs to another workspace: content, content version, activity, result, or studentRef runtime scope.
409 Conflict Idempotency-Key reuse conflicts with original package bytes, or If-Match/version state is stale during draft save.
428 Precondition Required saveContentDraft omitted required If-Match.
500/502/503/504 Server or gateway error Unexpected server, gateway, dependency, QTI projection, XML export, runtime, or trust-status failure. Release-blocking evidence is not hidden as a friendly success.

Problem response schema

FieldTypeRequiredDescriptionTrace
typeurlRequiredStable machine-readable problem type for this rejection class.problem.type, Plain-Language Problems
titlestringRequiredShort plain-language title a teacher, student, parent, or app-builder LLM can act on.problem.title, Plain-Language Problems
statusintegerRequiredHTTP status repeated in the body. Alpha wording must not downgrade a hard validation failure to a warning.problem.status, Plain-Language Problems
detailstringRequiredSafe explanation of what failed and what the caller can change. Must be privacy-redacted.problem.detail, StudentRef Privacy Language, Plain-Language Problems
invalidParamsarray<object>OptionalField-level validation details using Alpha names first and canonical QTI names only as advanced trace.problem.invalidParams, Plain-Language Problems
upstreamTraceobject|nullOptionalSafe link to QTI schema, architecture ITD, data dictionary field, or validation source for support.problem.upstreamTrace, Alpha Provenance Requirements
Workflows

Six workflows the implementation must satisfy

These workflows are written as customer jobs and implementation tests. Coding the next deliverable from this page should produce these behaviors first.

01

Import and find content

A teacher or app-builder uploads a package, sees whether it is ready, then finds questions or tests without opening XML.

Operations
importAssessmentPackage, listContent, getContent
Objects
Assessment package, Content, Content version
Fields
assessment-package.importStatus, content.kind, content.summary
Trace
Restricted Assessment Package Import, Content Catalog Read Model
curl -X POST "$BASE/workspaces/$WORKSPACE/assessment-packages" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Idempotency-Key: pkg-upload-001" \
  --data-binary @package.zip

curl "$BASE/workspaces/$WORKSPACE/content?kind=question" \
  -H "Authorization: Bearer $TOKEN"
02

Edit without losing QTI

An editor saves a lossless draft as a new immutable version, then downloads canonical QTI XML when interoperability is needed.

Operations
saveContentDraft, downloadQtiXml
Objects
Content, Content version
Fields
content-version.editingDraft, content-version.canonicalXml, content-version.xmlHash
Trace
Lossless Authoring Commands
curl -X PUT "$BASE/workspaces/$WORKSPACE/content/$CONTENT/draft" \
  -H "Authorization: Bearer $TOKEN" \
  -H "If-Match: version-2" \
  -d '{"editingDraft":{"lossiness":"none","kind":"item"}}'

curl "$BASE/workspaces/$WORKSPACE/content-versions/$VERSION/qti-xml" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Accept: application/xml"
03

Deliver and submit answers

A student starts an activity from one frozen content version, sees the same studentView throughout the activity, and submits declared answers.

Operations
getStudentView, startActivity, submitAnswers
Objects
Activity, Answer submission, Content version
Fields
activity.studentViewSnapshot, answer-submission.answers, answer-submission.answerSchema
Trace
Activity Delivery Language, Declaration-Checked Answers
curl -X POST "$BASE/workspaces/$WORKSPACE/activities" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"studentRef":"9c41d14e-d011-4517-927e-b9bf0b7d5df4","contentVersionId":"efcf3561-3a66-4825-9588-e792ef20c312"}'

curl -X POST "$BASE/workspaces/$WORKSPACE/activities/$ACTIVITY/answers" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"contentVersionId":"efcf3561-3a66-4825-9588-e792ef20c312","answers":{"RESPONSE":"B"}}'
05

Delete one student's runtime data

An authorized caller can remove activities and answer submissions for one pseudonymous studentRef while preserving reusable content.

Operations
deleteStudentTestData
Objects
Activity, Answer submission
Fields
activity.studentRef, activity.activityId, answer-submission.activityId
Trace
StudentRef Privacy Language, Shared QTI Persistence, Alpha Facade
curl -X DELETE "$BASE/workspaces/$WORKSPACE/students/9c41d14e-d011-4517-927e-b9bf0b7d5df4/test-data" \
  -H "Authorization: Bearer $TOKEN"
API reference

Alpha operations

These operation contracts are the implementation specification. Each endpoint includes request fields, response fields, example calls, status codes, data dictionary links, and Alpha ITD provenance.

POST

/workspaces/{workspaceId}/assessment-packages

importAssessmentPackage

Upload a QTI assessment package, validate it, and summarize the content that became available.

Request

Binary application/zip body. Required Idempotency-Key header. Optional X-QTI-Profile header defaults to qti-3.0.

Success

202 application/json with Assessment package summary. ready packages can produce content; needsFix packages return Problems.

Rejects

400 for malformed package, package path escape, invalid QTI XML, unsupported package closure, or privacy validation failure; 409 for idempotency-key conflict.

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredSigned, trusted, unexpired token. Workspace-scoped routes also require the token workspace claim to match workspaceId.Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
workspaceIdPathuuidRequiredSchool, district, publisher, or application boundary. It maps to qti.tenant.tenant_id and scopes all content, activities, submissions, and results.workspace.workspaceId, Shared QTI Persistence, Alpha Facade
Idempotency-KeyHeaderstringRequiredClient retry key. Same key plus same package bytes returns the same package outcome.assessment-package.idempotencyKey
X-QTI-ProfileHeaderstringOptional; default qti-3.0Implementation conformance profile stored with import evidence.assessment-package.qtiProfile
bodyBodybinary application/zipRequiredIMS/QTI content package or zip bundle. Alpha returns safe summaries and does not expose raw package bytes.assessment-package.packageHash, assessment-package.importEvidence, Cut Raw QTI Internals From Public Alpha

Response schema

FieldTypeRequiredDescriptionTrace
packageIduuidRequiredStable package import identifier.assessment-package.packageId
workspaceIduuidRequiredOwning workspace.assessment-package.workspaceId
importStatusenum(checking, ready, needsFix, replaced)RequiredAlpha import lifecycle value derived from qti.content_package.import_status.assessment-package.importStatus,
qtiProfilestringRequiredQTI profile applied to validation.assessment-package.qtiProfile
contentCreatedobjectRequiredSafe counts of questions, tests, passages, sections, and assets created.assessment-package.contentCreated,
importEvidenceobjectRequiredSafe validation evidence and package facts. No package bytes, secrets, or direct learner data.assessment-package.importEvidence
importedAttimestampRequiredTime the package row was inserted.assessment-package.importedAt

Example request

curl -X POST "$BASE/workspaces/$WORKSPACE/assessment-packages" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Idempotency-Key: pkg-upload-2026-05-20-001" \
  -H "X-QTI-Profile: qti-3.0" \
  -H "Content-Type: application/zip" \
  --data-binary @grade-6-math-qti.zip

Example response

{
  "packageId": "7f2e4dd2-c147-49ea-af77-41a6fdd70980",
  "workspaceId": "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3",
  "importStatus": "ready",
  "qtiProfile": "qti-3.0",
  "contentCreated": {
    "questions": 12,
    "tests": 1,
    "passages": 2
  },
  "importEvidence": {
    "resourceCount": 18,
    "fileCount": 42
  },
  "importedAt": "2026-05-20T13:00:00Z"
}
Objects
Assessment package, Content, Content version, Problem
Fields
assessment-package.packageId, assessment-package.importStatus, assessment-package.contentCreated, problem.invalidParams
HTTP statuses
202, 400, 401, 403, 409, 500/502/503/504
GET

/workspaces/{workspaceId}/content

listContent

Find questions, tests, passages, sections, and other QTI content without reading XML.

Request

Workspace path plus optional kind and packageId query parameters.

Success

200 application/json with Content objects visible to the workspace.

Rejects

400 for invalid filter values; 401/403 for missing auth or workspace mismatch.

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredSigned, trusted, unexpired token. Workspace-scoped routes also require the token workspace claim to match workspaceId.Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
workspaceIdPathuuidRequiredSchool, district, publisher, or application boundary. It maps to qti.tenant.tenant_id and scopes all content, activities, submissions, and results.workspace.workspaceId, Shared QTI Persistence, Alpha Facade
kindQueryenum(question, test, testSection, passage, scoringRule, usageData, metadata)OptionalAlpha content kind. Values are derived from qti.artifact.artifact_kind.content.kind,
packageIdQueryuuidOptionalLimit catalog entries to one imported assessment package.content.packageId

Response schema

FieldTypeRequiredDescriptionTrace
dataarray<Content>RequiredCatalog entries visible in the workspace.
data[].contentIduuidRequiredLogical content identity across versions.content.contentId
data[].kindenumRequiredSchool-facing kind such as question, test, passage, or testSection.content.kind,
data[].latestVersionIduuid|nullOptionalNewest immutable version for convenience reads.content.latestVersionId
data[].summaryobjectRequiredSafe catalog summary. No raw XML, package bytes, learner data, or processing traces.content.summary

Example request

curl "$BASE/workspaces/$WORKSPACE/content?kind=question" \
  -H "Authorization: Bearer $TOKEN"

Example response

{
  "data": [
    {
      "contentId": "9e8d7c21-5983-4c8f-a5af-124a4f91519a",
      "kind": "question",
      "title": "Linear equations checkpoint",
      "latestVersionId": "efcf3561-3a66-4825-9588-e792ef20c312",
      "summary": {
        "interactions": [
          "choice"
        ],
        "estimatedMinutes": 3
      }
    }
  ]
}
Objects
Content, Content version
Fields
content.contentId, content.kind, content.summary, content.latestVersionId
HTTP statuses
200, 400, 401, 403, 500/502/503/504
GET

/workspaces/{workspaceId}/content/{contentId}

getContent

Read one catalog entry, including the latest immutable version summary.

Request

Workspace path and contentId path parameter.

Success

200 application/json with Content and latest Content version summary.

Rejects

404 when content is absent or belongs to another workspace.

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredSigned, trusted, unexpired token. Workspace-scoped routes also require the token workspace claim to match workspaceId.Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
workspaceIdPathuuidRequiredSchool, district, publisher, or application boundary. It maps to qti.tenant.tenant_id and scopes all content, activities, submissions, and results.workspace.workspaceId, Shared QTI Persistence, Alpha Facade
contentIdPathuuidRequiredLogical content identity across versions.content.contentId

Response schema

FieldTypeRequiredDescriptionTrace
contentContentRequiredSchool-language content object.
content.contentIduuidRequiredLogical content identity.content.contentId
content.qtiIdentifierstring|nullOptionalQTI identifier copied from the source XML when present.content.qtiIdentifier
latestVersionContent version|nullRequiredLatest immutable saved edition, if one exists., content.latestVersionId
latestVersion.contentVersionIduuidRequired when latestVersion existsVersion ID used by activities and exports.content-version.contentVersionId

Example request

curl "$BASE/workspaces/$WORKSPACE/content/9e8d7c21-5983-4c8f-a5af-124a4f91519a" \
  -H "Authorization: Bearer $TOKEN"

Example response

{
  "content": {
    "contentId": "9e8d7c21-5983-4c8f-a5af-124a4f91519a",
    "kind": "question",
    "qtiIdentifier": "ITEM-LINEAR-EQ-001",
    "title": "Linear equations checkpoint",
    "latestVersionId": "efcf3561-3a66-4825-9588-e792ef20c312"
  },
  "latestVersion": {
    "contentVersionId": "efcf3561-3a66-4825-9588-e792ef20c312",
    "versionNumber": 3,
    "xmlHash": "sha256:e8a86d190e6d8865c4562b8e8b2b1e299f8a8d37a58c0bb71b35ef28bb62ab31"
  }
}
Objects
Content, Content version
Fields
content.contentId, content.qtiIdentifier, content-version.contentVersionId, content-version.xmlHash
HTTP statuses
200, 401, 403, 404, 500/502/503/504
GET

/workspaces/{workspaceId}/content-versions/{contentVersionId}/student-view

getStudentView

Fetch the delivery-safe view a student application can render.

Request

Workspace path and immutable contentVersionId path parameter.

Success

200 application/json with studentView, declared lossiness, and answer schema.

Rejects

404 when the content version is absent or belongs to another workspace; 500/release-blocking evidence when the projection cannot be produced from canonical QTI state.

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredSigned, trusted, unexpired token. Workspace-scoped routes also require the token workspace claim to match workspaceId.Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
workspaceIdPathuuidRequiredSchool, district, publisher, or application boundary. It maps to qti.tenant.tenant_id and scopes all content, activities, submissions, and results.workspace.workspaceId, Shared QTI Persistence, Alpha Facade
contentVersionIdPathuuidRequiredImmutable content version whose student view should be returned.content-version.contentVersionId

Response schema

FieldTypeRequiredDescriptionTrace
contentVersionIduuidRequiredImmutable content version ID.content-version.contentVersionId
ETagstring response headerRequiredStable validator derived from the version and XML hash.content-version.xmlHash
studentViewobjectRequiredDelivery projection. It must preserve identifiers needed for answers, feedback, scoring, accessibility matching, and session replay.content-version.studentView
lossinessconst declaredRequiredOnly declared authoring-only or diagnostic detail may be omitted.content-version.studentView,
answerSchemaobjectRequiredAnswer slots, cardinality, base type, and mapping rules generated from QTI declarations.answer-submission.answerSchema

Example request

curl "$BASE/workspaces/$WORKSPACE/content-versions/$VERSION/student-view" \
  -H "Authorization: Bearer $TOKEN"

Example response

{
  "contentVersionId": "efcf3561-3a66-4825-9588-e792ef20c312",
  "studentView": {
    "kind": "item",
    "identifier": "ITEM-LINEAR-EQ-001",
    "interactions": [
      {
        "id": "RESPONSE",
        "type": "choice"
      }
    ]
  },
  "lossiness": "declared",
  "answerSchema": {
    "RESPONSE": {
      "cardinality": "single",
      "baseType": "identifier"
    }
  }
}
Objects
Content version, Answer submission
Fields
content-version.studentView, content-version.contentVersionId, answer-submission.answerSchema
HTTP statuses
200, 401, 403, 404, 500/502/503/504
PUT

/workspaces/{workspaceId}/content/{contentId}/draft

saveContentDraft

Save a lossless editing draft as a new immutable content version.

Request

Workspace path, contentId path parameter, required If-Match header, and editingDraft body.

Success

201 application/json with new Content version summary.

Rejects

400 when editingDraft is lossy or cannot round-trip to canonical XML; 409 for stale If-Match; 428 for missing If-Match.

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredSigned, trusted, unexpired token. Workspace-scoped routes also require the token workspace claim to match workspaceId.Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
workspaceIdPathuuidRequiredSchool, district, publisher, or application boundary. It maps to qti.tenant.tenant_id and scopes all content, activities, submissions, and results.workspace.workspaceId, Shared QTI Persistence, Alpha Facade
contentIdPathuuidRequiredLogical content identity to version.content.contentId
If-MatchHeaderstringRequiredVersion validator for optimistic concurrency. Missing is 428; stale is 409.content.latestVersionId, content-version.versionNumber
editingDraftBodyobjectRequiredLossless authoring projection. Must round-trip to object graph and canonical XML without spec-defined field loss.content-version.editingDraft, Lossless Authoring Commands
changeNoteBodystringOptionalSafe editor note. It is platform metadata and must not replace QTI source trace or store learner PII.content-version.createdBy, StudentRef Privacy Language

Response schema

FieldTypeRequiredDescriptionTrace
contentVersionIduuidRequiredNew immutable version created by the save.content-version.contentVersionId
contentIduuidRequiredLogical content identity.content-version.contentId
versionNumberintegerRequiredForward-only version number for the content.content-version.versionNumber
xmlHashstringRequiredHash of canonical XML for the new version.content-version.xmlHash
createdAttimestampRequiredTime the version was persisted.content-version.createdAt

Example request

curl -X PUT "$BASE/workspaces/$WORKSPACE/content/$CONTENT/draft" \
  -H "Authorization: Bearer $TOKEN" \
  -H "If-Match: version-2" \
  -H "Content-Type: application/json" \
  -d '{"editingDraft":{"lossiness":"none","kind":"item"},"changeNote":"Fix typo"}'

Example response

{
  "contentVersionId": "efcf3561-3a66-4825-9588-e792ef20c312",
  "contentId": "9e8d7c21-5983-4c8f-a5af-124a4f91519a",
  "versionNumber": 3,
  "xmlHash": "sha256:e8a86d190e6d8865c4562b8e8b2b1e299f8a8d37a58c0bb71b35ef28bb62ab31",
  "createdAt": "2026-05-20T13:08:00Z"
}
Objects
Content, Content version, Problem
Fields
content-version.editingDraft, content-version.canonicalXml, content-version.xmlHash, problem.invalidParams
HTTP statuses
201, 400, 401, 403, 404, 409, 428, 500/502/503/504
GET

/workspaces/{workspaceId}/content-versions/{contentVersionId}/qti-xml

downloadQtiXml

Download canonical QTI XML for a content version.

Request

Workspace path, contentVersionId path parameter, and optional Accept: application/xml.

Success

200 application/xml canonical QTI XML.

Rejects

404 for missing or cross-workspace version; 500/release-blocking evidence if canonical XML cannot validate.

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredSigned, trusted, unexpired token. Workspace-scoped routes also require the token workspace claim to match workspaceId.Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
workspaceIdPathuuidRequiredSchool, district, publisher, or application boundary. It maps to qti.tenant.tenant_id and scopes all content, activities, submissions, and results.workspace.workspaceId, Shared QTI Persistence, Alpha Facade
contentVersionIdPathuuidRequiredImmutable version whose canonical XML should be exported.content-version.contentVersionId
AcceptHeaderapplication/xmlOptionalRequest XML. Successful response body is canonical QTI XML, not a JSON envelope.content-version.canonicalXml

Response schema

FieldTypeRequiredDescriptionTrace
bodystring application/xmlRequiredCanonical XML generated from the persisted object graph and validated against the bundled QTI source bundle.content-version.canonicalXml, content-version.sourceXml
Content-Typeapplication/xml response headerRequiredSignals XML export. Alpha does not turn QTI XML into a renamed JSON product model.Lossless Authoring Commands

Example request

curl "$BASE/workspaces/$WORKSPACE/content-versions/$VERSION/qti-xml" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Accept: application/xml"

Example response

<qti-assessment-item identifier="ITEM-LINEAR-EQ-001" ...>
Objects
Content version
Fields
content-version.canonicalXml, content-version.sourceXml, content-version.schemaFile
HTTP statuses
200, 401, 403, 404, 500/502/503/504
POST

/workspaces/{workspaceId}/activities

startActivity

Start a student activity from one immutable content version.

Request

Workspace path plus JSON body with studentRef and contentVersionId.

Success

201 application/json Activity with studentViewSnapshot.

Rejects

400 when studentRef contains direct PII or contentVersionId cannot produce a student view; 404 for cross-workspace version.

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredSigned, trusted, unexpired token. Workspace-scoped routes also require the token workspace claim to match workspaceId.Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
workspaceIdPathuuidRequiredSchool, district, publisher, or application boundary. It maps to qti.tenant.tenant_id and scopes all content, activities, submissions, and results.workspace.workspaceId, Shared QTI Persistence, Alpha Facade
studentRefBodystring pseudonymous UUIDRequiredOpaque tenant-scoped student reference. Direct learner or parent PII is rejected.activity.studentRef
contentVersionIdBodyuuidRequiredImmutable item, test, or section version to snapshot for this activity.activity.contentVersionId, content-version.contentVersionId
activityStateBodyobjectOptionalInitial navigation/resume state. Must not contain direct PII, raw PNP records, auth headers, or user agents.activity.activityState

Response schema

FieldTypeRequiredDescriptionTrace
activityIduuidRequiredStable activity identifier.activity.activityId
studentRefstring pseudonymous UUIDRequiredThe same safe studentRef accepted in the request.activity.studentRef
contentVersionIduuidRequiredContent version pinned by the activity.activity.contentVersionId
statusenumRequiredActivity lifecycle state after creation.activity.status,
studentViewSnapshotobjectRequiredSnapshot of studentView at start. Later content edits cannot change it.activity.studentViewSnapshot
createdAttimestampRequiredActivity creation time.activity.createdAt

Example request

curl -X POST "$BASE/workspaces/$WORKSPACE/activities" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"studentRef":"9c41d14e-d011-4517-927e-b9bf0b7d5df4","contentVersionId":"efcf3561-3a66-4825-9588-e792ef20c312"}'

Example response

{
  "activityId": "e0b41369-3019-42a5-a419-d5da6e33904f",
  "studentRef": "9c41d14e-d011-4517-927e-b9bf0b7d5df4",
  "contentVersionId": "efcf3561-3a66-4825-9588-e792ef20c312",
  "status": "inProgress",
  "studentViewSnapshot": {
    "kind": "item",
    "identifier": "ITEM-LINEAR-EQ-001"
  },
  "createdAt": "2026-05-20T13:15:00Z"
}
Objects
Activity, Content version, Problem
Fields
activity.studentRef, activity.contentVersionId, activity.studentViewSnapshot, activity.status
HTTP statuses
201, 400, 401, 403, 404, 500/502/503/504
POST

/workspaces/{workspaceId}/activities/{activityId}/answers

submitAnswers

Submit answers for an activity and run QTI processing.

Request

Workspace path, activityId path parameter, and JSON body with answers keyed by QTI response variable identifiers.

Success

200 application/json Answer submission with results and gradingExplanation.

Rejects

400 for undeclared answer slots, wrong cardinality/base type, unsupported runtime feature, unregistered custom operator, or learner PII in answers.

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredSigned, trusted, unexpired token. Workspace-scoped routes also require the token workspace claim to match workspaceId.Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
workspaceIdPathuuidRequiredSchool, district, publisher, or application boundary. It maps to qti.tenant.tenant_id and scopes all content, activities, submissions, and results.workspace.workspaceId, Shared QTI Persistence, Alpha Facade
activityIdPathuuidRequiredActivity receiving the answer submission.answer-submission.activityId, activity.activityId
contentVersionIdBodyuuidRequiredImmutable content version attempted in this activity.answer-submission.contentVersionId
answersBodyobject<string, QTI value>RequiredAnswer values keyed by QTI response variable identifier. Alpha checks cardinality and base type before processing.answer-submission.answers, answer-submission.answerSchema

Response schema

FieldTypeRequiredDescriptionTrace
submissionIduuidRequiredStable identifier for the persisted answer submission.answer-submission.submissionId
activityIduuidRequiredOwning activity.answer-submission.activityId
attemptNumberintegerRequiredAttempt count within the activity and content version.answer-submission.attemptNumber
statusenumRequiredAnswer submission lifecycle state.answer-submission.status,
resultsobjectRequiredOutcome variables after template, response, and outcome processing.answer-submission.results
gradingExplanationarray<object>RequiredPrivacy-redacted processing trace for explanation.answer-submission.gradingExplanation
submittedAttimestamp|nullOptionalSubmission timestamp when final answers are submitted.answer-submission.submittedAt

Example request

curl -X POST "$BASE/workspaces/$WORKSPACE/activities/$ACTIVITY/answers" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"contentVersionId":"efcf3561-3a66-4825-9588-e792ef20c312","answers":{"RESPONSE":"B"}}'

Example response

{
  "submissionId": "4a3996a6-c638-4813-8969-4ed9a72b29a0",
  "activityId": "e0b41369-3019-42a5-a419-d5da6e33904f",
  "attemptNumber": 1,
  "status": "submitted",
  "results": {
    "SCORE": 1
  },
  "gradingExplanation": [
    {
      "step": "match_correct",
      "outcome": "SCORE",
      "value": 1
    }
  ],
  "submittedAt": "2026-05-20T13:18:02Z"
}
Objects
Answer submission, Activity result, Problem
Fields
answer-submission.answers, answer-submission.answerSchema, answer-submission.results, answer-submission.gradingExplanation
HTTP statuses
200, 400, 401, 403, 404, 500/502/503/504
GET

/workspaces/{workspaceId}/activities/{activityId}/result

getActivityResult

Read the family-readable result and grading explanation for an activity.

Request

Workspace path and activityId path parameter.

Success

200 application/json Activity result.

Rejects

404 when no activity or result is visible to the workspace.

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredSigned, trusted, unexpired token. Workspace-scoped routes also require the token workspace claim to match workspaceId.Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
workspaceIdPathuuidRequiredSchool, district, publisher, or application boundary. It maps to qti.tenant.tenant_id and scopes all content, activities, submissions, and results.workspace.workspaceId, Shared QTI Persistence, Alpha Facade
activityIdPathuuidRequiredActivity whose current result should be returned.activity-result.activityId, activity.activityId

Response schema

FieldTypeRequiredDescriptionTrace
resultIduuidRequiredPublic result identifier, same value as the underlying answer submission ID.activity-result.resultId
activityIduuidRequiredOwning activity.activity-result.activityId
scorenumber|nullOptionalFriendly score extracted from outcome variables when a SCORE-like outcome exists.activity-result.score
feedbackobject|nullOptionalStudent- or parent-readable feedback when QTI exposes feedback state and review rules allow it.activity-result.feedback
gradingExplanationarray<object>RequiredPrivacy-redacted processing trace presented as an explanation.activity-result.gradingExplanation
submittedAttimestamp|nullOptionalWhen the result-producing answer submission was submitted.activity-result.submittedAt

Example request

curl "$BASE/workspaces/$WORKSPACE/activities/$ACTIVITY/result" \
  -H "Authorization: Bearer $TOKEN"

Example response

{
  "resultId": "4a3996a6-c638-4813-8969-4ed9a72b29a0",
  "activityId": "e0b41369-3019-42a5-a419-d5da6e33904f",
  "score": 1,
  "feedback": {
    "summary": "Correct"
  },
  "gradingExplanation": [
    {
      "step": "match_correct",
      "outcome": "SCORE",
      "value": 1
    }
  ],
  "submittedAt": "2026-05-20T13:18:02Z"
}
Objects
Activity result, Answer submission
Fields
activity-result.score, activity-result.feedback, activity-result.gradingExplanation
HTTP statuses
200, 401, 403, 404, 500/502/503/504
DELETE

/workspaces/{workspaceId}/students/{studentRef}/test-data

deleteStudentTestData

Delete activities and answer submissions for one pseudonymous studentRef.

Request

Workspace path and studentRef path parameter. Reusable QTI content remains.

Success

204 with no response body. Content, packages, versions, and QTI trust evidence remain.

Rejects

400 if studentRef is not the pseudonymous UUID format; 401/403 for tenant mismatch or insufficient role.

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredSigned, trusted, unexpired token. Workspace-scoped routes also require the token workspace claim to match workspaceId.Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
workspaceIdPathuuidRequiredSchool, district, publisher, or application boundary. It maps to qti.tenant.tenant_id and scopes all content, activities, submissions, and results.workspace.workspaceId, Shared QTI Persistence, Alpha Facade
studentRefPathstring pseudonymous UUIDRequiredOpaque tenant-scoped pseudonymous student reference whose runtime data should be deleted.activity.studentRef

Response schema

FieldTypeRequiredDescriptionTrace
bodyemptyRequired emptyNo response body. Successful deletion is represented by HTTP 204.API envelope; no persisted field.
deleted scopeside effectRequiredDeletes qti.delivery_session rows for workspaceId + studentRef and cascades qti.attempt rows; reusable QTI content remains.activity.studentRef, answer-submission.activityId

Example request

curl -X DELETE "$BASE/workspaces/$WORKSPACE/students/9c41d14e-d011-4517-927e-b9bf0b7d5df4/test-data" \
  -H "Authorization: Bearer $TOKEN"

Example response

Objects
Activity, Answer submission
Fields
activity.studentRef, activity.activityId, answer-submission.activityId
HTTP statuses
204, 400, 401, 403, 404, 500/502/503/504
GET

/qti/trust-status

getQtiTrustStatus

Read current QTI 3.0 trust status and approved upstream evidence.

Request

Bearer-authenticated read. Optional profile query defaults to qti-3.0.

Success

200 application/json QTI trust status. There is no public Alpha mutation to run conformance.

Rejects

403 for callers attempting to run conformance through Alpha; 500/release-blocking evidence when trust status cannot be derived.

Request schema

FieldInTypeRequiredDescriptionTrace
AuthorizationHeaderBearer JWTRequiredSigned, trusted, unexpired token. Workspace-scoped routes also require the token workspace claim to match workspaceId.Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
profileQuerystringOptional; default qti-3.0QTI conformance profile to summarize.qti-trust-status.profile

Response schema

FieldTypeRequiredDescriptionTrace
profilestringRequiredTargeted QTI profile.qti-trust-status.profile
bundleHashstringRequiredHash of the offline QTI source bundle used by latest evidence.qti-trust-status.bundleHash
runnerVersionstringRequiredConformance runner identity.qti-trust-status.runnerVersion
lastRunStatusenum(checking, trusted, failed, error)RequiredAlpha trust status derived from qti.conformance_run.status.qti-trust-status.lastRunStatus,
assertionSummaryobjectRequiredCounts and notable failures from assertion rows without exposing a raw row browser.qti-trust-status.assertionSummary
surfaceQcUrlurlRequiredCanonical approved 1EdTech surface QC URL used as public trust provenance.qti-trust-status.surfaceQcUrl, 1EdTech surface QC

Example request

curl "$BASE/qti/trust-status?profile=qti-3.0" \
  -H "Authorization: Bearer $TOKEN"

Example response

{
  "profile": "qti-3.0",
  "bundleHash": "sha256:184e568a31e239c0b282e7e1926dd7e8756901826f4a91e9e5b1ad58369d9ef4",
  "runnerVersion": "qti-conformance-2026-05-20",
  "lastRunStatus": "trusted",
  "assertionSummary": {
    "passed": 28292,
    "failed": 0,
    "skipped": 0,
    "error": 0
  },
  "surfaceQcUrl": "https://platform3-a3ocfthbe-andymontgomery-9773s-projects.vercel.app"
}
Objects
QTI trust status
Fields
qti-trust-status.lastRunStatus, qti-trust-status.assertionSummary, qti-trust-status.surfaceQcUrl
HTTP statuses
200, 401, 403, 500/502/503/504
Normative behavior

Behavior contracts

Alpha can be friendly only because these rules stay strict. If implementation cannot satisfy one of these contracts, the loop should roll back to the earliest flawed upstream deliverable instead of inventing behavior in code.

Alpha is a facade over shared qti.* truth

Alpha changes names and read models for schools, but it does not introduce Alpha-only persistence tables or change canonical QTI XML authority.

9 public objects map to 13 shared tables and 127 approved fields.

Shared QTI Persistence, Alpha Facade, ,

School vocabulary is a documented rename layer

Alpha says content, activity, answers, results, and studentRef, while provenance keeps the canonical qti.* source visible.

Every public field row in the field index includes source path, change class, and Alpha ITD trace.

School Vocabulary Layer, activity.studentRef, answer-submission.answers

Raw internals are cut from public Alpha

Public Alpha has no raw package byte endpoint, generic component tree browser, generic variable declaration browser, processing-rule row browser, object-graph endpoint, or conformance-run mutation.

runConformance as a public mutation; raw qti.package_file.content_bytes reads; generic qti.component row reads; generic qti.variable_declaration row reads; generic qti.processing_rule row reads; qti.artifact_version.object_graph reads; generic qti.conformance_assertion row browsing

Cut Raw QTI Internals From Public Alpha, Cut Public Conformance Runner

Data model

Public Alpha objects

The public model is deliberately smaller and friendlier than raw qti.*. It is still generated from the approved Alpha data dictionary, and every object below links back to the field-level dictionary.

Workspace

workspace

Open dictionary

The school, district, publisher, or application boundary that owns Alpha QTI content, activities, answer submissions, and result views.

Lifecycle
Created before a package is imported or an activity starts. All public Alpha operations must be scoped to the authenticated workspace.
Source tables
qti.tenant
Alpha ITDs
Shared QTI Persistence, Alpha Facade, School Vocabulary Layer, Alpha Provenance Requirements
Fields
workspaceId workspaceKey name createdAt
{
  "workspaceId": "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3",
  "workspaceKey": "north-valley",
  "name": "North Valley School District",
  "createdAt": "2026-05-20T12:30:00Z"
}

Assessment package

assessment-package

Open dictionary

A validated uploaded QTI package summarized for teachers and app-builder LLMs. It tells whether import succeeded, what content was created, and where safe validation evidence lives.

Lifecycle
Created by importAssessmentPackage. A package can be checking, ready, rejected, or replaced; only ready packages produce content that can be delivered.
Source tables
qti.content_package, qti.package_resource, qti.package_file
Alpha ITDs
Restricted Assessment Package Import, Plain-Language Problems, Alpha Provenance Requirements
Fields
packageId workspaceId sourceName idempotencyKey packageHash manifestIdentifier qtiProfile importStatus contentCreated importEvidence importedAt
{
  "packageId": "7f2e4dd2-c147-49ea-af77-41a6fdd70980",
  "workspaceId": "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3",
  "sourceName": "publisher/grade-6-math/qti.zip",
  "importStatus": "ready",
  "qtiProfile": "qti-3.0",
  "contentCreated": {
    "questions": 12,
    "tests": 1,
    "passages": 2
  },
  "importedAt": "2026-05-20T13:00:00Z"
}

Content

content

Open dictionary

A school-language catalog entry for a question, test, section, passage, or other QTI artifact that can be inspected, delivered, edited, or exported.

Lifecycle
Created by package import or authoring. It is stable across versions; each save creates a new contentVersion rather than overwriting past versions.
Source tables
qti.artifact, qti.artifact_version, qti.component, qti.content_package
Alpha ITDs
School Vocabulary Layer, Content Catalog Read Model, Lossless Authoring Commands, Alpha Provenance Requirements
Fields
contentId workspaceId packageId packageResourceId kind qtiIdentifier title language latestVersionId summary createdAt
{
  "contentId": "9e8d7c21-5983-4c8f-a5af-124a4f91519a",
  "kind": "question",
  "title": "Linear equations checkpoint",
  "language": "en-US",
  "latestVersionId": "efcf3561-3a66-4825-9588-e792ef20c312",
  "qtiIdentifier": "ITEM-LINEAR-EQ-001"
}

Content version

content-version

Open dictionary

One immutable saved edition of content. This is the ID activities and answer submissions pin so old results do not change when a teacher edits content later.

Lifecycle
Created by package import or saveContentDraft. New edits create new versions; previous versions remain available for delivery history and export.
Source tables
qti.artifact_version
Alpha ITDs
Content Catalog Read Model, Lossless Authoring Commands, Activity Delivery Language, Alpha Provenance Requirements
Fields
contentVersionId contentId versionNumber studentView editingDraft sourceXml canonicalXml xmlHash qtiRootElement schemaFile specTrace previousVersionId createdAt createdBy
{
  "contentVersionId": "efcf3561-3a66-4825-9588-e792ef20c312",
  "contentId": "9e8d7c21-5983-4c8f-a5af-124a4f91519a",
  "versionNumber": 3,
  "studentView": {
    "lossiness": "declared",
    "kind": "item"
  },
  "editingDraft": {
    "lossiness": "none",
    "kind": "item"
  }
}

Activity

activity

Open dictionary

A student's live or historical interaction with an immutable content version, including the exact studentView snapshot shown at start.

Lifecycle
Created by startActivity, progresses through activity status values, and owns answer submissions. Deleting student test data removes activities and submissions for the pseudonymous studentRef.
Source tables
qti.delivery_session, qti.artifact_version
Alpha ITDs
Activity Delivery Language, StudentRef Privacy Language, Alpha Provenance Requirements
Fields
activityId workspaceId studentRef contentVersionId status studentViewSnapshot activityState createdAt updatedAt
{
  "activityId": "e0b41369-3019-42a5-a419-d5da6e33904f",
  "workspaceId": "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3",
  "studentRef": "9c41d14e-d011-4517-927e-b9bf0b7d5df4",
  "contentVersionId": "efcf3561-3a66-4825-9588-e792ef20c312",
  "status": "inProgress"
}

Answer submission

answer-submission

Open dictionary

The student's answers for an activity, checked against generated QTI declarations before processing and stored with result state after processing.

Lifecycle
Created or updated by submitAnswers. Alpha rejects answer shapes that do not match QTI cardinality and base-type declarations instead of coercing them silently.
Source tables
qti.attempt, qti.variable_declaration, qti.processing_rule
Alpha ITDs
Declaration-Checked Answers, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
Fields
submissionId activityId contentVersionId attemptNumber status answers answerSchema templateState results gradingExplanation startedAt suspendedAt submittedAt
{
  "submissionId": "4a3996a6-c638-4813-8969-4ed9a72b29a0",
  "activityId": "e0b41369-3019-42a5-a419-d5da6e33904f",
  "attemptNumber": 1,
  "status": "submitted",
  "answers": {
    "RESPONSE": "B"
  },
  "results": {
    "SCORE": 1
  }
}

Activity result

activity-result

Open dictionary

A family-readable result and grading explanation derived from answer submissions, activity state, outcome variables, and redacted processing trace.

Lifecycle
Available after submitAnswers creates or updates an attempt. A result can be in progress, submitted, reviewed, or voided according to the underlying attempt status.
Source tables
qti.attempt, qti.delivery_session, qti.artifact_version
Alpha ITDs
Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
Fields
resultId activityId contentVersionId status score feedback gradingExplanation submittedAt
{
  "resultId": "4a3996a6-c638-4813-8969-4ed9a72b29a0",
  "activityId": "e0b41369-3019-42a5-a419-d5da6e33904f",
  "contentVersionId": "efcf3561-3a66-4825-9588-e792ef20c312",
  "score": 1,
  "status": "submitted",
  "gradingExplanation": [
    {
      "step": "match_correct",
      "outcome": "SCORE",
      "value": 1
    }
  ]
}

QTI trust status

qti-trust-status

Open dictionary

A read-only public summary of the latest 1EdTech conformance evidence and approved upstream documentation links.

Lifecycle
Updated only by 1EdTech/internal release tooling and surface QC. Public Alpha can read trust status but cannot run conformance jobs.
Source tables
qti.conformance_run, qti.conformance_assertion
Alpha ITDs
Cut Public Conformance Runner, Read-Only QTI Trust Status, Alpha Provenance Requirements
Fields
profile bundleHash runnerVersion lastRunStatus startedAt finishedAt assertionSummary surfaceQcUrl
{
  "profile": "qti-3.0",
  "lastRunStatus": "trusted",
  "bundleHash": "sha256:...",
  "runnerVersion": "qti-conformance-2026-05-20",
  "surfaceQcUrl": "https://platform3-a3ocfthbe-andymontgomery-9773s-projects.vercel.app"
}

Problem

problem

Open dictionary

Plain-language Alpha validation or authorization problem that preserves the stable HTTP status, problem type, invalid parameter path, and upstream QTI trace needed for support.

Lifecycle
Returned when an Alpha command is rejected. Problems never convert hard validation failures into warnings.
Source tables
qti.content_package, qti.variable_declaration, qti.processing_rule, qti.delivery_session, qti.attempt
Alpha ITDs
Plain-Language Problems, StudentRef Privacy Language, Alpha Provenance Requirements
Fields
type title status detail invalidParams upstreamTrace
{
  "type": "https://platform3/problems/invalid-answer-shape",
  "title": "This answer does not match the question",
  "status": 400,
  "detail": "The answer for RESPONSE must be one value, not a list.",
  "invalidParams": [
    {
      "path": "answers.RESPONSE",
      "reason": "Expected single identifier"
    }
  ]
}
Field index

Every public field with source path and invalid cases

This compact index is exhaustive for public Alpha: 84 fields across 9 objects. The approved data dictionary remains the full field-level source of truth.

Alpha fieldSource pathTypeMeaningConstraintInvalid whenChangeTrace
workspace.workspaceId qti.tenant.tenant_id uuid
Required
Stable platform identifier for one tenant boundary. Must be a valid PostgreSQL UUID and unique as the primary key. Not parseable as UUID, reused by another tenant, or copied into QTI XML as assessment content. Alpha rename
Public foundation
Shared QTI Persistence, Alpha Facade, School Vocabulary Layer, Alpha Provenance Requirements
workspace.workspaceKey qti.tenant.tenant_key text
Required
Human-stable lookup key for operations, logs, and local tooling. Unique across qti.tenant. SQL has no length or charset check; API and migrations should keep it short, stable, and non-secret. Duplicated, empty in API input, used for direct learner identity, or treated as a QTI identifier. Alpha rename
Public foundation
Shared QTI Persistence, Alpha Facade, School Vocabulary Layer, Alpha Provenance Requirements
workspace.name qti.tenant.display_name text
Required
Operational display label for the tenant. Required text. SQL has no length check; do not use as an authorization key. Null, blank in API input, or used in place of tenant_id for joins. Alpha rename
Public foundation
School Vocabulary Layer, Shared QTI Persistence, Alpha Facade, Alpha Provenance Requirements
workspace.createdAt qti.tenant.created_at timestamptz
Required
Timestamp when the tenant row was inserted. Required timestamp with time zone. Defaults to database now(). Null, manually backdated without migration evidence, or compared as local time without timezone normalization. Alpha rename
Public foundation
Shared QTI Persistence, Alpha Facade, School Vocabulary Layer, Alpha Provenance Requirements
assessment-package.packageId qti.content_package.package_id uuid
Required
Stable identifier assigned to one package ingest record. Valid UUID and unique primary key. Not a UUID or reused across package rows. Alpha restriction
Public import summary
Restricted Assessment Package Import, Plain-Language Problems, Alpha Provenance Requirements
assessment-package.workspaceId qti.content_package.tenant_id uuid
Required
Tenant that owns the package and all extracted resources. Must reference qti.tenant(tenant_id). References a missing tenant or disagrees with the tenant path in the API request. Alpha rename
Public import summary
Shared QTI Persistence, Alpha Facade, Restricted Assessment Package Import, Plain-Language Problems, Alpha Provenance Requirements
assessment-package.sourceName qti.content_package.source_uri text
Nullable
Friendly file name, URI, or content-addressable label shown for the uploaded assessment package. It is diagnostic only and not a trusted package locator. Nullable text. It is diagnostic only and must not be used as a trusted package locator after ingest. Used as a primary identity, contains secrets, or points outside tenant authorization. Alpha rename
Public import summary
Restricted Assessment Package Import, School Vocabulary Layer, Plain-Language Problems, Alpha Provenance Requirements
assessment-package.idempotencyKey qti.content_package.idempotency_key text
Nullable
Idempotency-Key from the package ingest API so retries return the same package instead of duplicating work. Unique with tenant_id. PostgreSQL allows multiple nulls; API ingest should provide a key for client retries. Same tenant reuses the key for different package bytes, or a secret/token is stored here. Alpha restriction
Advanced request safety
Restricted Assessment Package Import, Plain-Language Problems, Alpha Provenance Requirements
assessment-package.packageHash qti.content_package.package_hash text
Required
Cryptographic hash of the normalized package payload used to identify repeated imports. Required text and unique with tenant_id. Store the algorithm prefix with the digest, such as sha256:<hex>. Missing, not reproducible from the normalized package, or reused for different bytes in one tenant. Alpha restriction
Advanced provenance
Restricted Assessment Package Import, Plain-Language Problems, Alpha Provenance Requirements
assessment-package.manifestIdentifier qti.content_package.manifest_identifier text
Nullable
IMS manifest identifier copied from imsmanifest when the package has one. Nullable because loose XML ingest may not include imsmanifest. If present, preserve the source value without Alpha renaming. Invented when no manifest exists, changed to a platform name, or used as a database primary key. Alpha restriction
Advanced provenance
Restricted Assessment Package Import, Plain-Language Problems, Alpha Provenance Requirements
assessment-package.qtiProfile qti.content_package.qti_profile text
Required
Conformance profile asserted for this import. Required text. Current default and target profile is qti-3.0; optional feature sets must be explicit and supported by conformance evidence. Unsupported profile string, null, or used to imply the live network spec changed the accepted bundle. Alpha restriction
Public import summary
Restricted Assessment Package Import, Plain-Language Problems, Alpha Provenance Requirements
assessment-package.importStatus qti.content_package.import_status text
Required
Current lifecycle state of package ingest. Must satisfy content_package_import_status_ck. Outside the enum set or inconsistent with resource/artifact projection state. Alpha restriction
Public import summary
Restricted Assessment Package Import, Plain-Language Problems, Alpha Provenance Requirements
assessment-package.contentCreated qti.content_package.metadata; qti.artifact.artifact_kind object
Required
Safe counts of questions, tests, passages, sections, and assets created from the package. Derived from qti.content_package.metadata plus qti.artifact rows. Counts must not include raw package bytes, secrets, or direct learner data. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Restricted Assessment Package Import, Content Catalog Read Model
assessment-package.importEvidence qti.content_package.metadata jsonb
Required
Safe generated import evidence such as content counts, validation diagnostics, and package facts. Alpha summaries must not include package bytes or secrets. Required JSON object. Do not store package bytes or secrets here; store original bytes in qti.package_file. Null, non-object JSON, direct learner PII, access tokens, or duplicated source XML bytes. Alpha restriction
Public import summary
Restricted Assessment Package Import, Plain-Language Problems, Alpha Provenance Requirements
assessment-package.importedAt qti.content_package.imported_at timestamptz
Required
Timestamp when the package row was inserted. Required timestamp with time zone. Null or used as the source of content version ordering instead of artifact_version.version_number. Alpha restriction
Public import summary
Restricted Assessment Package Import, Plain-Language Problems, Alpha Provenance Requirements
content.contentId qti.artifact.artifact_id uuid
Required
Stable platform identity for one logical artifact across versions. Valid UUID and unique primary key. Not a UUID, reused, or derived from a mutable QTI identifier. Alpha rename
Public catalog source
School Vocabulary Layer, Content Catalog Read Model, Alpha Provenance Requirements
content.workspaceId qti.artifact.tenant_id uuid
Required
Tenant that owns this artifact. Must reference qti.tenant(tenant_id). Missing tenant or different from the owning package tenant. Alpha rename
Public catalog source
Shared QTI Persistence, Alpha Facade, Content Catalog Read Model, School Vocabulary Layer, Alpha Provenance Requirements
content.packageId qti.artifact.package_id uuid
Nullable
Origin package for imported artifacts. Nullable for authored loose artifacts. If present, must reference qti.content_package(package_id). Set null if package is deleted. References a package owned by another tenant. Alpha rename
Public catalog source
School Vocabulary Layer, Content Catalog Read Model, Alpha Provenance Requirements
content.packageResourceId qti.artifact.resource_id uuid
Nullable
Origin manifest resource for imported artifacts. Nullable for generated or loose artifacts. If present, must reference qti.package_resource(resource_id). Set null if resource is deleted. Resource comes from another package or tenant. Alpha rename
Advanced provenance
School Vocabulary Layer, Content Catalog Read Model, Alpha Provenance Requirements
content.kind qti.artifact.artifact_kind text
Required
Repository category derived from QTI root element or manifest resource type. Must satisfy artifact_kind_ck. Outside enum set, inconsistent with root_element on versions, or changed for Alpha vocabulary. Alpha rename
Public catalog source
School Vocabulary Layer, Content Catalog Read Model, Alpha Provenance Requirements
content.qtiIdentifier qti.artifact.qti_identifier text
Nullable
QTI identifier attribute copied from the root object when present. Nullable because not every artifact has a root identifier. Preserve source spelling; do not use as a globally unique database key. Invented when absent, rewritten to a UUID, or assumed unique outside artifact scope. Alpha rename
Advanced QTI identity
School Vocabulary Layer, Content Catalog Read Model, Alpha Provenance Requirements
content.title qti.artifact.title text
Nullable
QTI title or generated display label when present. Nullable. Preserve QTI title when present; generated labels must be distinguishable in metadata/spec trace. Used as identity, translated without retaining source XML, or contains direct learner PII. Alpha rename
Public catalog source
School Vocabulary Layer, Content Catalog Read Model, Alpha Provenance Requirements
content.language qti.artifact.language text
Nullable
xml:lang or package-default language associated with the artifact. Nullable BCP 47 language tag when known. Not a language tag, invented without source/default evidence, or used to filter tenant access. Alpha rename
Public catalog source
School Vocabulary Layer, Content Catalog Read Model, Alpha Provenance Requirements
content.latestVersionId qti.artifact.latest_version_id uuid
Nullable
Newest immutable artifact version for convenience reads. Nullable until a version exists. Must point to a qti.artifact_version for this same artifact when populated. Points to another artifact's version or treated as authoritative history instead of the artifact_version table. Alpha rename
Public catalog source
Content Catalog Read Model, Lossless Authoring Commands, School Vocabulary Layer, Alpha Provenance Requirements
content.summary qti.artifact.title; qti.artifact.language; qti.component.text_value; qti.content_package.metadata object
Required
Safe catalog summary extracted from selected QTI components and metadata so users can find content without reading XML. Derived only from content fields and selected component values. Must not include raw XML, package bytes, learner data, or processing traces. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Content Catalog Read Model, Cut Raw QTI Internals From Public Alpha
content.createdAt qti.artifact.created_at timestamptz
Required
Logical artifact creation timestamp. Required timestamp with time zone. Null or used as version_number. Alpha rename
Public catalog source
School Vocabulary Layer, Content Catalog Read Model, Alpha Provenance Requirements
content-version.contentVersionId qti.artifact_version.artifact_version_id uuid
Required
Stable identifier for one immutable artifact edition. Valid UUID and unique primary key. Not a UUID or reused. Alpha rename
Public version source with backstage internals
School Vocabulary Layer, Content Catalog Read Model, Lossless Authoring Commands, Activity Delivery Language, Alpha Provenance Requirements
content-version.contentId qti.artifact_version.artifact_id uuid
Required
Logical artifact this version belongs to. Must reference qti.artifact(artifact_id). Cascades on artifact delete. Missing artifact or cross-tenant mismatch through artifact. Alpha rename
Public version source with backstage internals
School Vocabulary Layer, Content Catalog Read Model, Lossless Authoring Commands, Activity Delivery Language, Alpha Provenance Requirements
content-version.versionNumber qti.artifact_version.version_number integer
Required
Forward-only per-artifact version number. Required integer and unique with artifact_id. Should increase by one for each saved edition. Zero or negative by convention, duplicated for an artifact, skipped without migration evidence, or reused after rollback. Alpha rename and restriction
Public version source with backstage internals
Content Catalog Read Model, Lossless Authoring Commands, Activity Delivery Language, Alpha Provenance Requirements
content-version.studentView qti.artifact_version.delivery_json jsonb
Nullable
Generated consumer-facing projection used by delivery applications and session snapshots. Nullable before projection. May omit only declared authoring-only or diagnostic detail; must preserve identifiers needed for responses, feedback, scoring, accessibility matching, and session replay. Drops response identifiers, scoring dependencies, feedback links, accessibility references, or includes source traces not intended for delivery. Alpha rename
Public version source with backstage internals
Activity Delivery Language, School Vocabulary Layer, Content Catalog Read Model, Lossless Authoring Commands, Alpha Provenance Requirements
content-version.editingDraft qti.artifact_version.authoring_json jsonb
Nullable
Generated authoring projection for editors that must preserve all spec-defined fields. Nullable before projection. Must round-trip to object_graph with no spec-defined field loss. Lossy, missing extension payloads, missing source trace needed for edits, or used for delivery without declared lossiness. Alpha rename and restriction
Public version source with backstage internals
Lossless Authoring Commands, School Vocabulary Layer, Content Catalog Read Model, Activity Delivery Language, Alpha Provenance Requirements
content-version.sourceXml qti.artifact_version.source_xml xml
Required
Original XML accepted after bundled XSD/Schematron validation. Required PostgreSQL xml. Must validate before object creation and persistence. Malformed XML, not valid against the bundled schema, contains direct learner runtime PII, or differs from the persisted object graph without trace. Alpha restriction
Advanced QTI portability
Lossless Authoring Commands, Alpha Provenance Requirements, Content Catalog Read Model, Activity Delivery Language
content-version.canonicalXml qti.artifact_version.canonical_xml text
Required
Canonicalized XML used for equivalence checks and stable export. Required text. Must round-trip from object graph to XML and hash to xml_hash. Not reproducible from object_graph, hash mismatch, or changed after delivery sessions point to this version. Alpha restriction
Advanced QTI portability
Lossless Authoring Commands, Alpha Provenance Requirements, Content Catalog Read Model, Activity Delivery Language
content-version.xmlHash qti.artifact_version.xml_hash text
Required
Hash of canonical_xml used for idempotency and semantic preservation checks. Required text and unique with artifact_id. Store algorithm prefix with digest. Does not match canonical_xml, algorithm omitted, or duplicates a prior version for the same artifact. Alpha rename and restriction
Advanced provenance
Content Catalog Read Model, Lossless Authoring Commands, Activity Delivery Language, Alpha Provenance Requirements
content-version.qtiRootElement qti.artifact_version.root_element text
Required
Root XML element for this version. Required text generated from bundled XSD root element catalog. Not present in the bundled root catalog or inconsistent with source_xml. Alpha rename and restriction
Advanced provenance
Content Catalog Read Model, Lossless Authoring Commands, Activity Delivery Language, Alpha Provenance Requirements
content-version.schemaFile qti.artifact_version.schema_file text
Required
Bundled schema file used as validation authority. Required text. Must name a schema in the offline QTI source bundle. Live network schema URL, missing local schema, or schema that does not define the root. Alpha rename and restriction
Advanced provenance
Content Catalog Read Model, Lossless Authoring Commands, Activity Delivery Language, Alpha Provenance Requirements
content-version.specTrace qti.artifact_version.spec_trace jsonb
Required
Generated traceability from classes, fields, and components to XSD/spec anchors. Required JSON object. Must point back to the offline source bundle and generated model evidence. Null, non-object JSON, live-only references, or links that cannot be reproduced from the bundle. Alpha rename and restriction
Advanced provenance
Content Catalog Read Model, Lossless Authoring Commands, Activity Delivery Language, Alpha Provenance Requirements
content-version.previousVersionId qti.artifact_version.supersedes_version_id uuid
Nullable
Previous version replaced by this version, when the save was an edit or replacement. Nullable. If present, must reference qti.artifact_version(artifact_version_id), normally for the same artifact. Points forward in time, points to another artifact without explicit migration evidence, or creates a cycle. Alpha rename
Public version source with backstage internals
Lossless Authoring Commands, Content Catalog Read Model, Activity Delivery Language, Alpha Provenance Requirements
content-version.createdAt qti.artifact_version.created_at timestamptz
Required
Timestamp when this immutable version was created. Required timestamp with time zone. Null or mutated to reorder version history. Alpha rename and restriction
Public version source with backstage internals
Content Catalog Read Model, Lossless Authoring Commands, Activity Delivery Language, Alpha Provenance Requirements
content-version.createdBy qti.artifact_version.created_by text
Nullable
Principal or system actor that created the version. Nullable text. Must be a safe principal label; do not store raw JWTs or secrets. Raw access token, raw JWT subject that identifies a learner, email address, or other direct learner PII. Alpha rename and restriction
Public version source with backstage internals
Content Catalog Read Model, Lossless Authoring Commands, Activity Delivery Language, Alpha Provenance Requirements
activity.activityId qti.delivery_session.delivery_session_id uuid
Required
Stable session identifier exposed by delivery APIs. Valid UUID and unique primary key. Not a UUID, reused, or guessable outside API authorization. Alpha rename
Public runtime object
Activity Delivery Language, StudentRef Privacy Language, Alpha Provenance Requirements
activity.workspaceId qti.delivery_session.tenant_id uuid
Required
Tenant boundary for the delivery session. Must reference qti.tenant(tenant_id). Does not match authenticated tenant claim or root artifact tenant. Alpha rename
Public runtime object
Shared QTI Persistence, Alpha Facade, Activity Delivery Language, StudentRef Privacy Language, Alpha Provenance Requirements
activity.studentRef qti.delivery_session.candidate_ref text
Required
The Alpha student reference for this activity. It must be an opaque tenant-scoped pseudonymous UUID string, not a student's name, email, SIS ID, JWT subject, phone number, or parent contact detail. Required text. Reject direct PII, auth tokens, raw JWT subjects, SIS IDs, contact details, and values that are not scoped to the tenant. Contains direct learner or parent PII, can be joined outside the tenant without an identity service, or is reused as a QTI content identifier. Alpha rename and restriction
Public runtime object
StudentRef Privacy Language, Activity Delivery Language, Alpha Provenance Requirements
activity.contentVersionId qti.delivery_session.root_artifact_version_id uuid
Required
Immutable item, test, or section version delivered in this session. Must reference qti.artifact_version(artifact_version_id). Missing version, version not owned by tenant, or changed after session start. Alpha rename
Public runtime object
Activity Delivery Language, Content Catalog Read Model, StudentRef Privacy Language, Alpha Provenance Requirements
activity.status qti.delivery_session.status text
Required
Session lifecycle state. Must satisfy delivery_session_status_ck. Outside enum set or inconsistent with attempts, submitted_at, or review workflow. Alpha rename
Public runtime object
Activity Delivery Language, StudentRef Privacy Language, Alpha Provenance Requirements
activity.studentViewSnapshot qti.delivery_session.delivery_json_snapshot jsonb
Required
Snapshot of delivery_json at session start. Required JSON object. Must remain stable for the session even if the artifact later receives a new version. Null, mismatched to root_artifact_version_id at start, mutated after attempts, or contains authoring-only trace without declared lossiness. Alpha rename
Public runtime object
Activity Delivery Language, StudentRef Privacy Language, Alpha Provenance Requirements
activity.activityState qti.delivery_session.session_state jsonb
Required
Runtime state not modeled as QTI variables, such as navigation, item sequencing, resume information, or review flags. Required JSON object. Treat as learner-runtime data. Do not store direct PII, raw PNP records, tokens, IP addresses, or user agents. Null, non-object JSON, auth headers, raw PNP records, direct learner identity, or state that contradicts delivery_json_snapshot. Alpha rename and restriction
Public runtime object
Activity Delivery Language, StudentRef Privacy Language, Alpha Provenance Requirements
activity.createdAt qti.delivery_session.created_at timestamptz
Required
Session creation timestamp. Required timestamp with time zone. Null or later than updated_at. Alpha rename
Public runtime object
Activity Delivery Language, StudentRef Privacy Language, Alpha Provenance Requirements
activity.updatedAt qti.delivery_session.updated_at timestamptz
Required
Last session state mutation timestamp. Required timestamp with time zone. Must be updated when status or session_state changes. Null, earlier than created_at, or stale after status/session_state update. Alpha rename
Public runtime object
Activity Delivery Language, StudentRef Privacy Language, Alpha Provenance Requirements
answer-submission.submissionId qti.attempt.attempt_id uuid
Required
Stable identifier for one attempt record. Valid UUID and unique primary key. Not a UUID or reused. Alpha rename
Public runtime object
Declaration-Checked Answers, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
answer-submission.activityId qti.attempt.delivery_session_id uuid
Required
Owning delivery session. Must reference qti.delivery_session(delivery_session_id). Cascades on session delete. Missing session or tenant mismatch through session. Alpha rename
Public runtime object
Activity Delivery Language, Declaration-Checked Answers, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
answer-submission.contentVersionId qti.attempt.artifact_version_id uuid
Required
Immutable item/test artifact version attempted. Must reference qti.artifact_version(artifact_version_id). Does not belong to the delivery session snapshot or changes after processing. Alpha rename
Public runtime object
Declaration-Checked Answers, Content Catalog Read Model, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
answer-submission.attemptNumber qti.attempt.attempt_number integer
Required
Attempt count within a session and artifact version. Required integer and unique with delivery_session_id plus artifact_version_id. Should increase for repeated attempts. Zero or negative by convention, duplicated, or reused after an adaptive attempt changes state. Alpha rename and extension
Public runtime object
Declaration-Checked Answers, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
answer-submission.status qti.attempt.status text
Required
Attempt lifecycle state. Must satisfy attempt_status_ck. Outside enum set or inconsistent with suspended_at/submitted_at. Alpha rename and extension
Public runtime object
Declaration-Checked Answers, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
answer-submission.answers qti.attempt.response_state jsonb
Required
Candidate response variables at the last processing point. Required JSON object. Keys should be QTI response variable identifiers; values must match declaration cardinality/base_type. Treat as learner data. Null, values inconsistent with qti.variable_declaration, unnecessary learner PII copied from outside the response, or logged without redaction. Alpha rename and restriction
Public runtime object
Declaration-Checked Answers, StudentRef Privacy Language, Results And Grading Explanations, Alpha Provenance Requirements
answer-submission.answerSchema qti.variable_declaration.variable_kind; qti.variable_declaration.identifier; qti.variable_declaration.cardinality; qti.variable_declaration.base_type object
Required
Generated schema of answer slots, cardinality, base type, correct-response availability, and mapping rules used to validate answers before processing. Derived from qti.variable_declaration rows where variable_kind is response. Alpha must reject undeclared answer slots and wrong cardinality/base-type values. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Declaration-Checked Answers
answer-submission.templateState qti.attempt.template_state jsonb
Required
Template variables used for item cloning and stability. Required JSON object. Keys should be QTI template variable identifiers; values must match declarations. Null, regenerated on read instead of persisted, inconsistent with template processing trace, or logged with learner identity. Alpha restriction
Advanced provenance
Declaration-Checked Answers, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
answer-submission.results qti.attempt.outcome_state jsonb
Required
Outcome variables after template, response, and outcome processing. Required JSON object. Keys should be QTI outcome variable identifiers; values must match declarations and processing results. Null, cannot be reproduced by processing rules under the runtime profile, or includes unsupported outcomes without diagnostics. Alpha rename and extension
Public runtime object
Results And Grading Explanations, Declaration-Checked Answers, StudentRef Privacy Language, Alpha Provenance Requirements
answer-submission.gradingExplanation qti.attempt.processing_trace jsonb
Required
Privacy-redacted processing trace used to explain grading. Public Alpha exposes a safe explanation view, not raw tokens, headers, IP addresses, PNP records, or direct identity fields. Required JSON array. May include rule names, variable identifiers, before/after values, and diagnostics. Must exclude JWTs, headers, access tokens, IP addresses, user agents, raw PNP records, raw package bytes, and direct learner identity fields. Null, non-array JSON, nondeterministic, lacks failed-closed diagnostics for unsupported operators, or contains auth/PII data. Alpha rename and extension
Public runtime object
Results And Grading Explanations, StudentRef Privacy Language, Declaration-Checked Answers, Alpha Provenance Requirements
answer-submission.startedAt qti.attempt.started_at timestamptz
Required
Attempt start timestamp. Required timestamp with time zone. Null or after submitted_at. Alpha rename and extension
Public runtime object
Declaration-Checked Answers, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
answer-submission.suspendedAt qti.attempt.suspended_at timestamptz
Nullable
Attempt suspension timestamp, if the attempt was suspended. Nullable timestamp with time zone. Should be set when status is suspended. Set while status never suspended without lifecycle evidence, before started_at, or after submitted_at. Alpha rename and extension
Public runtime object
Declaration-Checked Answers, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
answer-submission.submittedAt qti.attempt.submitted_at timestamptz
Nullable
Attempt submission timestamp, if the attempt was submitted. Nullable timestamp with time zone. Should be set when status is submitted or reviewed. Before started_at, set while status remains active without evidence, or absent for submitted/reviewed attempts. Alpha rename and extension
Public runtime object
Declaration-Checked Answers, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
activity-result.resultId qti.attempt.attempt_id uuid
Required
Stable public identifier for the result view. It is the same value as the underlying answer submission ID. Must be a valid qti.attempt.attempt_id for the same activity and workspace. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Results And Grading Explanations
activity-result.activityId qti.attempt.delivery_session_id uuid
Required
Owning delivery session. Must reference qti.delivery_session(delivery_session_id). Cascades on session delete. Missing session or tenant mismatch through session. Alpha rename
Public runtime object
Activity Delivery Language, Declaration-Checked Answers, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
activity-result.contentVersionId qti.attempt.artifact_version_id uuid
Required
Immutable item/test artifact version attempted. Must reference qti.artifact_version(artifact_version_id). Does not belong to the delivery session snapshot or changes after processing. Alpha rename
Public runtime object
Declaration-Checked Answers, Content Catalog Read Model, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
activity-result.status qti.attempt.status text
Required
Attempt lifecycle state. Must satisfy attempt_status_ck. Outside enum set or inconsistent with suspended_at/submitted_at. Alpha rename and extension
Public runtime object
Declaration-Checked Answers, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
activity-result.score qti.attempt.outcome_state; qti.variable_declaration.identifier number | null
Nullable
Friendly score extracted from outcome variables when a SCORE-like outcome exists. Null means the QTI content did not produce a score the platform can safely summarize. Derived from qti.attempt.outcome_state and QTI outcome declarations. Must not invent a score if no outcome variable supports it. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Results And Grading Explanations
activity-result.feedback qti.attempt.outcome_state; qti.artifact_version.delivery_json object | null
Nullable
Student- or parent-readable feedback derived from outcome variables and delivery content when QTI exposes feedback state. Must preserve QTI visibility and privacy rules. Do not reveal correct answers or hidden feedback before the activity permits review. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Results And Grading Explanations, Activity Delivery Language
activity-result.gradingExplanation qti.attempt.processing_trace jsonb
Required
Privacy-redacted processing trace used to explain grading. Public Alpha exposes a safe explanation view, not raw tokens, headers, IP addresses, PNP records, or direct identity fields. Required JSON array. May include rule names, variable identifiers, before/after values, and diagnostics. Must exclude JWTs, headers, access tokens, IP addresses, user agents, raw PNP records, raw package bytes, and direct learner identity fields. Null, non-array JSON, nondeterministic, lacks failed-closed diagnostics for unsupported operators, or contains auth/PII data. Alpha rename and extension
Public runtime object
Results And Grading Explanations, StudentRef Privacy Language, Declaration-Checked Answers, Alpha Provenance Requirements
activity-result.submittedAt qti.attempt.submitted_at timestamptz
Nullable
Attempt submission timestamp, if the attempt was submitted. Nullable timestamp with time zone. Should be set when status is submitted or reviewed. Before started_at, set while status remains active without evidence, or absent for submitted/reviewed attempts. Alpha rename and extension
Public runtime object
Declaration-Checked Answers, Results And Grading Explanations, StudentRef Privacy Language, Alpha Provenance Requirements
qti-trust-status.profile qti.conformance_run.profile text
Required
Targeted QTI 3.0 conformance profile or optional feature set. Required text. Must be a profile the runner understands. Unsupported profile, Alpha-only label, or profile not represented by assertions. Alpha extension
Read-only trust source
Cut Public Conformance Runner, Read-Only QTI Trust Status, Alpha Provenance Requirements
qti-trust-status.bundleHash qti.conformance_run.bundle_hash text
Required
Hash of the offline spec bundle used by the run. Required text with algorithm prefix and digest. Missing, live network URL, or not reproducible from the bundle used. Alpha extension
Read-only trust source
Cut Public Conformance Runner, Read-Only QTI Trust Status, Alpha Provenance Requirements
qti-trust-status.runnerVersion qti.conformance_run.runner_version text
Required
Version or identity of the conformance runner. Required text. Must be specific enough to reproduce behavior. Blank, vague, or points to unpinned code. Alpha extension
Read-only trust source
Cut Public Conformance Runner, Read-Only QTI Trust Status, Alpha Provenance Requirements
qti-trust-status.lastRunStatus qti.conformance_run.status text
Required
Run lifecycle status. Must satisfy conformance_run_status_ck. Outside enum set or inconsistent with child assertion statuses. Alpha extension
Read-only trust source
Cut Public Conformance Runner, Read-Only QTI Trust Status, Alpha Provenance Requirements
qti-trust-status.startedAt qti.conformance_run.started_at timestamptz
Required
Run start timestamp. Required timestamp with time zone. Null or after finished_at. Alpha extension
Read-only trust source
Cut Public Conformance Runner, Read-Only QTI Trust Status, Alpha Provenance Requirements
qti-trust-status.finishedAt qti.conformance_run.finished_at timestamptz
Nullable
Run finish timestamp, if complete. Nullable timestamp with time zone. Should be set for passed, failed, or error. Before started_at, absent for completed terminal status without explanation, or set while still running. Alpha extension
Read-only trust source
Cut Public Conformance Runner, Read-Only QTI Trust Status, Alpha Provenance Requirements
qti-trust-status.assertionSummary qti.conformance_assertion.status; qti.conformance_assertion.details object
Required
Counts and notable failures derived from qti.conformance_assertion rows without exposing raw assertion diagnostics as a public Alpha row browser. Failed, skipped, and error counts must remain visible. Alpha must not turn failed evidence into green status copy. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Read-Only QTI Trust Status, Cut Public Conformance Runner
qti-trust-status.surfaceQcUrl 1edtech/surface_qc.canonical_url url
Required
Canonical approved 1EdTech surface QC URL used as public trust provenance. Must be the driver-approved deployment URL, not the shared project alias. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Read-Only QTI Trust Status, Alpha Provenance Requirements
problem.type Alpha API boundary; qti validation/runtime source url
Required
Stable machine-readable problem type for this rejection class. Must be stable across wording edits and must not contain tenant secrets or learner data. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Plain-Language Problems
problem.title Alpha API boundary text
Required
Short human-readable summary a teacher, student, parent, or app-builder LLM can act on. Must not expose package bytes, tokens, headers, IP addresses, raw PNP records, or direct learner identity fields. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Plain-Language Problems, StudentRef Privacy Language
problem.status Alpha API boundary integer
Required
HTTP status code for the rejected Alpha operation. Must preserve the real rejection status; Alpha wording must not downgrade a failed validation to a warning. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Plain-Language Problems
problem.detail qti.content_package.metadata; qti.variable_declaration; qti.processing_rule; qti.attempt.processing_trace text
Required
Safe explanation of what failed and what the caller can change. Must be privacy-redacted and safe for customer display. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Plain-Language Problems, StudentRef Privacy Language
problem.invalidParams Alpha request schema; qti.variable_declaration array<object>
Nullable
Input paths and reasons for field-level validation failures. Paths use Alpha names first and may include canonical QTI names in advanced metadata. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Plain-Language Problems, Declaration-Checked Answers
problem.upstreamTrace qti.artifact_version.spec_trace; qti.variable_declaration.source_trace; qti.processing_rule.source_trace object | null
Nullable
Safe link to QTI schema, architecture ITD, data dictionary field, or validation source for support. May include QTI identifiers, variable names, schema file names, and docs links; must not include secrets or raw learner identity. The value cannot be traced to the listed upstream fields or Alpha ITD, includes direct learner PII, or contradicts the shared qti.* source. Alpha extension
Public derived field
Plain-Language Problems, Alpha Provenance Requirements
Allowed values

Allowed values translated for Alpha

Where Alpha renames a stored value, this table shows both the stored qti.* value and the Alpha value that customers see.

Assessment package import status

assessmentPackage.importStatus maps to qti.content_package.import_status

Platform gap fill

Package lifecycle values are defined by the platform ingest workflow. QTI defines package content, not import job state. Restricted Assessment Package Import, Plain-Language Problems

Stored valueAlpha valueBehavior
importingcheckingThe package row has been created and validation or resource extraction is still in progress. Do not deliver artifacts from this package yet.
importedreadyValidation, resource extraction, artifact creation, and version projection succeeded. The package can be queried, delivered, and exported.
rejectedneedsFixValidation, package-closure checks, XSD/Schematron validation, or privacy validation failed. Keep diagnostics in metadata; do not create deliverable sessions from this package.
supersededreplacedA later package or version replaces this import for operational use while preserving this row for audit and reproducibility.

IMS/QTI package resource type

qti.package_resource.resource_type maps to qti.package_resource.resource_type

1EdTech pass-through

Resource type strings are copied from IMS/QTI content-package manifests and the bundled QTI ASI XML Binding package vocabulary. Alpha Provenance Requirements

Stored valueAlpha valueBehavior
imsqti_test_xmlv3p0imsqti_test_xmlv3p0A QTI assessment test XML resource. The primary href should point to a test XML document.
imsqti_section_xmlv3p0imsqti_section_xmlv3p0A QTI assessment section XML resource. Use for sections managed independently from a test.
imsqti_item_xmlv3p0imsqti_item_xmlv3p0A QTI assessment item XML resource. Use for a candidate-facing item with interactions and response processing.
imsqti_resprocessing_xmlv3p0imsqti_resprocessing_xmlv3p0A QTI response-processing XML resource when response processing is represented as a separate package resource.
imsqti_outcomes_xmlv3p0imsqti_outcomes_xmlv3p0A QTI outcome-declaration XML resource, often used when outcomes are managed independently.
imsqti_stimulus_xmlv3p0imsqti_stimulus_xmlv3p0A QTI assessment stimulus XML resource that items can depend on for shared passage or stimulus content.
imsqti_fragment_xmlv3p0imsqti_fragment_xmlv3p0A managed QTI fragment resource used by item, section, or test content.
imsqti_rptemplate_xmlv3p0imsqti_rptemplate_xmlv3p0A response-processing template XML resource, including standard or custom templates packaged with items.
associatedcontent/learning-application-resourceassociatedcontent/learning-application-resourceA learning-application asset referenced by QTI content.
webcontentwebcontentGeneric web content asset, such as image, video, audio, HTML, or other supporting media.
imsbasiclti_xmlv1p3imsbasiclti_xmlv1p3An LTI tool resource referenced by packaged content.
controlfilecontrolfileA manifest control file or package control artifact.
resourcemetadata/xmlresourcemetadata/xmlMetadata XML associated with a package resource.
resourceextmetadata/xmlresourceextmetadata/xmlExternal metadata XML associated with a package resource.
qtiusagedata/xmlqtiusagedata/xmlA QTI usage-data XML resource carrying item or distractor statistics.
plsplsPronunciation lexicon resource used by speech or accessibility presentation.
css2css2CSS 2 stylesheet resource.
css3css3CSS 3 stylesheet resource.
extensionextensionAn extension resource. Preserve and export it, but do not treat it as a known QTI root without validation evidence.

Alpha content kind

content.kind maps to qti.artifact.artifact_kind

Platform gap fill

Repository categories are derived from QTI root elements and package resources so APIs can route artifacts without renaming QTI concepts. School Vocabulary Layer, Content Catalog Read Model

Stored valueAlpha valueBehavior
itemquestionLogical artifact whose root is a QTI assessment item.
testtestLogical artifact whose root is a QTI assessment test.
sectiontestSectionLogical artifact whose root is a QTI assessment section.
stimuluspassageLogical artifact whose root is a QTI assessment stimulus.
outcome-declarationoutcomeDefinitionLogical artifact whose root is a standalone QTI outcome declaration.
response-processingscoringRuleLogical artifact whose root is standalone QTI response processing or a response-processing template.
resultresultReportLogical artifact whose root is a QTI assessment result report.
usage-datausageDataLogical artifact whose root is QTI usage data.
metadatametadataLogical artifact for QTI or resource metadata XML.
manifest-resourcepackageResourceManifest-only resource that must remain addressable even when it is not a QTI root document.

Generated answer or result declaration kind

answerSchema.kind maps to qti.variable_declaration.variable_kind

1EdTech pass-through

Values mirror QTI variable declaration categories: response, outcome, template, and context. Declaration-Checked Answers, Results And Grading Explanations

Stored valueAlpha valueBehavior
responseanswerCandidate response variable declared by QTI and usually bound to an interaction.
outcomeresultScoring, feedback, or reporting variable set by default values or processing rules.
templatetemplateTemplate variable used to instantiate or clone a parameterized item.
contextcontextContextual variable available to template or response processing, including candidate, test, or system context when declared.

Backstage grading rule scope

gradingExplanation.source.ruleScope maps to qti.processing_rule.rule_scope

Platform gap fill

The row scope is a repository classification for query and execution order; QTI defines the processing elements and expressions themselves. Cut Raw QTI Internals From Public Alpha, Results And Grading Explanations

Stored valueAlpha valueBehavior
responseanswerScoringRule belongs to response processing and computes outcome variables from candidate responses.
outcomeresultAggregationRule belongs to outcome processing at test or section level.
templatetemplateSetupRule belongs to template processing and initializes template state before delivery.
expressionexpressionRow represents an expression subtree or operator nested inside response, outcome, or template processing.

Activity status

activity.status maps to qti.delivery_session.status

Platform gap fill

Delivery lifecycle states are platform persistence behavior. QTI defines item/test content and processing, not this session state machine. Activity Delivery Language

Stored valueAlpha valueBehavior
createdcreatedSession exists and has a delivery JSON snapshot but has not yet become the active learner experience.
activeinProgressCandidate may interact with delivered content and create or update attempts.
suspendedpausedCandidate work is paused and may be resumed with the same snapshot and session state.
submittedsubmittedCandidate has submitted the session; scoring and attempt records are complete enough for review.
reviewreviewSession is in review mode. Content and responses may be displayed, but interactions must not change response variables.
closedclosedSession is final for normal operations. Future edits to content do not affect it.
voidedvoidedSession is retained as an operational record but should not count toward reporting or outcomes.

Answer submission status

answerSubmission.status maps to qti.attempt.status

Platform gap fill

Attempt lifecycle states are platform persistence behavior around QTI response processing. Declaration-Checked Answers, Results And Grading Explanations

Stored valueAlpha valueBehavior
activeinProgressCandidate can still modify responses for this attempt.
suspendedpausedCandidate response state is saved for later continuation.
submittedsubmittedCandidate submitted responses and processing has produced outcome state.
reviewedreviewedAttempt has been reviewed by an authorized person or workflow.
voidedvoidedAttempt is retained for audit but excluded from reporting and outcomes.

QTI trust status

qtiTrustStatus.lastRunStatus maps to qti.conformance_run.status

Platform gap fill

Release-evidence lifecycle values are platform gap fills. Read-Only QTI Trust Status

Stored valueAlpha valueBehavior
runningcheckingThe conformance runner has started and assertions are not yet complete.
passedtrustedAll required assertions for the targeted profile passed.
failedfailedAt least one required assertion failed.
errorerrorThe runner could not complete because of tool, environment, or infrastructure failure.

QTI trust assertion status

qtiTrustStatus.assertions.status maps to qti.conformance_assertion.status

Platform gap fill

Per-assertion lifecycle values are generated evidence about implementation behavior, not QTI content. Cut Public Conformance Runner, Read-Only QTI Trust Status

Stored valueAlpha valueBehavior
passedpassedThis assertion met the expected result.
failedfailedThis assertion ran and found behavior that violates the target profile or platform contract.
skippedskippedThis assertion was intentionally not run, usually because it is out of profile or unavailable in the current runner.
errorerrorThis assertion could not produce a valid pass/fail result because the runner or fixture failed.

Projection lossiness

studentView.lossiness / editingDraft.lossiness maps to API projection metadata

Platform gap fill

The platform names JSON projection lossiness because QTI defines XML, not public JSON projection envelopes. Lossless Authoring Commands, Activity Delivery Language

Stored valueAlpha valueBehavior
nonenoneThe projection must preserve all spec-defined fields needed to reconstruct the generated object graph and canonical XML.
declareddeclaredThe projection may omit only explicitly documented authoring-only or diagnostic detail, such as source trace or mixed-content tail detail.
Public cuts

What public Alpha deliberately does not expose

These cuts keep the customer surface focused on teaching, learning, and app-building while preserving 1EdTech truth in the internal and 1EdTech surfaces.

Cut from public AlphaArchitecture
runConformance as a public mutationCut Public Conformance Runner
raw qti.package_file.content_bytes readsCut Raw QTI Internals From Public Alpha
generic qti.component row readsCut Raw QTI Internals From Public Alpha
generic qti.variable_declaration row readsCut Raw QTI Internals From Public Alpha
generic qti.processing_rule row readsCut Raw QTI Internals From Public Alpha
qti.artifact_version.object_graph readsCut Raw QTI Internals From Public Alpha
generic qti.conformance_assertion row browsingCut Public Conformance Runner
Implementation input

What the next deliverable must implement

Client generator

A coding agent should be able to create a client for every endpoint from the inline request and response schema tables without opening OpenAPI.

Shared persistence

Implementation must read and write the approved qti.* tables through the same semantics as the 1EdTech surface, not create Alpha-only tables.

Field provenance

Every request, response, and stored value that appears in implementation must trace to an Alpha data dictionary field or explicit API envelope row here.

Privacy

studentRef validation, Problem sanitization, runtime state, and grading explanations must reject or redact direct learner and parent PII.

QTI fidelity

Editing draft saves must stay lossless; student views may be declared-lossy only within the approved projection boundary; XML export remains canonical QTI XML.

Rollback discipline

If implementation finds a missing behavior, stop and recommend rollback to Alpha customer website, data dictionary, or architecture rather than inventing behavior.

Source trail

Inputs used to generate this website

This site is generated from the approved Alpha architecture and Alpha data dictionary. external/qti was used as reference material only, mainly for plain-language QTI flow, OpenAPI boundary precedent, runtime semantics, conversion contracts, and conformance evidence.

Benchmark compared

  • Stripe API reference for resource-oriented docs, top-level Authentication and Errors, endpoint schemas, and examples.
  • loop/context/benchmarks/index.json records Stripe as the benchmark for customer_website deliverables.
  • The local workspace has no loop/context/benchmarks/customer_website.html snapshot, so the live Stripe URL was fetched before building.
external/qti files read
  • external/qti/docs/plain-english-guide.md
  • external/qti/contracts/qti-boundary.openapi.yaml
  • external/qti/docs/1edtech-qti-package.md
  • external/qti/docs/qti-3-relational-json-architecture.md
  • external/qti/docs/conversion-contract.md
  • external/qti/docs/runtime-semantics.md
  • external/qti/docs/conformance-and-documentation.md
  • external/qti/site/index.html
  • external/qti/site/spec-traceability.json
  • external/qti/docs/adr/0003-json-projections.md
  • external/qti/docs/adr/0004-session-snapshotting.md
  • external/qti/docs/adr/0005-data-dictionary-provenance.md
  • external/qti/docs/adr/0008-artifact-versioning-idempotency.md
  • external/qti/docs/adr/0009-attempt-processing-trace.md
  • external/qti/docs/adr/0011-api-boundary-auth-hosting.md