{"service":"platform3 QTI 1EdTech API","standard":"QTI","standardVersion":"3.0","endpointResolution":"Append these endpoint paths to QTI_BASE_URL / BASE_URL. They are not platform-root /api paths.","endpoints":{"ingestContentPackage":"/tenants/{tenantId}/qti/packages","listPackages":"/tenants/{tenantId}/qti/packages","listArtifacts":"/tenants/{tenantId}/qti/artifacts","listArtifactVersions":"/tenants/{tenantId}/qti/artifact-versions","publishArtifactCollection":"/tenants/{tenantId}/qti/collections/{collectionKey}","getArtifactCollection":"/tenants/{tenantId}/qti/collections/{collectionKey}","getDeliveryJson":"/tenants/{tenantId}/qti/artifact-versions/{artifactVersionId}/delivery-json","getAuthoringJson":"/tenants/{tenantId}/qti/artifacts/{artifactId}/authoring-json","saveAuthoringJson":"/tenants/{tenantId}/qti/artifacts/{artifactId}/authoring-json","exportXml":"/tenants/{tenantId}/qti/artifact-versions/{artifactVersionId}/xml","startDeliverySession":"/tenants/{tenantId}/qti/delivery-sessions","submitAttempt":"/tenants/{tenantId}/qti/delivery-sessions/{deliverySessionId}/attempts","getCandidateRuntimeData":"/tenants/{tenantId}/qti/candidates/{candidateRef}/runtime-data","deleteCandidateRuntimeData":"/tenants/{tenantId}/qti/candidates/{candidateRef}/runtime-data","runConformance":"/qti/conformance-runs","mintDemoToken":"/dev/mint?tenantId=demo","demoToken":"/dev/mint?tenantId=demo"},"fixtures":{"qtiPackageZip":"/fixtures/qti-package.zip","qtiPackageXml":"/fixtures/qti-package.xml","qtiPackageZipTemplate":"/fixtures/qti-package.zip?runId={runId}","qtiPackageXmlTemplate":"/fixtures/qti-package.xml?runId={runId}","note":"Download qtiPackageZip and use it as @qti-package.zip with Content-Type: application/zip, or use qtiPackageXml with Content-Type: application/xml."},"auth":{"demoToken":"POST /dev/mint?tenantId=demo relative to QTI_BASE_URL resolves the canonical platform tenant_key=demo and returns its tenant-scoped demo JWT; the historical 00000000-0000-4000-8000-000000000003 UUID remains accepted for compatibility.","productionToken":"Production JWT tenantId must equal the platform.tenant UUID in the route; no reviewer or service token receives cross-tenant compatibility access.","operationScopes":{"import":"qti:import","read":"qti:read","author":"qti:author","deliver":"qti:deliver","score":"qti:score","publishCollection":"qti:collection:publish","readCollection":"qti:collection:read or qti:read","conformance":"qti:conformance"}},"links":{"architecture":"https://platform3-andymontgomery-9773s-projects.vercel.app/qti/1edtech/architecture/","dataDictionary":"https://platform3-andymontgomery-9773s-projects.vercel.app/qti/1edtech/data_dictionary/","customerWebsite":"https://platform3-andymontgomery-9773s-projects.vercel.app/qti/1edtech/customer_website"},"quickstart":{"operationOrder":["mintDemoToken","ingestContentPackage","listPackages","listArtifacts","listArtifactVersions","getArtifactCollection","getDeliveryJson","getAuthoringJson","saveAuthoringJson","exportXml","startDeliverySession","submitAttempt","getCandidateRuntimeData","deleteCandidateRuntimeData","runConformance"],"pasteRunIngestZip":["curl -fsS \"$BASE_URL/fixtures/qti-package.zip?runId=$RUN_ID\" -o /tmp/qti-package.zip","curl -fsS -X POST \"$BASE_URL/tenants/$TENANT_ID/qti/packages\" -H \"Authorization: Bearer $TOKEN\" -H \"Idempotency-Key: pkg-upload-demo-$RUN_ID\" -H \"Content-Type: application/zip\" -H \"X-QTI-Profile: qti-3.0\" --data-binary @/tmp/qti-package.zip -o /tmp/qti-ingest.json","export ARTIFACT_ID=\"$(jq -r '.artifacts[0].artifactId' /tmp/qti-ingest.json)\"","export ARTIFACT_VERSION_ID=\"$(jq -r '.artifacts[0].artifactVersionId' /tmp/qti-ingest.json)\""],"authoringSaveRule":"Fetch delivery-json for rendering, then fetch authoring-json for the lossless edit envelope and ETag. Save back to the artifactId returned by ingestContentPackage with If-Match. Do not reuse a static authoring JSON fixture against the shared public demo tenant.","pasteRunSaveBody":["curl -fsS \"$BASE_URL/tenants/$TENANT_ID/qti/artifact-versions/$ARTIFACT_VERSION_ID/delivery-json\" -H \"Authorization: Bearer $TOKEN\" -o /tmp/qti-delivery.json","curl -fsS -D /tmp/qti-authoring-read.headers \"$BASE_URL/tenants/$TENANT_ID/qti/artifacts/$ARTIFACT_ID/authoring-json\" -H \"Authorization: Bearer $TOKEN\" -o /tmp/qti-authoring-read.json","export ETAG=\"$(awk 'BEGIN{IGNORECASE=1} /^etag:/ {sub(/\\r$/, \"\", $2); print $2}' /tmp/qti-authoring-read.headers)\"","jq --arg title \"$(jq -r '.qti.attributes.title // \"QTI item\"' /tmp/qti-authoring-read.json), saved through authoring JSON\" 'def strip_source: if type == \"object\" then del(.source) | with_entries(.value |= strip_source) elif type == \"array\" then map(strip_source) else . end; {documentId, sourceBundleVersion, lossiness:\"none\", qti:(.qti | strip_source)} | .qti.attributes = ((.qti.attributes // {}) + {title:$title})' /tmp/qti-authoring-read.json > /tmp/qti-authoring-save.json","curl -fsS -X PUT \"$BASE_URL/tenants/$TENANT_ID/qti/artifacts/$ARTIFACT_ID/authoring-json\" -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" -H \"If-Match: $ETAG\" --data-binary @/tmp/qti-authoring-save.json -o /tmp/qti-save.json"],"conformanceRequestBody":{},"pasteRunConformance":["curl -fsS -X POST \"$BASE_URL/qti/conformance-runs\" -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" --data '{}' -o /tmp/qti-conformance.json","jq '.status, .summary.byStatus, .summary.bundleHash, .conformanceRunId, .runId' /tmp/qti-conformance.json"]}}