Quickstart
Call the demo tenant in four lines.
CITD-012
Base URL
https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api
The implementation deliverable owns this live canonical URL; demo clients mint a tenantId=demo token on this same API.
Demo token mint
POST /dev/mint?tenantId=demo
Public and demo-only. It mints a bearer token scoped to tenantId demo on the same backend as real tenants.
Real tenants
CASE_REVIEWER_JWT
Operators mint real-tenant JWTs out of band. The public API never mints non-demo credentials.
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFDocuments?limit=10&offset=0" \
-H "Authorization: Bearer $TOKEN"
Cold-client rule.
Every example defines BASE_URL before it uses it. BASE_URL is the CASE implementation canonical API; demo clients mint their own token and reviewer or production clients pass an operator-minted JWT.
Mint an owning document for fresh authoring
For fresh-authored content, create the CFDocument first. Its returned identifier is the owning document id reused by every child write. If another surface or recipe asks for document_id, use this exact CASE CFDocument.identifier value.
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
DOCUMENT_RESPONSE="$(curl -s -X POST "$BASE_URL/ims/case/v1p1/CFDocuments" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: mint-course-document-001" \
--data '{
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"frameworkType": "CourseCodes",
"caseVersion": "1.1",
"creator": "Example Standards Authority",
"title": "Example Mathematics Standards",
"lastChangeDateTime": "2026-05-27T12:00:00Z",
"officialSourceURL": "https://standards.example.org/math",
"subject": [
"Mathematics"
],
"language": "eng",
"version": "2026"
}')"
DOCUMENT_ID="$(printf '%s' "$DOCUMENT_RESPONSE" | jq -r '.CFDocument.identifier')"
printf 'Use document_id=%s on child CFItem/CFAssociation writes.\n' "$DOCUMENT_ID"
Owning-document rule.
Do not let a child CFItem or CFAssociation silently create the document. A child write whose CFDocumentURI.identifier or equivalent document_id cannot resolve to an active same-tenant CFDocument returns case:missing_parent with a document-not-found field error.
Import a package, then link an external lesson
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
IMPORT_RESPONSE="$(curl -s -X POST "$BASE_URL/ims/case/v1p1/CFPackages" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: import-example-math-standards-001" \
--data '{
"CFDocument": {
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"frameworkType": "CourseCodes",
"caseVersion": "1.1",
"creator": "Example Standards Authority",
"title": "Example Mathematics Standards",
"lastChangeDateTime": "2026-05-27T12:00:00Z",
"officialSourceURL": "https://standards.example.org/math",
"subject": [
"Mathematics"
],
"language": "eng",
"version": "2026"
},
"CFItems": [
{
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"humanCodingScheme": "3.NF.A.1",
"fullStatement": "Understand a fraction 1/b as the quantity formed by one part when a whole is partitioned into b equal parts.",
"abbreviatedStatement": "Understand unit fractions.",
"educationLevel": [
"03"
],
"listEnumeration": "A",
"parentIdentifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62"
}
],
"CFAssociations": [
{
"identifier": "e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"uri": "https://standards.example.org/case/associations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"originNodeURI": {
"title": "3.NF.A.1",
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"targetType": "CASE"
},
"destinationNodeURI": {
"title": "Number and Operations - Fractions",
"identifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"uri": "https://standards.example.org/case/items/7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"targetType": "CASE"
},
"associationType": "isChildOf",
"sequenceNumber": 1
}
],
"CFDefinitions": {
"CFSubjects": [
{
"identifier": "22222222-2222-4222-8222-222222222222",
"uri": "https://standards.example.org/case/subjects/math",
"title": "Mathematics",
"hierarchyCode": "MATH",
"lastChangeDateTime": "2026-05-27T12:00:00Z"
}
]
}
}')"
DOCUMENT_ID="$(printf '%s' "$IMPORT_RESPONSE" | jq -r '.documentIdentifier')"
curl -s "$BASE_URL/ims/case/v1p1/CFPackages/$DOCUMENT_ID" \
-H "Authorization: Bearer $TOKEN"
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s -X POST "$BASE_URL/ims/case/v1p1/Alignments" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: align-fractions-lesson-001" \
--data '{
"alignmentId": "align-demo-fractions-lesson-01",
"externalSystem": "curriculum-vendor-a",
"externalId": "lesson-fractions-01",
"cfItemUri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"label": "Fractions intro lesson",
"metadata": {
"sourceUrl": "https://curriculum.example.test/lessons/fractions-01"
}
}'
curl -s "$BASE_URL/ims/case/v1p1/Alignments?externalSystem=curriculum-vendor-a&externalId=lesson-fractions-01" \
-H "Authorization: Bearer $TOKEN"
Real-tenant smoke check
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="${CASE_REVIEWER_JWT:?Set CASE_REVIEWER_JWT from the operator-minted reviewer credential}"
curl -s "$BASE_URL/ims/case/v1p1/CFItems?CFDocumentURI=https%3A%2F%2Fstandards.example.org%2Fcase%2Fcfdocuments%2F3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48&limit=25" \
-H "Authorization: Bearer $TOKEN"
Follow pagination and filter a graph edge list
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
PAGE_1="$(curl -s "$BASE_URL/ims/case/v1p1/CFItems?CFDocumentURI=https%3A%2F%2Fstandards.example.org%2Fcase%2Fcfdocuments%2F3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48&limit=2&offset=0" \
-H "Authorization: Bearer $TOKEN")"
NEXT="$(printf '%s' "$PAGE_1" | jq -r '.links.next // empty')"
NEXT_PATH="$(printf '%s' "$NEXT" | sed -E 's#^https?://[^/]+##; s#^/api/#/#')"
[ -n "$NEXT_PATH" ] && curl -s "$BASE_URL$NEXT_PATH" -H "Authorization: Bearer $TOKEN"
Pagination origin rule.
Use links.next for its path and query, then fetch it on the documented BASE_URL. A client must not change hosts while paging through CASE lists.
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFAssociations?associationType=isChildOf&originIdentifier=7d2f6d3d-65e4-4a25-85f4-e0cc8f841172&limit=10" \
-H "Authorization: Bearer $TOKEN"
Exercise one validation error
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -i -s -X POST "$BASE_URL/ims/case/v1p1/Alignments" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: invalid-alignment-example-001" \
--data '{"alignmentId":"align-demo-missing-target","externalSystem":"curriculum-vendor-a","externalId":"lesson-without-cfitem"}'
{
"type": "https://platform3-andymontgomery-9773s-projects.vercel.app/problems/case/validation-failed",
"title": "Validation failed",
"status": 400,
"code": "case:validation_failed",
"detail": "Alignment requires cfItemUri or cfItemIdentifier so the external identifier resolves to a CASE item.",
"requestId": "req_01HZCASEDEMO00000000000001",
"traceId": "trace_01HZCASEDEMO000000000001",
"fieldErrors": [
{
"field": "cfItemUri",
"reason": "required_without_cfItemIdentifier"
},
{
"field": "cfItemIdentifier",
"reason": "required_without_cfItemUri"
}
],
"rowErrors": []
}
Endpoint reference
Request and response contracts.
Official CASE Provider reads are preserved. Writes, browser lists, CFPackage import, and Alignment are labeled TimeBack extensions.
CITD-002
List framework containers with official limit, offset, sort, orderBy, filter, and fields parameters.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
limit |
query |
integer |
No |
Maximum records returned. Minimum 1. Offset paging is retained for CASE compatibility. |
CITD-006-QUERY-MODEL |
offset |
query |
integer |
No |
Zero-based starting offset for CASE-style paging. |
CITD-006-QUERY-MODEL |
sort |
query |
string |
No |
Named sort field plus asc or desc ordering. |
CITD-006-QUERY-MODEL |
orderBy |
query |
string |
No |
Named sort field plus asc or desc ordering. |
CITD-006-QUERY-MODEL |
fields |
query |
string |
No |
Optional field selection for projected response fields. |
CITD-006-QUERY-MODEL |
filter |
query |
string |
No |
Official CASE filter expression where the route supports it. |
CITD-006-QUERY-MODEL |
subject |
query |
string |
No |
Filter standards by publisher subject or education-level arrays. |
CITD-006-QUERY-MODEL |
educationLevel |
query |
string |
No |
Filter standards by publisher subject or education-level arrays. |
CITD-006-QUERY-MODEL |
updatedSince |
query |
string |
No |
Poll for rows with platform updated_at later than the supplied timestamp. |
CITD-010-EVENTING-MODEL |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFDocuments?limit=10&offset=0" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"count": 1,
"links": {},
"CFDocuments": [
{
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"frameworkType": "CourseCodes",
"caseVersion": "1.1",
"creator": "Example Standards Authority",
"title": "Example Mathematics Standards",
"lastChangeDateTime": "2026-05-27T12:00:00Z",
"officialSourceURL": "https://standards.example.org/math",
"subject": [
"Mathematics"
],
"language": "eng",
"version": "2026",
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
]
}
Data provenance: case.cf_document and CITD-005-READ-SHAPE.
Create a CFDocument using CASE 1.1 schema fields and platform idempotency.
Fresh document minting contract.
POST /ims/case/v1p1/CFDocuments is the canonical way to mint the owning document for fresh-authored standards or course content. The returned CFDocument.identifier is the owning document id; consumers that arrive from Curriculum authoring call the same value document_id. Reuse it on child writes as CFItem.CFDocumentURI.identifier and CFAssociation.CFDocumentURI.identifier instead of auto-creating or upserting a document through a child route.
Creation is an idempotent write: send Idempotency-Key with the POST and use the returned ETag as If-Match only for later PUT, PATCH, or DELETE of that CFDocument. A child write that references an unresolvable owning document returns a typed Problem, case:missing_parent, with a field error such as field = "CFDocumentURI" and reason = "document_not_found".
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s -X POST "$BASE_URL/ims/case/v1p1/CFDocuments" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-ims-case-v1p1-cfdocuments-001" \
--data '{
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"frameworkType": "CourseCodes",
"caseVersion": "1.1",
"creator": "Example Standards Authority",
"title": "Example Mathematics Standards",
"lastChangeDateTime": "2026-05-27T12:00:00Z",
"officialSourceURL": "https://standards.example.org/math",
"subject": [
"Mathematics"
],
"language": "eng",
"version": "2026"
}'
Example response
{
"CFDocument": {
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"frameworkType": "CourseCodes",
"caseVersion": "1.1",
"creator": "Example Standards Authority",
"title": "Example Mathematics Standards",
"lastChangeDateTime": "2026-05-27T12:00:00Z",
"officialSourceURL": "https://standards.example.org/math",
"subject": [
"Mathematics"
],
"language": "eng",
"version": "2026",
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_document and CITD-004-WRITE-GRANULARITY.
Read one framework container.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFDocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"CFDocument": {
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"frameworkType": "CourseCodes",
"caseVersion": "1.1",
"creator": "Example Standards Authority",
"title": "Example Mathematics Standards",
"lastChangeDateTime": "2026-05-27T12:00:00Z",
"officialSourceURL": "https://standards.example.org/math",
"subject": [
"Mathematics"
],
"language": "eng",
"version": "2026",
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_document and CITD-005-READ-SHAPE.
Replace, partially update, or retire one document with If-Match; case:admin may add cascade=true to retire the document-scoped items, associations, and alignments in one transaction.
PUT body rule.
PUT is full replacement. Every body field listed in this request table is required for the replacement object; omitted full-replacement fields return case:validation_failed with fieldErrors[].reason = "missing_required_on_put".
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
If-Match |
header |
ETag |
Yes |
Strong validator from the last read; missing returns case:precondition_required and stale returns case:precondition_failed. |
CITD-007-CONCURRENCY-MODEL |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
identifier |
body |
UUID |
Yes |
Synthetic globally unique CASE identifier for the CFDocument. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
uri |
body |
TEXT URI |
Yes |
Network-resolvable URI that identifies the CFDocument for CASE exchange. |
CITD-002-SOURCE-CONTRACT dictionary |
frameworkType |
body |
TEXT |
Yes |
Publisher's type label for this framework, such as the CASE predefined value CourseCodes. |
CITD-002-SOURCE-CONTRACT dictionary |
caseVersion |
body |
TEXT |
Yes |
CASE model version for this document. |
CITD-002-SOURCE-CONTRACT dictionary |
creator |
body |
TEXT |
Yes |
Authority that promulgated or created the framework. |
CITD-002-SOURCE-CONTRACT dictionary |
title |
body |
TEXT |
Yes |
Human-readable title of the framework shown in document lists. |
CITD-002-SOURCE-CONTRACT dictionary |
lastChangeDateTime |
body |
TIMESTAMPTZ |
Yes |
Publisher/system timestamp for the most recent change to the CASE document record. |
CITD-002-SOURCE-CONTRACT dictionary |
officialSourceURL |
body |
TEXT URI |
Yes |
URL to the formal standards citation intended for humans. |
CITD-002-SOURCE-CONTRACT dictionary |
publisher |
body |
TEXT |
Yes |
Entity responsible for making the framework available. |
CITD-002-SOURCE-CONTRACT dictionary |
description |
body |
TEXT |
Yes |
Human-readable framework description, stored as source text. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
subject |
body |
TEXT[] |
Yes |
Topic or academic subject labels for the document. |
CITD-002-SOURCE-CONTRACT CITD-006-QUERY-MODEL dictionary |
subjectURI |
body |
JSONB LinkURIDType[] |
Yes |
CASE link collection pointing to authoritative CFSubject resources referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
language |
body |
TEXT |
Yes |
Default language of text in the framework. |
CITD-002-SOURCE-CONTRACT dictionary |
version |
body |
TEXT |
Yes |
Publisher revision label for the framework. |
CITD-002-SOURCE-CONTRACT dictionary |
adoptionStatus |
body |
TEXT |
Yes |
Publication/adoption status label from the standards publisher. |
CITD-002-SOURCE-CONTRACT CITD-014-PRIVACY-RETENTION dictionary |
statusStartDate |
body |
DATE |
Yes |
Date the publisher status started. |
CITD-002-SOURCE-CONTRACT dictionary |
statusEndDate |
body |
DATE |
Yes |
Date the publisher status ended or changed. |
CITD-002-SOURCE-CONTRACT CITD-014-PRIVACY-RETENTION dictionary |
licenseURI |
body |
JSONB LinkURIDType |
Yes |
CASE link object pointing to the authoritative CFLicense referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
notes |
body |
TEXT |
Yes |
Publisher notes about the framework. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
extensions |
body |
JSONB |
Yes |
Proprietary CASE extension object for CFDocument data that is not in the core model. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN CITD-020-PACKAGE-IMPORT-EXPORT dictionary |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
ETAG="$(curl -sD - -o /tmp/case-etag-resource.json "$BASE_URL/ims/case/v1p1/CFDocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48" \
-H "Authorization: Bearer $TOKEN" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')"
curl -s -X PUT "$BASE_URL/ims/case/v1p1/CFDocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: put-ims-case-v1p1-cfdocuments-3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48-001" \
-H "If-Match: $ETAG" \
--data '{
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"frameworkType": "CourseCodes",
"caseVersion": "1.1",
"creator": "Example Standards Authority",
"title": "Example Mathematics Standards",
"lastChangeDateTime": "2026-05-27T12:00:00Z",
"officialSourceURL": "https://standards.example.org/math",
"subject": [
"Mathematics"
],
"language": "eng",
"version": "2026"
}'
Example response
{
"CFDocument": {
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"frameworkType": "CourseCodes",
"caseVersion": "1.1",
"creator": "Example Standards Authority",
"title": "Example Mathematics Standards",
"lastChangeDateTime": "2026-05-27T12:00:00Z",
"officialSourceURL": "https://standards.example.org/math",
"subject": [
"Mathematics"
],
"language": "eng",
"version": "2026",
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_document and CITD-004-WRITE-GRANULARITY.
Replace, partially update, or retire one document with If-Match; case:admin may add cascade=true to retire the document-scoped items, associations, and alignments in one transaction.
PATCH body rule.
PATCH is partial. Every body field listed in this request table is optional; send only fields you want to change. Unknown body fields return case:validation_failed with fieldErrors[].reason = "unknown_field_on_patch".
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
If-Match |
header |
ETag |
Yes |
Strong validator from the last read; missing returns case:precondition_required and stale returns case:precondition_failed. |
CITD-007-CONCURRENCY-MODEL |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
identifier |
body |
UUID |
No |
Synthetic globally unique CASE identifier for the CFDocument. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
uri |
body |
TEXT URI |
No |
Network-resolvable URI that identifies the CFDocument for CASE exchange. |
CITD-002-SOURCE-CONTRACT dictionary |
frameworkType |
body |
TEXT |
No |
Publisher's type label for this framework, such as the CASE predefined value CourseCodes. |
CITD-002-SOURCE-CONTRACT dictionary |
caseVersion |
body |
TEXT |
No |
CASE model version for this document. |
CITD-002-SOURCE-CONTRACT dictionary |
creator |
body |
TEXT |
No |
Authority that promulgated or created the framework. |
CITD-002-SOURCE-CONTRACT dictionary |
title |
body |
TEXT |
No |
Human-readable title of the framework shown in document lists. |
CITD-002-SOURCE-CONTRACT dictionary |
lastChangeDateTime |
body |
TIMESTAMPTZ |
No |
Publisher/system timestamp for the most recent change to the CASE document record. |
CITD-002-SOURCE-CONTRACT dictionary |
officialSourceURL |
body |
TEXT URI |
No |
URL to the formal standards citation intended for humans. |
CITD-002-SOURCE-CONTRACT dictionary |
publisher |
body |
TEXT |
No |
Entity responsible for making the framework available. |
CITD-002-SOURCE-CONTRACT dictionary |
description |
body |
TEXT |
No |
Human-readable framework description, stored as source text. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
subject |
body |
TEXT[] |
No |
Topic or academic subject labels for the document. |
CITD-002-SOURCE-CONTRACT CITD-006-QUERY-MODEL dictionary |
subjectURI |
body |
JSONB LinkURIDType[] |
No |
CASE link collection pointing to authoritative CFSubject resources referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
language |
body |
TEXT |
No |
Default language of text in the framework. |
CITD-002-SOURCE-CONTRACT dictionary |
version |
body |
TEXT |
No |
Publisher revision label for the framework. |
CITD-002-SOURCE-CONTRACT dictionary |
adoptionStatus |
body |
TEXT |
No |
Publication/adoption status label from the standards publisher. |
CITD-002-SOURCE-CONTRACT CITD-014-PRIVACY-RETENTION dictionary |
statusStartDate |
body |
DATE |
No |
Date the publisher status started. |
CITD-002-SOURCE-CONTRACT dictionary |
statusEndDate |
body |
DATE |
No |
Date the publisher status ended or changed. |
CITD-002-SOURCE-CONTRACT CITD-014-PRIVACY-RETENTION dictionary |
licenseURI |
body |
JSONB LinkURIDType |
No |
CASE link object pointing to the authoritative CFLicense referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
notes |
body |
TEXT |
No |
Publisher notes about the framework. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
extensions |
body |
JSONB |
No |
Proprietary CASE extension object for CFDocument data that is not in the core model. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN CITD-020-PACKAGE-IMPORT-EXPORT dictionary |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
ETAG="$(curl -sD - -o /tmp/case-etag-resource.json "$BASE_URL/ims/case/v1p1/CFDocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48" \
-H "Authorization: Bearer $TOKEN" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')"
curl -s -X PATCH "$BASE_URL/ims/case/v1p1/CFDocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: patch-ims-case-v1p1-cfdocuments-3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48-001" \
-H "If-Match: $ETAG" \
--data '{
"title": "Example Mathematics Standards, revised"
}'
Example response
{
"CFDocument": {
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"frameworkType": "CourseCodes",
"caseVersion": "1.1",
"creator": "Example Standards Authority",
"title": "Example Mathematics Standards",
"lastChangeDateTime": "2026-05-27T12:00:00Z",
"officialSourceURL": "https://standards.example.org/math",
"subject": [
"Mathematics"
],
"language": "eng",
"version": "2026",
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_document and CITD-004-WRITE-GRANULARITY.
Replace, partially update, or retire one document with If-Match; case:admin may add cascade=true to retire the document-scoped items, associations, and alignments in one transaction.
Document cascade delete rule.
Ordinary DELETE /ims/case/v1p1/CFDocuments/{sourcedId} is intentionally conservative: it requires Idempotency-Key and If-Match and returns case:resource_referenced while active CFItems or CFAssociations reference the document. For duplicate framework cleanup, a case:admin token may send cascade=true on the same route. That server-side operation retires only the document-scoped CFItems and CFAssociations and removes Alignments that point at those items; it refuses external blockers instead of silently breaking another graph.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
If-Match |
header |
ETag |
Yes |
Strong validator from the last read; missing returns case:precondition_required and stale returns case:precondition_failed. |
CITD-007-CONCURRENCY-MODEL |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cascade |
query |
boolean |
No |
Admin maintenance mode for duplicate framework cleanup. Send cascade=true only with case:admin to retire the CFDocument graph server-side; ordinary DELETE keeps returning case:resource_referenced while active graph rows reference the document. |
CITD-004-WRITE-GRANULARITY CITD-014-PRIVACY-RETENTION |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
ETAG="$(curl -sD - -o /tmp/case-etag-resource.json "$BASE_URL/ims/case/v1p1/CFDocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48" \
-H "Authorization: Bearer $TOKEN" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')"
curl -i -X DELETE "$BASE_URL/ims/case/v1p1/CFDocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-ims-case-v1p1-cfdocuments-3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48-001"
# Demo duplicate-framework cleanup; real tenants use an operator-minted CASE_ADMIN_JWT.
DEMO_ADMIN_TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo&admin=true" | jq -r '.token')"
curl -s -X DELETE "$BASE_URL/ims/case/v1p1/CFDocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48?cascade=true" \
-H "Authorization: Bearer $DEMO_ADMIN_TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: cascade-ims-case-v1p1-cfdocuments-3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48-001"
Data provenance: case.cf_document and CITD-004-WRITE-GRANULARITY.
List items by CFDocumentURI, parent identifier, association type, subject, educationLevel, or updatedAt.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
limit |
query |
integer |
No |
Maximum records returned. Minimum 1. Offset paging is retained for CASE compatibility. |
CITD-006-QUERY-MODEL |
offset |
query |
integer |
No |
Zero-based starting offset for CASE-style paging. |
CITD-006-QUERY-MODEL |
sort |
query |
string |
No |
Named sort field plus asc or desc ordering. |
CITD-006-QUERY-MODEL |
orderBy |
query |
string |
No |
Named sort field plus asc or desc ordering. |
CITD-006-QUERY-MODEL |
fields |
query |
string |
No |
Optional field selection for projected response fields. |
CITD-006-QUERY-MODEL |
CFDocumentURI |
query |
string |
No |
Filter graph rows to one framework document. |
CITD-006-QUERY-MODEL |
parentIdentifier |
query |
string |
No |
Filter children of one CFDocument or CFItem parent. |
CITD-006-QUERY-MODEL |
subject |
query |
string |
No |
Filter standards by publisher subject or education-level arrays. |
CITD-006-QUERY-MODEL |
educationLevel |
query |
string |
No |
Filter standards by publisher subject or education-level arrays. |
CITD-006-QUERY-MODEL |
updatedSince |
query |
string |
No |
Poll for rows with platform updated_at later than the supplied timestamp. |
CITD-010-EVENTING-MODEL |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFItems?limit=10&offset=0" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"count": 1,
"links": {},
"CFItems": [
{
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"humanCodingScheme": "3.NF.A.1",
"fullStatement": "Understand a fraction 1/b as the quantity formed by one part when a whole is partitioned into b equal parts.",
"abbreviatedStatement": "Understand unit fractions.",
"educationLevel": [
"03"
],
"listEnumeration": "A",
"parentIdentifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
]
}
Data provenance: case.cf_item and CITD-005-READ-SHAPE.
Create one item and its required isChildOf placement.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
identifier |
body |
UUID |
Yes |
Synthetic globally unique CASE identifier for this item. |
CITD-003-DATA-MODEL-PRIMITIVES dictionary |
uri |
body |
TEXT URI |
Yes |
Network-resolvable URI identifying this CFItem in CASE exchange. |
CITD-002-SOURCE-CONTRACT dictionary |
CFDocumentURI |
body |
JSONB LinkURIDType |
Yes |
CASE link object pointing to the authoritative CFDocument referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-003-DATA-MODEL-PRIMITIVES CITD-004-WRITE-GRANULARITY CITD-016-ITEM-TREE-INVARIANT dictionary |
humanCodingScheme |
body |
TEXT |
No |
Human-referenceable publisher code shown in standards browsers. |
CITD-006-QUERY-MODEL dictionary |
fullStatement |
body |
TEXT |
Yes |
Complete statement text for the standard, competency, or grouping node. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
abbreviatedStatement |
body |
TEXT |
No |
Short display form of fullStatement. |
CITD-002-SOURCE-CONTRACT dictionary |
educationLevel |
body |
TEXT[] |
No |
Grade, level, or instructional level at which the item is intended. |
CITD-006-QUERY-MODEL dictionary |
listEnumeration |
body |
TEXT |
No |
Publisher list-position text for display ordering. |
CITD-016-ITEM-TREE-INVARIANT dictionary |
conceptKeywords |
body |
TEXT[] |
No |
Free-text keywords and phrases describing the item's concepts. |
CITD-006-QUERY-MODEL dictionary |
conceptKeywordsURI |
body |
JSONB LinkURIDType |
No |
CASE link object pointing to the authoritative CFConcept referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
notes |
body |
TEXT |
No |
Information about derivation or editorial context for the item. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
subject |
body |
TEXT[] |
No |
Subject labels for this item. |
CITD-006-QUERY-MODEL dictionary |
subjectURI |
body |
JSONB LinkURIDType[] |
No |
CASE link collection pointing to authoritative CFSubject resources referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
licenseURI |
body |
JSONB LinkURIDType |
No |
CASE link object pointing to the authoritative CFLicense referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
language |
body |
TEXT |
No |
Default language of the item text. |
CITD-002-SOURCE-CONTRACT dictionary |
statusStartDate |
body |
DATE |
No |
Date the publisher status for this item started. |
CITD-002-SOURCE-CONTRACT dictionary |
statusEndDate |
body |
DATE |
No |
Date the publisher status for this item ended or changed. |
CITD-014-PRIVACY-RETENTION dictionary |
extensions |
body |
JSONB |
No |
Proprietary CASE extension object for item data outside the core model. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN CITD-018-ALIGNMENT-RESOURCE dictionary |
parentIdentifier |
body |
TEXT |
Yes |
Required body-level structural parent for tree navigation; points to either the owning CFDocument root or another CFItem. Wire field parentIdentifier; the stored parent_identifier column is derived from the active isChildOf destination. |
CITD-016-ITEM-TREE-INVARIANT dictionary |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s -X POST "$BASE_URL/ims/case/v1p1/CFItems" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-ims-case-v1p1-cfitems-001" \
--data '{
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"humanCodingScheme": "3.NF.A.1",
"fullStatement": "Understand a fraction 1/b as the quantity formed by one part when a whole is partitioned into b equal parts.",
"abbreviatedStatement": "Understand unit fractions.",
"educationLevel": [
"03"
],
"listEnumeration": "A",
"parentIdentifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62"
}'
Example response
{
"CFItem": {
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"humanCodingScheme": "3.NF.A.1",
"fullStatement": "Understand a fraction 1/b as the quantity formed by one part when a whole is partitioned into b equal parts.",
"abbreviatedStatement": "Understand unit fractions.",
"educationLevel": [
"03"
],
"listEnumeration": "A",
"parentIdentifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_item and CITD-004-WRITE-GRANULARITY.
Read one standard, competency, skill, or code.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFItems/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"CFItem": {
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"humanCodingScheme": "3.NF.A.1",
"fullStatement": "Understand a fraction 1/b as the quantity formed by one part when a whole is partitioned into b equal parts.",
"abbreviatedStatement": "Understand unit fractions.",
"educationLevel": [
"03"
],
"listEnumeration": "A",
"parentIdentifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_item and CITD-005-READ-SHAPE.
Edit or retire an item while preserving tree invariants.
PUT body rule.
PUT is full replacement. Every body field listed in this request table is required for the replacement object; omitted full-replacement fields return case:validation_failed with fieldErrors[].reason = "missing_required_on_put".
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
If-Match |
header |
ETag |
Yes |
Strong validator from the last read; missing returns case:precondition_required and stale returns case:precondition_failed. |
CITD-007-CONCURRENCY-MODEL |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
identifier |
body |
UUID |
Yes |
Synthetic globally unique CASE identifier for this item. |
CITD-003-DATA-MODEL-PRIMITIVES dictionary |
uri |
body |
TEXT URI |
Yes |
Network-resolvable URI identifying this CFItem in CASE exchange. |
CITD-002-SOURCE-CONTRACT dictionary |
CFDocumentURI |
body |
JSONB LinkURIDType |
Yes |
CASE link object pointing to the authoritative CFDocument referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-003-DATA-MODEL-PRIMITIVES CITD-004-WRITE-GRANULARITY CITD-016-ITEM-TREE-INVARIANT dictionary |
humanCodingScheme |
body |
TEXT |
Yes |
Human-referenceable publisher code shown in standards browsers. |
CITD-006-QUERY-MODEL dictionary |
fullStatement |
body |
TEXT |
Yes |
Complete statement text for the standard, competency, or grouping node. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
abbreviatedStatement |
body |
TEXT |
Yes |
Short display form of fullStatement. |
CITD-002-SOURCE-CONTRACT dictionary |
educationLevel |
body |
TEXT[] |
Yes |
Grade, level, or instructional level at which the item is intended. |
CITD-006-QUERY-MODEL dictionary |
listEnumeration |
body |
TEXT |
Yes |
Publisher list-position text for display ordering. |
CITD-016-ITEM-TREE-INVARIANT dictionary |
conceptKeywords |
body |
TEXT[] |
Yes |
Free-text keywords and phrases describing the item's concepts. |
CITD-006-QUERY-MODEL dictionary |
conceptKeywordsURI |
body |
JSONB LinkURIDType |
Yes |
CASE link object pointing to the authoritative CFConcept referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
notes |
body |
TEXT |
Yes |
Information about derivation or editorial context for the item. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
subject |
body |
TEXT[] |
Yes |
Subject labels for this item. |
CITD-006-QUERY-MODEL dictionary |
subjectURI |
body |
JSONB LinkURIDType[] |
Yes |
CASE link collection pointing to authoritative CFSubject resources referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
licenseURI |
body |
JSONB LinkURIDType |
Yes |
CASE link object pointing to the authoritative CFLicense referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
language |
body |
TEXT |
Yes |
Default language of the item text. |
CITD-002-SOURCE-CONTRACT dictionary |
statusStartDate |
body |
DATE |
Yes |
Date the publisher status for this item started. |
CITD-002-SOURCE-CONTRACT dictionary |
statusEndDate |
body |
DATE |
Yes |
Date the publisher status for this item ended or changed. |
CITD-014-PRIVACY-RETENTION dictionary |
extensions |
body |
JSONB |
Yes |
Proprietary CASE extension object for item data outside the core model. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN CITD-018-ALIGNMENT-RESOURCE dictionary |
parentIdentifier |
body |
TEXT |
Yes |
Required body-level structural parent for tree navigation; points to either the owning CFDocument root or another CFItem. Wire field parentIdentifier; the stored parent_identifier column is derived from the active isChildOf destination. |
CITD-016-ITEM-TREE-INVARIANT dictionary |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
ETAG="$(curl -sD - -o /tmp/case-etag-resource.json "$BASE_URL/ims/case/v1p1/CFItems/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172" \
-H "Authorization: Bearer $TOKEN" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')"
curl -s -X PUT "$BASE_URL/ims/case/v1p1/CFItems/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: put-ims-case-v1p1-cfitems-7d2f6d3d-65e4-4a25-85f4-e0cc8f841172-001" \
-H "If-Match: $ETAG" \
--data '{
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"humanCodingScheme": "3.NF.A.1",
"fullStatement": "Understand a fraction 1/b as the quantity formed by one part when a whole is partitioned into b equal parts.",
"abbreviatedStatement": "Understand unit fractions.",
"educationLevel": [
"03"
],
"listEnumeration": "A",
"parentIdentifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62"
}'
Example response
{
"CFItem": {
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"humanCodingScheme": "3.NF.A.1",
"fullStatement": "Understand a fraction 1/b as the quantity formed by one part when a whole is partitioned into b equal parts.",
"abbreviatedStatement": "Understand unit fractions.",
"educationLevel": [
"03"
],
"listEnumeration": "A",
"parentIdentifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_item and CITD-004-WRITE-GRANULARITY.
Edit or retire an item while preserving tree invariants.
PATCH body rule.
PATCH is partial. Every body field listed in this request table is optional; send only fields you want to change. Unknown body fields return case:validation_failed with fieldErrors[].reason = "unknown_field_on_patch".
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
If-Match |
header |
ETag |
Yes |
Strong validator from the last read; missing returns case:precondition_required and stale returns case:precondition_failed. |
CITD-007-CONCURRENCY-MODEL |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
identifier |
body |
UUID |
No |
Synthetic globally unique CASE identifier for this item. |
CITD-003-DATA-MODEL-PRIMITIVES dictionary |
uri |
body |
TEXT URI |
No |
Network-resolvable URI identifying this CFItem in CASE exchange. |
CITD-002-SOURCE-CONTRACT dictionary |
CFDocumentURI |
body |
JSONB LinkURIDType |
No |
CASE link object pointing to the authoritative CFDocument referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-003-DATA-MODEL-PRIMITIVES CITD-004-WRITE-GRANULARITY CITD-016-ITEM-TREE-INVARIANT dictionary |
humanCodingScheme |
body |
TEXT |
No |
Human-referenceable publisher code shown in standards browsers. |
CITD-006-QUERY-MODEL dictionary |
fullStatement |
body |
TEXT |
No |
Complete statement text for the standard, competency, or grouping node. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
abbreviatedStatement |
body |
TEXT |
No |
Short display form of fullStatement. |
CITD-002-SOURCE-CONTRACT dictionary |
educationLevel |
body |
TEXT[] |
No |
Grade, level, or instructional level at which the item is intended. |
CITD-006-QUERY-MODEL dictionary |
listEnumeration |
body |
TEXT |
No |
Publisher list-position text for display ordering. |
CITD-016-ITEM-TREE-INVARIANT dictionary |
conceptKeywords |
body |
TEXT[] |
No |
Free-text keywords and phrases describing the item's concepts. |
CITD-006-QUERY-MODEL dictionary |
conceptKeywordsURI |
body |
JSONB LinkURIDType |
No |
CASE link object pointing to the authoritative CFConcept referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
notes |
body |
TEXT |
No |
Information about derivation or editorial context for the item. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
subject |
body |
TEXT[] |
No |
Subject labels for this item. |
CITD-006-QUERY-MODEL dictionary |
subjectURI |
body |
JSONB LinkURIDType[] |
No |
CASE link collection pointing to authoritative CFSubject resources referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
licenseURI |
body |
JSONB LinkURIDType |
No |
CASE link object pointing to the authoritative CFLicense referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
language |
body |
TEXT |
No |
Default language of the item text. |
CITD-002-SOURCE-CONTRACT dictionary |
statusStartDate |
body |
DATE |
No |
Date the publisher status for this item started. |
CITD-002-SOURCE-CONTRACT dictionary |
statusEndDate |
body |
DATE |
No |
Date the publisher status for this item ended or changed. |
CITD-014-PRIVACY-RETENTION dictionary |
extensions |
body |
JSONB |
No |
Proprietary CASE extension object for item data outside the core model. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN CITD-018-ALIGNMENT-RESOURCE dictionary |
parentIdentifier |
body |
TEXT |
No |
Required body-level structural parent for tree navigation; points to either the owning CFDocument root or another CFItem. Wire field parentIdentifier; the stored parent_identifier column is derived from the active isChildOf destination. |
CITD-016-ITEM-TREE-INVARIANT dictionary |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
ETAG="$(curl -sD - -o /tmp/case-etag-resource.json "$BASE_URL/ims/case/v1p1/CFItems/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172" \
-H "Authorization: Bearer $TOKEN" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')"
curl -s -X PATCH "$BASE_URL/ims/case/v1p1/CFItems/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: patch-ims-case-v1p1-cfitems-7d2f6d3d-65e4-4a25-85f4-e0cc8f841172-001" \
-H "If-Match: $ETAG" \
--data '{
"abbreviatedStatement": "Understand unit fractions and equal parts."
}'
Example response
{
"CFItem": {
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"humanCodingScheme": "3.NF.A.1",
"fullStatement": "Understand a fraction 1/b as the quantity formed by one part when a whole is partitioned into b equal parts.",
"abbreviatedStatement": "Understand unit fractions.",
"educationLevel": [
"03"
],
"listEnumeration": "A",
"parentIdentifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_item and CITD-004-WRITE-GRANULARITY.
Edit or retire an item while preserving tree invariants.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
If-Match |
header |
ETag |
Yes |
Strong validator from the last read; missing returns case:precondition_required and stale returns case:precondition_failed. |
CITD-007-CONCURRENCY-MODEL |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
Response schema
| Field | Type | Required | Meaning | Trace |
204 No Content |
empty |
Yes |
The resource is retired or removed according to its retention rule. Re-read the list route to confirm it is gone from ordinary views. |
CITD-014-PRIVACY-RETENTION |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
ETAG="$(curl -sD - -o /tmp/case-etag-resource.json "$BASE_URL/ims/case/v1p1/CFItems/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172" \
-H "Authorization: Bearer $TOKEN" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')"
curl -i -X DELETE "$BASE_URL/ims/case/v1p1/CFItems/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-ims-case-v1p1-cfitems-7d2f6d3d-65e4-4a25-85f4-e0cc8f841172-001"
Data provenance: case.cf_item and CITD-004-WRITE-GRANULARITY.
CASE Provider pass-through
GET /ims/case/v1p1/CFItemAssociations/{sourcedId}
CITD-005-READ-SHAPE
Return the official CFAssociationSet for one CFItem.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFItemAssociations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"CFAssociationSet": {
"CFItem": {
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"humanCodingScheme": "3.NF.A.1",
"fullStatement": "Understand a fraction 1/b as the quantity formed by one part when a whole is partitioned into b equal parts.",
"abbreviatedStatement": "Understand unit fractions.",
"educationLevel": [
"03"
],
"listEnumeration": "A",
"parentIdentifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62"
},
"parents": [
{
"identifier": "e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"uri": "https://standards.example.org/case/associations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"originNodeURI": {
"title": "3.NF.A.1",
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"targetType": "CASE"
},
"destinationNodeURI": {
"title": "Number and Operations - Fractions",
"identifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"uri": "https://standards.example.org/case/items/7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"targetType": "CASE"
},
"associationType": "isChildOf",
"sequenceNumber": 1
}
],
"children": [],
"related": []
}
}
Data provenance: case.cf_association and CITD-005-READ-SHAPE.
List graph edges by origin, destination, CFDocumentURI, associationType, or updatedAt.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
limit |
query |
integer |
No |
Maximum records returned. Minimum 1. Offset paging is retained for CASE compatibility. |
CITD-006-QUERY-MODEL |
offset |
query |
integer |
No |
Zero-based starting offset for CASE-style paging. |
CITD-006-QUERY-MODEL |
sort |
query |
string |
No |
Named sort field plus asc or desc ordering. |
CITD-006-QUERY-MODEL |
orderBy |
query |
string |
No |
Named sort field plus asc or desc ordering. |
CITD-006-QUERY-MODEL |
fields |
query |
string |
No |
Optional field selection for projected response fields. |
CITD-006-QUERY-MODEL |
CFDocumentURI |
query |
string |
No |
Filter graph rows to one framework document. |
CITD-006-QUERY-MODEL |
originIdentifier |
query |
string |
No |
Filter graph edges by either endpoint. |
CITD-006-QUERY-MODEL |
destinationIdentifier |
query |
string |
No |
Filter graph edges by either endpoint. |
CITD-006-QUERY-MODEL |
associationType |
query |
string |
No |
Filter graph edges by a known CASE association type or ext:* value. |
CITD-006-QUERY-MODEL |
updatedSince |
query |
string |
No |
Poll for rows with platform updated_at later than the supplied timestamp. |
CITD-010-EVENTING-MODEL |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFAssociations?limit=10&offset=0" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"count": 1,
"links": {},
"CFAssociations": [
{
"identifier": "e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"uri": "https://standards.example.org/case/associations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"originNodeURI": {
"title": "3.NF.A.1",
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"targetType": "CASE"
},
"destinationNodeURI": {
"title": "Number and Operations - Fractions",
"identifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"uri": "https://standards.example.org/case/items/7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"targetType": "CASE"
},
"associationType": "isChildOf",
"sequenceNumber": 1,
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
]
}
Data provenance: case.cf_association and CITD-005-READ-SHAPE.
Create one typed CASE edge.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
identifier |
body |
UUID |
Yes |
Synthetic globally unique CASE identifier for this association. |
CITD-003-DATA-MODEL-PRIMITIVES dictionary |
uri |
body |
TEXT URI |
Yes |
Network-resolvable URI for this association. |
CITD-002-SOURCE-CONTRACT dictionary |
CFDocumentURI |
body |
JSONB LinkURIDType |
No |
CASE link object pointing to the authoritative CFDocument referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
originNodeURI |
body |
JSONB LinkGenURIDType |
Yes |
Origin side of the association, usually the child item for isChildOf. Send this as the CASE link object with title, identifier, uri, and targetType. |
CITD-017-ASSOCIATION-VALIDATION dictionary |
originNodeURI.identifier |
body |
TEXT |
Yes |
Extracted origin identifier for indexed graph queries. |
CITD-006-QUERY-MODEL CITD-017-ASSOCIATION-VALIDATION dictionary |
originNodeURI.targetType |
body |
TEXT |
Yes |
Target type of the origin link. |
CITD-017-ASSOCIATION-VALIDATION CITD-016-ITEM-TREE-INVARIANT dictionary |
destinationNodeURI |
body |
JSONB LinkGenURIDType |
Yes |
Destination side of the association, usually the parent item/document for isChildOf. Send this as the CASE link object with title, identifier, uri, and targetType. |
CITD-017-ASSOCIATION-VALIDATION CITD-016-ITEM-TREE-INVARIANT dictionary |
destinationNodeURI.identifier |
body |
TEXT |
Yes |
Extracted destination identifier for indexed graph queries. |
CITD-006-QUERY-MODEL CITD-017-ASSOCIATION-VALIDATION dictionary |
destinationNodeURI.targetType |
body |
TEXT |
Yes |
Target type of the destination link. |
CITD-017-ASSOCIATION-VALIDATION CITD-018-ALIGNMENT-RESOURCE dictionary |
associationType |
body |
TEXT |
Yes |
Type of graph relationship between origin and destination. |
CITD-017-ASSOCIATION-VALIDATION CITD-016-ITEM-TREE-INVARIANT dictionary |
sequenceNumber |
body |
INTEGER |
No |
Ordering hint for associated objects from the perspective of this relationship. |
CITD-016-ITEM-TREE-INVARIANT dictionary |
notes |
body |
TEXT |
No |
Human-readable publisher notes describing the association. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
extensions |
body |
JSONB |
No |
Proprietary CASE extension object for association data. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN CITD-018-ALIGNMENT-RESOURCE dictionary |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s -X POST "$BASE_URL/ims/case/v1p1/CFAssociations" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-ims-case-v1p1-cfassociations-001" \
--data '{
"identifier": "e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"uri": "https://standards.example.org/case/associations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"originNodeURI": {
"title": "3.NF.A.1",
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"targetType": "CASE"
},
"destinationNodeURI": {
"title": "Number and Operations - Fractions",
"identifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"uri": "https://standards.example.org/case/items/7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"targetType": "CASE"
},
"associationType": "isChildOf",
"sequenceNumber": 1
}'
Example response
{
"CFAssociation": {
"identifier": "e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"uri": "https://standards.example.org/case/associations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"originNodeURI": {
"title": "3.NF.A.1",
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"targetType": "CASE"
},
"destinationNodeURI": {
"title": "Number and Operations - Fractions",
"identifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"uri": "https://standards.example.org/case/items/7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"targetType": "CASE"
},
"associationType": "isChildOf",
"sequenceNumber": 1,
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_association and CITD-004-WRITE-GRANULARITY.
Read one association.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFAssociations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"CFAssociation": {
"identifier": "e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"uri": "https://standards.example.org/case/associations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"originNodeURI": {
"title": "3.NF.A.1",
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"targetType": "CASE"
},
"destinationNodeURI": {
"title": "Number and Operations - Fractions",
"identifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"uri": "https://standards.example.org/case/items/7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"targetType": "CASE"
},
"associationType": "isChildOf",
"sequenceNumber": 1,
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_association and CITD-005-READ-SHAPE.
Edit or retire one association with If-Match.
PUT body rule.
PUT is full replacement. Every body field listed in this request table is required for the replacement object; omitted full-replacement fields return case:validation_failed with fieldErrors[].reason = "missing_required_on_put".
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
If-Match |
header |
ETag |
Yes |
Strong validator from the last read; missing returns case:precondition_required and stale returns case:precondition_failed. |
CITD-007-CONCURRENCY-MODEL |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
identifier |
body |
UUID |
Yes |
Synthetic globally unique CASE identifier for this association. |
CITD-003-DATA-MODEL-PRIMITIVES dictionary |
uri |
body |
TEXT URI |
Yes |
Network-resolvable URI for this association. |
CITD-002-SOURCE-CONTRACT dictionary |
CFDocumentURI |
body |
JSONB LinkURIDType |
Yes |
CASE link object pointing to the authoritative CFDocument referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
originNodeURI |
body |
JSONB LinkGenURIDType |
Yes |
Origin side of the association, usually the child item for isChildOf. Send this as the CASE link object with title, identifier, uri, and targetType. |
CITD-017-ASSOCIATION-VALIDATION dictionary |
originNodeURI.identifier |
body |
TEXT |
Yes |
Extracted origin identifier for indexed graph queries. |
CITD-006-QUERY-MODEL CITD-017-ASSOCIATION-VALIDATION dictionary |
originNodeURI.targetType |
body |
TEXT |
Yes |
Target type of the origin link. |
CITD-017-ASSOCIATION-VALIDATION CITD-016-ITEM-TREE-INVARIANT dictionary |
destinationNodeURI |
body |
JSONB LinkGenURIDType |
Yes |
Destination side of the association, usually the parent item/document for isChildOf. Send this as the CASE link object with title, identifier, uri, and targetType. |
CITD-017-ASSOCIATION-VALIDATION CITD-016-ITEM-TREE-INVARIANT dictionary |
destinationNodeURI.identifier |
body |
TEXT |
Yes |
Extracted destination identifier for indexed graph queries. |
CITD-006-QUERY-MODEL CITD-017-ASSOCIATION-VALIDATION dictionary |
destinationNodeURI.targetType |
body |
TEXT |
Yes |
Target type of the destination link. |
CITD-017-ASSOCIATION-VALIDATION CITD-018-ALIGNMENT-RESOURCE dictionary |
associationType |
body |
TEXT |
Yes |
Type of graph relationship between origin and destination. |
CITD-017-ASSOCIATION-VALIDATION CITD-016-ITEM-TREE-INVARIANT dictionary |
sequenceNumber |
body |
INTEGER |
Yes |
Ordering hint for associated objects from the perspective of this relationship. |
CITD-016-ITEM-TREE-INVARIANT dictionary |
notes |
body |
TEXT |
Yes |
Human-readable publisher notes describing the association. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
extensions |
body |
JSONB |
Yes |
Proprietary CASE extension object for association data. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN CITD-018-ALIGNMENT-RESOURCE dictionary |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
ETAG="$(curl -sD - -o /tmp/case-etag-resource.json "$BASE_URL/ims/case/v1p1/CFAssociations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c" \
-H "Authorization: Bearer $TOKEN" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')"
curl -s -X PUT "$BASE_URL/ims/case/v1p1/CFAssociations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: put-ims-case-v1p1-cfassociations-e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c-001" \
-H "If-Match: $ETAG" \
--data '{
"identifier": "e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"uri": "https://standards.example.org/case/associations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"originNodeURI": {
"title": "3.NF.A.1",
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"targetType": "CASE"
},
"destinationNodeURI": {
"title": "Number and Operations - Fractions",
"identifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"uri": "https://standards.example.org/case/items/7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"targetType": "CASE"
},
"associationType": "isChildOf",
"sequenceNumber": 1
}'
Example response
{
"CFAssociation": {
"identifier": "e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"uri": "https://standards.example.org/case/associations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"originNodeURI": {
"title": "3.NF.A.1",
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"targetType": "CASE"
},
"destinationNodeURI": {
"title": "Number and Operations - Fractions",
"identifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"uri": "https://standards.example.org/case/items/7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"targetType": "CASE"
},
"associationType": "isChildOf",
"sequenceNumber": 1,
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_association and CITD-004-WRITE-GRANULARITY.
Edit or retire one association with If-Match.
PATCH body rule.
PATCH is partial. Every body field listed in this request table is optional; send only fields you want to change. Unknown body fields return case:validation_failed with fieldErrors[].reason = "unknown_field_on_patch".
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
If-Match |
header |
ETag |
Yes |
Strong validator from the last read; missing returns case:precondition_required and stale returns case:precondition_failed. |
CITD-007-CONCURRENCY-MODEL |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
identifier |
body |
UUID |
No |
Synthetic globally unique CASE identifier for this association. |
CITD-003-DATA-MODEL-PRIMITIVES dictionary |
uri |
body |
TEXT URI |
No |
Network-resolvable URI for this association. |
CITD-002-SOURCE-CONTRACT dictionary |
CFDocumentURI |
body |
JSONB LinkURIDType |
No |
CASE link object pointing to the authoritative CFDocument referenced by this row. Send this as the CASE link object with title, identifier, and uri; do not send a bare URI string. |
CITD-002-SOURCE-CONTRACT CITD-003-DATA-MODEL-PRIMITIVES dictionary |
originNodeURI |
body |
JSONB LinkGenURIDType |
No |
Origin side of the association, usually the child item for isChildOf. Send this as the CASE link object with title, identifier, uri, and targetType. |
CITD-017-ASSOCIATION-VALIDATION dictionary |
originNodeURI.identifier |
body |
TEXT |
No |
Extracted origin identifier for indexed graph queries. |
CITD-006-QUERY-MODEL CITD-017-ASSOCIATION-VALIDATION dictionary |
originNodeURI.targetType |
body |
TEXT |
No |
Target type of the origin link. |
CITD-017-ASSOCIATION-VALIDATION CITD-016-ITEM-TREE-INVARIANT dictionary |
destinationNodeURI |
body |
JSONB LinkGenURIDType |
No |
Destination side of the association, usually the parent item/document for isChildOf. Send this as the CASE link object with title, identifier, uri, and targetType. |
CITD-017-ASSOCIATION-VALIDATION CITD-016-ITEM-TREE-INVARIANT dictionary |
destinationNodeURI.identifier |
body |
TEXT |
No |
Extracted destination identifier for indexed graph queries. |
CITD-006-QUERY-MODEL CITD-017-ASSOCIATION-VALIDATION dictionary |
destinationNodeURI.targetType |
body |
TEXT |
No |
Target type of the destination link. |
CITD-017-ASSOCIATION-VALIDATION CITD-018-ALIGNMENT-RESOURCE dictionary |
associationType |
body |
TEXT |
No |
Type of graph relationship between origin and destination. |
CITD-017-ASSOCIATION-VALIDATION CITD-016-ITEM-TREE-INVARIANT dictionary |
sequenceNumber |
body |
INTEGER |
No |
Ordering hint for associated objects from the perspective of this relationship. |
CITD-016-ITEM-TREE-INVARIANT dictionary |
notes |
body |
TEXT |
No |
Human-readable publisher notes describing the association. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN dictionary |
extensions |
body |
JSONB |
No |
Proprietary CASE extension object for association data. |
CITD-019-CASE11-EXTENSIONS-MARKDOWN CITD-018-ALIGNMENT-RESOURCE dictionary |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
ETAG="$(curl -sD - -o /tmp/case-etag-resource.json "$BASE_URL/ims/case/v1p1/CFAssociations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c" \
-H "Authorization: Bearer $TOKEN" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')"
curl -s -X PATCH "$BASE_URL/ims/case/v1p1/CFAssociations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: patch-ims-case-v1p1-cfassociations-e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c-001" \
-H "If-Match: $ETAG" \
--data '{
"sequenceNumber": 2
}'
Example response
{
"CFAssociation": {
"identifier": "e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"uri": "https://standards.example.org/case/associations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"originNodeURI": {
"title": "3.NF.A.1",
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"targetType": "CASE"
},
"destinationNodeURI": {
"title": "Number and Operations - Fractions",
"identifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"uri": "https://standards.example.org/case/items/7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"targetType": "CASE"
},
"associationType": "isChildOf",
"sequenceNumber": 1,
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_association and CITD-004-WRITE-GRANULARITY.
Edit or retire one association with If-Match.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
If-Match |
header |
ETag |
Yes |
Strong validator from the last read; missing returns case:precondition_required and stale returns case:precondition_failed. |
CITD-007-CONCURRENCY-MODEL |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
Response schema
| Field | Type | Required | Meaning | Trace |
204 No Content |
empty |
Yes |
The resource is retired or removed according to its retention rule. Re-read the list route to confirm it is gone from ordinary views. |
CITD-014-PRIVACY-RETENTION |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
ETAG="$(curl -sD - -o /tmp/case-etag-resource.json "$BASE_URL/ims/case/v1p1/CFAssociations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c" \
-H "Authorization: Bearer $TOKEN" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')"
curl -i -X DELETE "$BASE_URL/ims/case/v1p1/CFAssociations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-ims-case-v1p1-cfassociations-e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c-001"
Data provenance: case.cf_association and CITD-004-WRITE-GRANULARITY.
Export a spec-pure CFPackage for a document; use this as the scalable post-import verification read for that document graph.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFPackages/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"CFDocument": {
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"frameworkType": "CourseCodes",
"caseVersion": "1.1",
"creator": "Example Standards Authority",
"title": "Example Mathematics Standards",
"lastChangeDateTime": "2026-05-27T12:00:00Z",
"officialSourceURL": "https://standards.example.org/math",
"subject": [
"Mathematics"
],
"language": "eng",
"version": "2026"
},
"CFItems": [
{
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"humanCodingScheme": "3.NF.A.1",
"fullStatement": "Understand a fraction 1/b as the quantity formed by one part when a whole is partitioned into b equal parts.",
"abbreviatedStatement": "Understand unit fractions.",
"educationLevel": [
"03"
],
"listEnumeration": "A",
"parentIdentifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62"
}
],
"CFAssociations": [
{
"identifier": "e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"uri": "https://standards.example.org/case/associations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"originNodeURI": {
"title": "3.NF.A.1",
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"targetType": "CASE"
},
"destinationNodeURI": {
"title": "Number and Operations - Fractions",
"identifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"uri": "https://standards.example.org/case/items/7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"targetType": "CASE"
},
"associationType": "isChildOf",
"sequenceNumber": 1
}
],
"CFDefinitions": {
"CFSubjects": [
{
"identifier": "22222222-2222-4222-8222-222222222222",
"uri": "https://standards.example.org/case/subjects/math",
"title": "Mathematics",
"hierarchyCode": "MATH",
"lastChangeDateTime": "2026-05-27T12:00:00Z"
}
]
}
}
Data provenance: CASE data dictionary and CITD-020-PACKAGE-IMPORT-EXPORT.
Import a CFPackage, validate it, and upsert the document, items, associations, definitions, and rubrics in one batch.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
CFPackage |
body |
object |
Yes |
Spec-pure CASE exchange envelope containing CFDocument, CFItems, CFAssociations, CFDefinitions, and CFRubrics. Platform audit metadata and Alignments are not accepted inside the package. |
CITD-020-PACKAGE-IMPORT-EXPORT dictionary |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s -X POST "$BASE_URL/ims/case/v1p1/CFPackages" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-ims-case-v1p1-cfpackages-001" \
--data '{
"CFDocument": {
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"frameworkType": "CourseCodes",
"caseVersion": "1.1",
"creator": "Example Standards Authority",
"title": "Example Mathematics Standards",
"lastChangeDateTime": "2026-05-27T12:00:00Z",
"officialSourceURL": "https://standards.example.org/math",
"subject": [
"Mathematics"
],
"language": "eng",
"version": "2026"
},
"CFItems": [
{
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"humanCodingScheme": "3.NF.A.1",
"fullStatement": "Understand a fraction 1/b as the quantity formed by one part when a whole is partitioned into b equal parts.",
"abbreviatedStatement": "Understand unit fractions.",
"educationLevel": [
"03"
],
"listEnumeration": "A",
"parentIdentifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62"
}
],
"CFAssociations": [
{
"identifier": "e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"uri": "https://standards.example.org/case/associations/e5b9fb4b-2f2a-4f2f-82e0-ef4774e6f19c",
"CFDocumentURI": {
"title": "Example Mathematics Standards",
"identifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"uri": "https://standards.example.org/case/cfdocuments/3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48"
},
"originNodeURI": {
"title": "3.NF.A.1",
"identifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"uri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"targetType": "CASE"
},
"destinationNodeURI": {
"title": "Number and Operations - Fractions",
"identifier": "7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"uri": "https://standards.example.org/case/items/7c928d2d-7d4e-439e-9a49-0c874cc9af62",
"targetType": "CASE"
},
"associationType": "isChildOf",
"sequenceNumber": 1
}
],
"CFDefinitions": {
"CFSubjects": [
{
"identifier": "22222222-2222-4222-8222-222222222222",
"uri": "https://standards.example.org/case/subjects/math",
"title": "Mathematics",
"hierarchyCode": "MATH",
"lastChangeDateTime": "2026-05-27T12:00:00Z"
}
]
}
}'
Example response
{
"CFPackageImport": {
"status": "succeeded",
"importBatchId": "22222222-2222-4222-8222-222222222222",
"documentIdentifier": "3f0d4d8c-2d1c-4fd6-98d5-47ad5dfc3d48",
"packageHash": "sha256:4f5fddb91460c07226cc8b15bd4699ad8476611211e7db10193303e9a716b473",
"rowCounts": {
"CFDocuments": 1,
"CFItems": 1,
"CFAssociations": 1,
"CFDefinitions": 1
},
"committedAt": "2026-05-27T15:43:05.832Z"
}
}
Data provenance: CASE data dictionary and CITD-020-PACKAGE-IMPORT-EXPORT.
Read concept definitions imported with a package.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFConcepts/11111111-1111-4111-8111-111111111111" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"CFConcept": {
"identifier": "0bb9e0f4-5108-4cab-8f8e-b9c1a57f7531",
"uri": "https://standards.example.org/case/concepts/multiplication",
"title": "Multiplication",
"keywords": "multiply|equal groups",
"hierarchyCode": "M.3.OA",
"description": "Concepts related to multiplication and equal groups.",
"lastChangeDateTime": "2026-01-15T09:00:00Z",
"extensions": {
"publisherExtension": {
"domain": "math"
}
},
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_concept and CITD-005-READ-SHAPE.
Read subject definitions imported with a package.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFSubjects/22222222-2222-4222-8222-222222222222" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"CFSubject": {
"identifier": "8c8f5d1e-9d94-4fcb-bfa3-f2e0a2fa9a10",
"uri": "https://standards.example.org/case/subjects/math",
"title": "Mathematics",
"hierarchyCode": "MATH",
"description": "Mathematics standards and competencies.",
"lastChangeDateTime": "2026-01-15T09:00:00Z",
"extensions": {
"publisherExtension": {
"cedsCode": "02"
}
},
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_subject and CITD-005-READ-SHAPE.
Read license definitions imported with a package.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFLicenses/33333333-3333-4333-8333-333333333333" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"CFLicense": {
"identifier": "3f6ae243-4c10-4568-a817-0892d3e3e5e0",
"uri": "https://standards.example.org/case/licenses/cc-by",
"title": "CC BY 4.0",
"description": "Allows sharing and adaptation with attribution.",
"licenseText": "Creative Commons Attribution 4.0 International",
"lastChangeDateTime": "2026-01-15T09:00:00Z",
"extensions": {
"publisherExtension": {
"spdx": "CC-BY-4.0"
}
},
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_license and CITD-005-READ-SHAPE.
Read item-type definitions imported with a package.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFItemTypes/44444444-4444-4444-8444-444444444444" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"CFItemType": {
"identifier": "7d7647f5-4d6f-4e67-a968-9915078aa1e1",
"uri": "https://standards.example.org/case/item-types/standard",
"title": "Standard",
"description": "A leaf or near-leaf academic standard.",
"hierarchyCode": "3",
"typeCode": "STD",
"lastChangeDateTime": "2026-01-15T09:00:00Z",
"extensions": {
"publisherExtension": {
"displayRank": 3
}
},
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_item_type and CITD-005-READ-SHAPE.
CASE Provider pass-through
GET /ims/case/v1p1/CFAssociationGroupings/{sourcedId}
CITD-005-READ-SHAPE
Read association-grouping definitions imported with a package.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFAssociationGroupings/55555555-5555-4555-8555-555555555555" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"CFAssociationGrouping": {
"identifier": "19ce0a3d-3703-4877-8c51-fda04bb1c676",
"uri": "https://standards.example.org/case/association-groups/math-progressions",
"title": "Math progressions",
"description": "Progression relationships across grade-level math standards.",
"lastChangeDateTime": "2026-01-15T09:00:00Z",
"extensions": {
"publisherExtension": {
"groupType": "progression"
}
},
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_association_grouping and CITD-005-READ-SHAPE.
Read rubric definitions imported with a package.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
sourcedId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/CFRubrics/66666666-6666-4666-8666-666666666666" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"CFRubric": {
"identifier": "e9af0e37-fc6d-4680-9889-7d4b3460b8ee",
"uri": "https://standards.example.org/case/rubrics/math-practice",
"title": "Mathematical practice rubric",
"description": "Rubric for explaining reasoning and modeling with mathematics.",
"lastChangeDateTime": "2026-01-15T09:00:00Z",
"extensions": {
"publisherExtension": {
"audience": "teachers"
}
},
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.cf_rubric and CITD-005-READ-SHAPE.
Resolve or create external-system identifier to CFItem links without writing those identifiers into CFAssociation.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
limit |
query |
integer |
No |
Maximum records returned. Minimum 1. Offset paging is retained for CASE compatibility. |
CITD-006-QUERY-MODEL |
offset |
query |
integer |
No |
Zero-based starting offset for CASE-style paging. |
CITD-006-QUERY-MODEL |
fields |
query |
string |
No |
Optional field selection for projected response fields. |
CITD-006-QUERY-MODEL |
externalSystem |
query |
string |
No |
Alignment source system namespace, for example curriculum-vendor-a. |
CITD-006-QUERY-MODEL |
externalId |
query |
string |
No |
External system identifier to resolve to one CFItem. |
CITD-006-QUERY-MODEL |
cfItemUri |
query |
string |
No |
CASE CFItem URI associated with an Alignment. |
CITD-006-QUERY-MODEL |
cfItemIdentifier |
query |
string |
No |
CASE CFItem identifier associated with an Alignment. |
CITD-006-QUERY-MODEL |
updatedSince |
query |
string |
No |
Poll for rows with platform updated_at later than the supplied timestamp. |
CITD-010-EVENTING-MODEL |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/Alignments?limit=10&offset=0" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"count": 1,
"links": {},
"Alignments": [
{
"alignmentId": "align-demo-fractions-lesson-01",
"externalSystem": "curriculum-vendor-a",
"externalId": "lesson-fractions-01",
"cfItemUri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"cfItemIdentifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"label": "Fractions intro lesson",
"metadata": {
"sourceUrl": "https://curriculum.example.test/lessons/fractions-01"
},
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
]
}
Data provenance: case.alignment and CITD-018-ALIGNMENT-RESOURCE.
Resolve or create external-system identifier to CFItem links without writing those identifiers into CFAssociation.
Alignment target rule.
Send at least one CASE item target: cfItemUri or cfItemIdentifier. You may send both only when they resolve to the same CFItem; the cURL example sends only cfItemUri to show the OR contract. Missing both returns case:validation_failed with required_without_cfItemIdentifier and required_without_cfItemUri field reasons.
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s -X POST "$BASE_URL/ims/case/v1p1/Alignments" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-ims-case-v1p1-alignments-001" \
--data '{
"alignmentId": "align-demo-fractions-lesson-01",
"externalSystem": "curriculum-vendor-a",
"externalId": "lesson-fractions-01",
"cfItemUri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"label": "Fractions intro lesson",
"metadata": {
"sourceUrl": "https://curriculum.example.test/lessons/fractions-01"
}
}'
Example response
{
"Alignment": {
"alignmentId": "align-demo-fractions-lesson-01",
"externalSystem": "curriculum-vendor-a",
"externalId": "lesson-fractions-01",
"cfItemUri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"cfItemIdentifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"label": "Fractions intro lesson",
"metadata": {
"sourceUrl": "https://curriculum.example.test/lessons/fractions-01"
},
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.alignment and CITD-018-ALIGNMENT-RESOURCE.
Read, update, or remove one external alignment with If-Match.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
alignmentId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
curl -s "$BASE_URL/ims/case/v1p1/Alignments/align-demo-fractions-lesson-01" \
-H "Authorization: Bearer $TOKEN"
Example response
{
"Alignment": {
"alignmentId": "align-demo-fractions-lesson-01",
"externalSystem": "curriculum-vendor-a",
"externalId": "lesson-fractions-01",
"cfItemUri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"cfItemIdentifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"label": "Fractions intro lesson",
"metadata": {
"sourceUrl": "https://curriculum.example.test/lessons/fractions-01"
},
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.alignment and CITD-018-ALIGNMENT-RESOURCE.
Fully replace one external alignment with If-Match; alignmentId stays in the path and the submitted body becomes the new mutable state.
Alignment target rule.
Send at least one CASE item target: cfItemUri or cfItemIdentifier. You may send both only when they resolve to the same CFItem; the cURL example sends only cfItemUri to show the OR contract. Missing both returns case:validation_failed with required_without_cfItemIdentifier and required_without_cfItemUri field reasons.
PUT body rule.
PUT is full replacement. Every body field listed in this request table is required for the replacement object except the cfItemUri / cfItemIdentifier OR pair, which is marked At least one. Omitted full-replacement fields return case:validation_failed with fieldErrors[].reason = "missing_required_on_put". The path alignmentId is immutable and is not accepted in the body; a body-side alignmentId returns case:validation_failed with fieldErrors[].reason = "path_body_id_conflict".
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
ETAG="$(curl -sD - -o /tmp/case-etag-resource.json "$BASE_URL/ims/case/v1p1/Alignments/align-demo-fractions-lesson-01" \
-H "Authorization: Bearer $TOKEN" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')"
curl -s -X PUT "$BASE_URL/ims/case/v1p1/Alignments/align-demo-fractions-lesson-01" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: put-ims-case-v1p1-alignments-align-demo-fractions-lesson-01-001" \
-H "If-Match: $ETAG" \
--data '{
"externalSystem": "curriculum-vendor-a",
"externalId": "lesson-fractions-01",
"cfItemUri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"label": "Fractions intro lesson",
"metadata": {
"sourceUrl": "https://curriculum.example.test/lessons/fractions-01"
}
}'
Example response
{
"Alignment": {
"alignmentId": "align-demo-fractions-lesson-01",
"externalSystem": "curriculum-vendor-a",
"externalId": "lesson-fractions-01",
"cfItemUri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"cfItemIdentifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"label": "Fractions intro lesson",
"metadata": {
"sourceUrl": "https://curriculum.example.test/lessons/fractions-01"
},
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.alignment and CITD-018-ALIGNMENT-RESOURCE.
Read, update, or remove one external alignment with If-Match.
Alignment target rule.
Target fields are optional on PATCH. If a PATCH sends both cfItemUri and cfItemIdentifier, they must resolve to the same CFItem.
PATCH body rule.
PATCH is partial. Every body field listed in this request table is optional; send only fields you want to change. Unknown body fields return case:validation_failed with fieldErrors[].reason = "unknown_field_on_patch". The path alignmentId is immutable and is not accepted in the body; a body-side alignmentId returns case:validation_failed with fieldErrors[].reason = "path_body_id_conflict".
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
ETAG="$(curl -sD - -o /tmp/case-etag-resource.json "$BASE_URL/ims/case/v1p1/Alignments/align-demo-fractions-lesson-01" \
-H "Authorization: Bearer $TOKEN" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')"
curl -s -X PATCH "$BASE_URL/ims/case/v1p1/Alignments/align-demo-fractions-lesson-01" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: patch-ims-case-v1p1-alignments-align-demo-fractions-lesson-01-001" \
-H "If-Match: $ETAG" \
--data '{
"label": "Fractions intro lesson, revised"
}'
Example response
{
"Alignment": {
"alignmentId": "align-demo-fractions-lesson-01",
"externalSystem": "curriculum-vendor-a",
"externalId": "lesson-fractions-01",
"cfItemUri": "https://standards.example.org/case/items/7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"cfItemIdentifier": "7d2f6d3d-65e4-4a25-85f4-e0cc8f841172",
"label": "Fractions intro lesson",
"metadata": {
"sourceUrl": "https://curriculum.example.test/lessons/fractions-01"
},
"_platform": {
"tenant_id": "00000000-0000-4000-8000-00000000ca11",
"import_batch_id": "22222222-2222-4222-8222-222222222222",
"updated_at": "2026-05-27T12:05:00Z"
}
}
}
Data provenance: case.alignment and CITD-018-ALIGNMENT-RESOURCE.
Read, update, or remove one external alignment with If-Match.
Request schema
| Field | In | Type | Required | Meaning | Trace |
Authorization |
header |
Bearer JWT |
Yes |
HS256 token carrying tenantId plus case:read, case:write, case:import, or case:admin scopes. |
CITD-009-AUTH-SHAPE |
Idempotency-Key |
header |
string |
Retryable writes |
Stable client key for replaying the same write response instead of duplicating mutations. |
CITD-008-IDEMPOTENCY-MODEL |
If-Match |
header |
ETag |
Yes |
Strong validator from the last read; missing returns case:precondition_required and stale returns case:precondition_failed. |
CITD-007-CONCURRENCY-MODEL |
alignmentId |
path |
string |
Yes |
Stable identifier in the path, scoped to the JWT tenant. |
CITD-012-TENANT-ROUTING |
Response schema
| Field | Type | Required | Meaning | Trace |
204 No Content |
empty |
Yes |
The resource is retired or removed according to its retention rule. Re-read the list route to confirm it is gone from ordinary views. |
CITD-014-PRIVACY-RETENTION |
cURL
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/case/1edtech/implementation/api"
TOKEN="$(curl -s -X POST "$BASE_URL/dev/mint?tenantId=demo" | jq -r '.token')"
ETAG="$(curl -sD - -o /tmp/case-etag-resource.json "$BASE_URL/ims/case/v1p1/Alignments/align-demo-fractions-lesson-01" \
-H "Authorization: Bearer $TOKEN" | awk 'tolower($1)=="etag:" {print $2}' | tr -d '\r')"
curl -i -X DELETE "$BASE_URL/ims/case/v1p1/Alignments/align-demo-fractions-lesson-01" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-ims-case-v1p1-alignments-align-demo-fractions-lesson-01-001"
Data provenance: case.alignment and CITD-018-ALIGNMENT-RESOURCE.