Endpoint reference
Request and response schemas are inline on every endpoint.
Use the paths below relative to $BASE_URL, which every endpoint cURL block binds to the implementation URL. The base already includes the implementation mount and is the same URL for tenantId=demo and real tenants. Collection response rows use OneRoster CSV field names for source fields and _platform for tenant/import metadata. The rendered contract.json is generated from these cards and includes the full architecture-pinned route family.
Organization route: the collection is /orgs, not /organizations, because the approved OneRoster source file and data dictionary table are orgs.csv / oneroster.orgs. The generated contract file fails generation if /organizations appears as an endpoint.
Published route scope: The public contract includes CSV import/export, batch lookup, every collection list including /gradingPeriods, detail reads, documented sub-collections, and per-resource POST/PUT/PATCH/DELETE with ETag, If-Match, and Idempotency-Key controls. Detail and mutation routes use the same OneRoster sourcedId values returned by list routes. The controlling architecture decisions are
OITD-102 OITD-101 OITD-104 OITD-112.
oneroster.demo.mint_token
Mint a demo token
Returns a short-lived demo JWT for tenantId=demo on the same deployment that serves real tenants, so a cold reader can try collection reads without an out-of-band credential. This is the canonical customer docs path.
#
- Method
POST
- Path
/dev/mint?tenantId=demo
- Auth
- No Authorization header; demo tenant only on the single implementation deployment
- Status
- 200400405
Trace: OITD-011 OITD-015
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo"
Request schema
| Field | Location | Type | Required | Description | Trace |
tenantId |
Query |
string |
Yes |
Demo tenant selector. It must be demo; missing or different values return a redacted 400 Problem. The canonical docs path is /dev/mint; the live deployment also serves /demo-token as a compatibility alias because validation Problems cite that path. |
OITD-011 |
body |
Body |
empty |
Yes |
No request body. Demo identity and roles are fixed by the implementation deployment. |
OITD-011 |
Response schema
| Field | Type | Required | Description | Trace |
token |
string |
Yes |
Short-lived HS256 JWT accepted by the OneRoster demo API. |
OITD-011 |
tokenType |
string |
Yes |
Always Bearer. |
OITD-011 |
expiresIn |
integer |
Yes |
Seconds until the demo token expires. |
OITD-011 |
tenant_id |
string |
Yes |
Tenant scope embedded in the token. The public demo value is demo; real tenants use the operator-minted tenant identifier. |
platform.tenant.tenant_id |
roles |
array<string> |
Yes |
Demo roles granted to the token. |
OITD-011 |
oneroster.demo.mint_token.alias
Mint a demo token with the compatibility alias
Compatibility alias served by the live deployment. New clients should prefer /dev/mint, but this alias is documented because current validation Problems point customers here.
#
- Method
POST
- Path
/demo-token?tenantId=demo
- Auth
- No Authorization header; demo tenant only on the single implementation deployment
- Status
- 200400405
Trace: OITD-011 OITD-015
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
curl -fsS -X POST "$BASE_URL/demo-token?tenantId=demo"
Request schema
| Field | Location | Type | Required | Description | Trace |
tenantId |
Query |
string |
Yes |
Demo tenant selector. It must be demo; missing or different values return a redacted 400 Problem. The canonical docs path is /dev/mint; the live deployment also serves /demo-token as a compatibility alias because validation Problems cite that path. |
OITD-011 |
body |
Body |
empty |
Yes |
No request body. Demo identity and roles are fixed by the implementation deployment. |
OITD-011 |
Response schema
| Field | Type | Required | Description | Trace |
token |
string |
Yes |
Short-lived HS256 JWT accepted by the OneRoster demo API. |
OITD-011 |
tokenType |
string |
Yes |
Always Bearer. |
OITD-011 |
expiresIn |
integer |
Yes |
Seconds until the demo token expires. |
OITD-011 |
tenant_id |
string |
Yes |
Tenant scope embedded in the token. The public demo value is demo; real tenants use the operator-minted tenant identifier. |
platform.tenant.tenant_id |
roles |
array<string> |
Yes |
Demo roles granted to the token. |
OITD-011 |
oneroster.import_csv_package
Import a OneRoster CSV package
Accepts a ZIP package containing manifest.csv and OneRoster CSV files, validates the package strictly, persists generated relational projections, and returns batch evidence.
#
- Method
POST
- Path
/imports/csv
- Auth
- Bearer JWT with tenant_id; write role/scope required
- Status
- 202400401403409415422
Trace: OITD-006 OITD-009 OITD-010 OITD-011 OITD-012 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/imports/csv" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: import-demo-001" \
-F "package=@oneroster-demo.zip;type=application/zip"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
package |
multipart/form-data |
application/zip |
Yes |
ZIP package with manifest.csv and the OneRoster CSV files declared by the manifest. Header order and allowed values are strict. |
OITD-009 |
oneroster.import_batch.get
Inspect an import or export batch
Reads the evidence row for an import or export. Use this after an import to check status, manifest version, source system, package hash, and timestamps.
#
- Method
GET
- Path
/imports/{batch_id}
- Auth
- Bearer JWT with matching tenant_id
- Status
- 200401403404
Trace: OITD-006 OITD-010 OITD-011
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
BATCH_ID="replace-with-batch-id-from-import-or-export"
curl -fsS "$BASE_URL/imports/$BATCH_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
batch_id |
Path |
text |
Yes |
The batch identifier returned by import or export. |
oneroster.import_batch.batch_id |
oneroster.export_csv_package
Export a tenant OneRoster CSV package
Creates an export evidence row and returns a tenant-scoped package descriptor. The exported CSV names and field names remain OneRoster vocabulary.
#
- Method
POST
- Path
/exports/csv
- Auth
- Bearer JWT with tenant_id; export role/scope required
- Status
- 202400401403409422
Trace: OITD-006 OITD-010 OITD-011 OITD-012 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/exports/csv" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: export-demo-001" \
-H "Content-Type: application/json" \
--data '{"mode":"bulk"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
mode |
Body |
enum |
Yes |
Export mode. Use bulk for a full package or delta when the caller is intentionally exporting a change set. |
oneroster.import_batch.mode |
oneroster.academic_sessions.list
List Academic Sessions
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/academicSessions
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/academicSessions" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from academicSessions.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.academic_sessions |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.academic_sessions |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.academic_sessions.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.academic_sessions.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this academic sessions row. |
oneroster.academic_sessions.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.academic_sessions.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.academic_sessions.date_last_modified |
items[].title |
text |
Yes |
Name or title of the academic session. |
oneroster.academic_sessions.title |
items[].type |
text |
Yes |
Calendar-window type for the academic session. Courses usually point at schoolYear, classes usually list term or semester rows, and gradebook reporting can use gradingPeriod. |
oneroster.academic_sessions.type |
items[].startDate |
date |
Yes |
Inclusive end date for the academic session. ISO 8601 format [ISO8601]. |
oneroster.academic_sessions.start_date |
items[].endDate |
date |
Yes |
Exclusive end date for the academic session. ISO 8601 format [ISO8601]. |
oneroster.academic_sessions.end_date |
items[].parentSourcedId |
text |
No |
SourcedId of the parent of this academic session. |
oneroster.academic_sessions.parent_sourced_id |
items[].schoolYear |
integer |
Yes |
The school year for which the academic session contributes. This year should be that in which the school year ends (Format is: YYYY). |
oneroster.academic_sessions.school_year |
oneroster.categories.list
List Categories
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/categories
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/categories" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from categories.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.categories |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.categories |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.categories.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.categories.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this categories row. |
oneroster.categories.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.categories.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.categories.date_last_modified |
items[].title |
text |
Yes |
The title assigned to the set of lineItems to denote its nature e.g. homework, essays, etc. |
oneroster.categories.title |
items[].weight |
integer |
No |
Total weight of this grading category in calculation of course final score. This is a Percent value only, e.g. 80%. This is a new column added in version 1.2. |
oneroster.categories.weight |
oneroster.classes.list
List Classes
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/classes
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/classes" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from classes.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.classes |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.classes |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.classes.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.classes.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this classes row. |
oneroster.classes.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.classes.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.classes.date_last_modified |
items[].title |
text |
Yes |
Name of this class. |
oneroster.classes.title |
items[].grades |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.classes.grades |
items[].courseSourcedId |
text |
Yes |
SourcedId of the course of which this class is an instance. |
oneroster.classes.course_sourced_id |
items[].classCode |
text |
No |
Human readable code used to help identify this class. |
oneroster.classes.class_code |
items[].classType |
text |
Yes |
Class scheduling category. scheduled is an ordinary instructional section; homeroom is a homeroom grouping that may not carry the same course schedule semantics. |
oneroster.classes.class_type |
items[].location |
text |
No |
Human readable description of where the class is physically located. |
oneroster.classes.location |
items[].schoolSourcedId |
text |
Yes |
SourcedId of the Org that teaches this class of OrgType 'school'. |
oneroster.classes.school_sourced_id |
items[].termSourcedIds |
text |
Yes |
SourcedIds of the terms (the academicSessions) in which the class is taught. |
oneroster.classes.term_sourced_ids |
items[].subjects |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance.... |
oneroster.classes.subjects |
items[].subjectCodes |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is pre... |
oneroster.classes.subject_codes |
items[].periods |
text |
No |
The time slots in the day that the class will be given. If more than one period is needed, use double quotes, and separate with commas (per [RFC4180]). Examples: 1; "1,3,5" |
oneroster.classes.periods |
oneroster.class_resources.list
List Class Resources
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/classResources
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/classResources" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from classResources.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.class_resources |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.class_resources |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.class_resources.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.class_resources.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this class resources row. |
oneroster.class_resources.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.class_resources.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.class_resources.date_last_modified |
items[].title |
text |
No |
Name of the related class. |
oneroster.class_resources.title |
items[].classSourcedId |
text |
Yes |
SourcedId of the reference Class. |
oneroster.class_resources.class_sourced_id |
items[].resourceSourcedId |
text |
Yes |
SourcedId of the Resource associated with the Class. |
oneroster.class_resources.resource_sourced_id |
oneroster.course_resources.list
List Course Resources
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/courseResources
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/courseResources" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
oneroster.courses.list
List Courses
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/courses
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/courses" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from courses.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.courses |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.courses |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.courses.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.courses.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this courses row. |
oneroster.courses.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.courses.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.courses.date_last_modified |
items[].schoolYearSourcedId |
text |
No |
SourcedId of the associated AcademicSession with type of 'schoolYear'. |
oneroster.courses.school_year_sourced_id |
items[].title |
text |
Yes |
Name of this course. |
oneroster.courses.title |
items[].courseCode |
text |
No |
Human readable code used to help identify this course. |
oneroster.courses.course_code |
items[].grades |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.courses.grades |
items[].orgSourcedId |
text |
Yes |
SourcedId of an org to which this course belongs. |
oneroster.courses.org_sourced_id |
items[].subjects |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance.... |
oneroster.courses.subjects |
items[].subjectCodes |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is pre... |
oneroster.courses.subject_codes |
oneroster.demographics.list
List Demographics
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/demographics
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/demographics" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from demographics.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.demographics |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.demographics |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.demographics.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.demographics.import_batch_id |
items[].sourcedId |
text |
Yes |
The user's sourcedId; in demographics.csv this is the same identifier as the user whose demographics are being described. |
oneroster.demographics.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.demographics.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.demographics.date_last_modified |
items[].birthDate |
date |
No |
The date of birth. ISO 861 format: 'YYYY-MM-DD'. |
oneroster.demographics.birth_date |
items[].sex |
text |
No |
Sex value reported by the source system for the user described by demographics.sourced_id. It is a sensitive demographic exchange field; unspecified preserves a deliberate source... |
oneroster.demographics.sex |
items[].americanIndianOrAlaskaNative |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. This is one of several race indicators that may be true at the same time; it is... |
oneroster.demographics.american_indian_or_alaska_native |
items[].asian |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It can be true alongside other race indicators, and consumers must treat it as... |
oneroster.demographics.asian |
items[].blackOrAfricanAmerican |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is independent of the other race flags and may coexist with demographic_race... |
oneroster.demographics.black_or_african_american |
items[].nativeHawaiianOrOtherPacificIslander |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It may be true alongside other race flags and must not be collapsed into a sing... |
oneroster.demographics.native_hawaiian_or_other_pacific_islander |
items[].white |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is preserved exactly because downstream compliance reports often inspect eac... |
oneroster.demographics.white |
items[].demographicRaceTwoOrMoreRaces |
text |
No |
OneRoster's explicit indicator that the source reports the user in two or more race categories. It should be true when the source asserts multi-race status; it does not erase the... |
oneroster.demographics.demographic_race_two_or_more_races |
items[].hispanicOrLatinoEthnicity |
text |
No |
Ethnicity indicator reported by the source system for the user described by demographics.sourced_id. It is independent of race flags, may be true with any race combination, and is... |
oneroster.demographics.hispanic_or_latino_ethnicity |
items[].countryOfBirthCode |
text |
No |
Country where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.country_of_birth_code |
items[].stateOfBirthAbbreviation |
text |
No |
State where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.state_of_birth_abbreviation |
items[].cityOfBirth |
text |
No |
City where the user was born. |
oneroster.demographics.city_of_birth |
items[].publicSchoolResidenceStatus |
text |
No |
An indication of the location of the users legal residence relative to (within or outside) the boundaries of the public school attended and its administrative unit. The permitted... |
oneroster.demographics.public_school_residence_status |
oneroster.enrollments.list
List Enrollments
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/enrollments
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/enrollments" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from enrollments.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.enrollments |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.enrollments |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.enrollments.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.enrollments.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this enrollments row. |
oneroster.enrollments.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.enrollments.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.enrollments.date_last_modified |
items[].classSourcedId |
text |
Yes |
SourcedId of the Class. |
oneroster.enrollments.class_sourced_id |
items[].schoolSourcedId |
text |
Yes |
SourcedId of an Org with type 'school'. |
oneroster.enrollments.school_sourced_id |
items[].userSourcedId |
text |
Yes |
SourcedId of the User. |
oneroster.enrollments.user_sourced_id |
items[].role |
text |
Yes |
The user's class-level membership role for this enrollment. It drives whether the row represents a learner, teacher, proctor, or administrator in active-enrollment queries and mus... |
oneroster.enrollments.role |
items[].primary |
text |
No |
Teacher-primary marker for a class enrollment. It applies only when enrollments.role is teacher; true identifies the primary teacher for the class/date window, while student, proc... |
oneroster.enrollments.primary |
items[].beginDate |
date |
No |
The start date for the enrollment (inclusive). This date must align with the associated academic session (term) identified in the class. |
oneroster.enrollments.begin_date |
items[].endDate |
date |
No |
The end date for the enrollment (exclusive). This date must align with the associated academic session (term) identified for the class. |
oneroster.enrollments.end_date |
oneroster.line_item_learning_objective_ids.list
List Line Item Learning Objective IDs
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/lineItemLearningObjectiveIds
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/lineItemLearningObjectiveIds" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
oneroster.line_items.list
List Line Items
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/lineItems
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/lineItems" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
oneroster.line_item_score_scales.list
List Line Item Score Scales
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/lineItemScoreScales
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/lineItemScoreScales" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
oneroster.orgs.list
List Organizations
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/orgs
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/orgs" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from orgs.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.orgs |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.orgs |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.orgs.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.orgs.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this orgs row. |
oneroster.orgs.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.orgs.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.orgs.date_last_modified |
items[].name |
text |
Yes |
Name of the organization. |
oneroster.orgs.name |
items[].type |
text |
Yes |
Organization classification that determines which references this org row can satisfy. school is the value required by classes.school_sourced_id, enrollments.school_sourced_id, an... |
oneroster.orgs.type |
items[].identifier |
text |
No |
Human readable identifier for this org e.g. NCES ID. |
oneroster.orgs.identifier |
items[].parentSourcedId |
text |
No |
SourcedId of an Org representing the Parent organization. |
oneroster.orgs.parent_sourced_id |
oneroster.resources.list
List Resources
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/resources
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/resources" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from resources.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.resources |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.resources |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.resources.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.resources.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this resources row. |
oneroster.resources.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.resources.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.resources.date_last_modified |
items[].vendorResourceId |
text |
Yes |
Unique ID of this resource as allocated by the vendor. It is unique in the context of resource identifiers allocated by the vendor. |
oneroster.resources.vendor_resource_id |
items[].title |
text |
No |
Name of this resource. |
oneroster.resources.title |
items[].roles |
text |
No |
Audience roles for which a resource is intended. This is an enum list in one CSV cell, so several roles may receive the same resource without creating separate resource rows. |
oneroster.resources.roles |
items[].importance |
text |
No |
Resource priority inside its class, course, or user context. primary marks the main resource mapping; secondary marks supporting material. |
oneroster.resources.importance |
items[].vendorId |
text |
No |
Identifier of the vendor responsible for this resource. This unique ID will be assigned by 1EdTech during the OneRoster conformance process. |
oneroster.resources.vendor_id |
items[].applicationId |
text |
No |
Identifier of the application associated with this resource. This identifier is assigned by the creator/vendor of the resource. |
oneroster.resources.application_id |
oneroster.result_learning_objective_ids.list
List Result Learning Objective IDs
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/resultLearningObjectiveIds
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/resultLearningObjectiveIds" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
oneroster.results.list
List Results
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/results
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/results" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from results.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.results |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.results |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.results.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.results.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this results row. |
oneroster.results.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.results.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.results.date_last_modified |
items[].lineItemSourcedId |
text |
Yes |
Unique identifier of the lineItem. |
oneroster.results.line_item_sourced_id |
items[].studentSourcedId |
text |
Yes |
Unique identifier of the student (user). References a record that is/was created in the users.csv file with type of 'student'. |
oneroster.results.student_sourced_id |
items[].scoreStatus |
text |
Yes |
Gradebook result state for the student's line item. It tells consumers whether the result is submitted, graded, exempt, or still missing work. |
oneroster.results.score_status |
items[].score |
double precision |
No |
Numeric result value for the student's line item. When present, it must resolve to exactly one same-tenant effective score scale before persistence and must stay consistent with l... |
oneroster.results.score |
items[].scoreDate |
date |
Yes |
The date the result was submitted and/or the 'scoreStatus' was changed. |
oneroster.results.score_date |
items[].comment |
text |
No |
Human readable comment about the result. |
oneroster.results.comment |
items[].textScore |
text |
No |
Non-numeric gradebook value for the student's line item. When present, it must align with exactly one same-tenant effective score scale before persistence; a read-time hint cannot... |
oneroster.results.text_score |
items[].classSourcedId |
text |
No |
Unique identifier of the class. References a record that is/was created in the classes.csv file. This is a new column added in version 1.2. |
oneroster.results.class_sourced_id |
items[].inProgress |
text |
No |
Workflow flag that says assigned work is still in progress and a submitted work product is not expected yet. It affects gradebook interpretation, not row lifecycle. |
oneroster.results.in_progress |
items[].incomplete |
text |
No |
Workflow flag that says submitted student work is present but incomplete. It can coexist with score_status values while the teacher resolves grading. |
oneroster.results.incomplete |
items[].late |
text |
No |
Workflow flag that says the work was submitted after the due date or is otherwise past due. It may affect scoring policy but does not change the result row's tenant-scoped identit... |
oneroster.results.late |
items[].missing |
text |
No |
Workflow flag that says expected work has not been submitted and is considered missing. It should not be inferred only from a blank score; the source must send the flag. |
oneroster.results.missing |
oneroster.result_score_scales.list
List Result Score Scales
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/resultScoreScales
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/resultScoreScales" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
oneroster.roles.list
List Roles
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/roles
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/roles" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from roles.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.roles |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.roles |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.roles.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.roles.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this roles row. |
oneroster.roles.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.roles.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.roles.date_last_modified |
items[].userSourcedId |
text |
Yes |
The user whose role is being defined. |
oneroster.roles.user_sourced_id |
items[].roleType |
text |
Yes |
Primary/secondary marker for a user's role inside one organization. Only one role per user/org should be primary for the same active date window. |
oneroster.roles.role_type |
items[].role |
text |
Yes |
Organization-level role assigned to the user. It is separate from enrollments.role: this field says what the person is in an org, while enrollments.role says what they are in a cl... |
oneroster.roles.role |
items[].beginDate |
date |
No |
The start date on which the role became active (inclusive). |
oneroster.roles.begin_date |
items[].endDate |
date |
No |
The end date on which the role ceased to be active (exclusive). |
oneroster.roles.end_date |
items[].orgSourcedId |
text |
Yes |
SourcedId of the Org within which the User has the assigned role. |
oneroster.roles.org_sourced_id |
items[].userProfileSourcedId |
text |
No |
SourcedId of the UserProfile for the User. |
oneroster.roles.user_profile_sourced_id |
oneroster.score_scales.list
List Score Scales
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/scoreScales
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/scoreScales" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from scoreScales.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.score_scales |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.score_scales |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.score_scales.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.score_scales.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this score scales row. |
oneroster.score_scales.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.score_scales.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.score_scales.date_last_modified |
items[].title |
text |
Yes |
A human readable title for the score scale. |
oneroster.score_scales.title |
items[].type |
text |
Yes |
The type of score scaling e.g. percent. |
oneroster.score_scales.type |
items[].orgSourcedId |
text |
Yes |
The org for which the score scale is used. |
oneroster.score_scales.org_sourced_id |
items[].courseSourcedId |
text |
Yes |
The course for which the score scale is used. |
oneroster.score_scales.course_sourced_id |
items[].classSourcedId |
text |
Yes |
The class for which the score scale is used. |
oneroster.score_scales.class_sourced_id |
items[].scoreScaleValue |
text |
Yes |
OneRoster score-scale mapping cell. Each {left:right} pair maps a source scale label or range to a target value and multiple mappings stay in the same CSV cell. |
oneroster.score_scales.score_scale_value |
oneroster.user_profiles.list
List User Profiles
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/userProfiles
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/userProfiles" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from userProfiles.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.user_profiles |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.user_profiles |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.user_profiles.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.user_profiles.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this user profiles row. |
oneroster.user_profiles.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.user_profiles.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.user_profiles.date_last_modified |
items[].userSourcedId |
text |
Yes |
Unique ID for the corresponding user. |
oneroster.user_profiles.user_sourced_id |
items[].profileType |
text |
Yes |
The type of user profile. This should be a human readable label that has some significance in the context of the related system, app, tool, etc. |
oneroster.user_profiles.profile_type |
items[].vendorId |
text |
Yes |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this user profile. |
oneroster.user_profiles.vendor_id |
items[].applicationId |
text |
No |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this account. |
oneroster.user_profiles.application_id |
items[].description |
text |
No |
A human readable description of the use of the account. This should not contain any security information for access to the account. |
oneroster.user_profiles.description |
items[].credentialType |
text |
Yes |
The type of credentials for the user profile. This should be indicative of when this credential should be used. |
oneroster.user_profiles.credential_type |
items[].username |
text |
Yes |
The username for this profile. |
oneroster.user_profiles.username |
items[].password |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted, the processing system must be aware of the encryption method. |
oneroster.user_profiles.password |
oneroster.user_resources.list
List User Resources
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/userResources
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/userResources" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
oneroster.users.list
List Users
Direct list projection over this CSV-derived table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/users
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/users" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from users.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.users |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.users |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.users.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.users.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this users row. |
oneroster.users.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.users.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.users.date_last_modified |
items[].enabledUser |
text |
Yes |
Source-system account availability flag for the user row. true means the source considers the user enabled; false preserves the roster identity but tells platform3 not to treat th... |
oneroster.users.enabled_user |
items[].username |
text |
Yes |
User name. |
oneroster.users.username |
items[].userIds |
text |
No |
External machine-readable ID (e.g. LDAP id, LTI id) for this user. The ID must be accompanied by a type to indicate the nature of the Identifier. The Type and ID values are enclos... |
oneroster.users.user_ids |
items[].givenName |
text |
Yes |
User's first name. |
oneroster.users.given_name |
items[].familyName |
text |
Yes |
User's surname. |
oneroster.users.family_name |
items[].middleName |
text |
No |
User's middle name(s). If more than one then they are separated by a space. |
oneroster.users.middle_name |
items[].identifier |
text |
No |
Identifier for the user with a human readable meaning. |
oneroster.users.identifier |
items[].email |
text |
No |
Email address for the User. |
oneroster.users.email |
items[].sms |
text |
No |
SMS address for the User. |
oneroster.users.sms |
items[].phone |
text |
No |
Phone number for the User. |
oneroster.users.phone |
items[].agentSourcedIds |
text |
No |
SourcedIds of the Users to which this user has a relationship. If multiple IDs are required then use double quotes and separate with commas. Note: In most cases this will be for i... |
oneroster.users.agent_sourced_ids |
items[].grades |
text |
No |
Grade(s) for which a user with role 'student' is enrolled. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.users.grades |
items[].password |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted the processing system must be aware of the encryption method. |
oneroster.users.password |
items[].userMasterIdentifier |
text |
No |
The master identifier that could be used to provide globally unique identification of the user across all of the tools, systems, apps, etc. available/accessed by the user. This is... |
oneroster.users.user_master_identifier |
items[].preferredGivenName |
text |
No |
The given name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_given_name |
items[].preferredMiddleName |
text |
No |
The middle names by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_middle_name |
items[].preferredFamilyName |
text |
No |
The family name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_family_name |
items[].primaryOrgSourcedId |
text |
No |
The sourcedId of the primary 'org' for the 'user'. In OR 1.2 a user can have one or more 'roles' in one or more 'org's and so this field can be used for identification of the prim... |
oneroster.users.primary_org_sourced_id |
items[].pronouns |
text |
No |
The pronoun(s) by which this person is referenced. Examples (in the case of English) include 'she/her/hers', 'he/him/his', 'they/them/theirs', 'ze/hir/hir', 'xe/xir', or a stateme... |
oneroster.users.pronouns |
oneroster.grading_periods.list
List Grading Periods
Virtual list projection where academic_sessions.type = gradingPeriod; no separate oneroster.grading_periods table. Current live reads apply supported filter, sort, limit, cursor, and modifiedSince controls; unsupported or invalid query controls return typed 400 Problems.
#
- Method
GET
- Path
/gradingPeriods
- Auth
- Bearer JWT with matching tenant_id; scoped claims may narrow visibility
- Status
- 200400401403429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-103 OITD-107 OITD-112 OITD-011 OITD-014
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS "$BASE_URL/gradingPeriods" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from academicSessions.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.academic_sessions |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.academic_sessions |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.academic_sessions.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.academic_sessions.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this academic sessions row. |
oneroster.academic_sessions.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.academic_sessions.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.academic_sessions.date_last_modified |
items[].title |
text |
Yes |
Name or title of the academic session. |
oneroster.academic_sessions.title |
items[].type |
text |
Yes |
Calendar-window type for the academic session. Courses usually point at schoolYear, classes usually list term or semester rows, and gradebook reporting can use gradingPeriod. |
oneroster.academic_sessions.type |
items[].startDate |
date |
Yes |
Inclusive end date for the academic session. ISO 8601 format [ISO8601]. |
oneroster.academic_sessions.start_date |
items[].endDate |
date |
Yes |
Exclusive end date for the academic session. ISO 8601 format [ISO8601]. |
oneroster.academic_sessions.end_date |
items[].parentSourcedId |
text |
No |
SourcedId of the parent of this academic session. |
oneroster.academic_sessions.parent_sourced_id |
items[].schoolYear |
integer |
Yes |
The school year for which the academic session contributes. This year should be that in which the school year ends (Format is: YYYY). |
oneroster.academic_sessions.school_year |
oneroster.academic_sessions.get
Get one Academic Sessions record
Reads one tenant-scoped /academicSessions record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/academicSessions/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/academicSessions/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
oneroster.categories.get
Get one Categories record
Reads one tenant-scoped /categories record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/categories/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/categories/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One categories.csv record using OneRoster source field names and _platform metadata. |
oneroster.categories |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.categories |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.categories.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.categories.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this categories row. |
oneroster.categories.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.categories.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.categories.date_last_modified |
item.title |
text |
Yes |
The title assigned to the set of lineItems to denote its nature e.g. homework, essays, etc. |
oneroster.categories.title |
item.weight |
integer |
No |
Total weight of this grading category in calculation of course final score. This is a Percent value only, e.g. 80%. This is a new column added in version 1.2. |
oneroster.categories.weight |
oneroster.classes.get
Get one Classes record
Reads one tenant-scoped /classes record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/classes/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/classes/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One classes.csv record using OneRoster source field names and _platform metadata. |
oneroster.classes |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.classes |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.classes.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.classes.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this classes row. |
oneroster.classes.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.classes.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.classes.date_last_modified |
item.title |
text |
Yes |
Name of this class. |
oneroster.classes.title |
item.grades |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.classes.grades |
item.courseSourcedId |
text |
Yes |
SourcedId of the course of which this class is an instance. |
oneroster.classes.course_sourced_id |
item.classCode |
text |
No |
Human readable code used to help identify this class. |
oneroster.classes.class_code |
item.classType |
text |
Yes |
Class scheduling category. scheduled is an ordinary instructional section; homeroom is a homeroom grouping that may not carry the same course schedule semantics. |
oneroster.classes.class_type |
item.location |
text |
No |
Human readable description of where the class is physically located. |
oneroster.classes.location |
item.schoolSourcedId |
text |
Yes |
SourcedId of the Org that teaches this class of OrgType 'school'. |
oneroster.classes.school_sourced_id |
item.termSourcedIds |
text |
Yes |
SourcedIds of the terms (the academicSessions) in which the class is taught. |
oneroster.classes.term_sourced_ids |
item.subjects |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance.... |
oneroster.classes.subjects |
item.subjectCodes |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is pre... |
oneroster.classes.subject_codes |
item.periods |
text |
No |
The time slots in the day that the class will be given. If more than one period is needed, use double quotes, and separate with commas (per [RFC4180]). Examples: 1; "1,3,5" |
oneroster.classes.periods |
oneroster.class_resources.get
Get one Class Resources record
Reads one tenant-scoped /classResources record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/classResources/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/classResources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
oneroster.course_resources.get
Get one Course Resources record
Reads one tenant-scoped /courseResources record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/courseResources/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/courseResources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
oneroster.courses.get
Get one Courses record
Reads one tenant-scoped /courses record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/courses/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/courses/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One courses.csv record using OneRoster source field names and _platform metadata. |
oneroster.courses |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.courses |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.courses.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.courses.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this courses row. |
oneroster.courses.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.courses.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.courses.date_last_modified |
item.schoolYearSourcedId |
text |
No |
SourcedId of the associated AcademicSession with type of 'schoolYear'. |
oneroster.courses.school_year_sourced_id |
item.title |
text |
Yes |
Name of this course. |
oneroster.courses.title |
item.courseCode |
text |
No |
Human readable code used to help identify this course. |
oneroster.courses.course_code |
item.grades |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.courses.grades |
item.orgSourcedId |
text |
Yes |
SourcedId of an org to which this course belongs. |
oneroster.courses.org_sourced_id |
item.subjects |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance.... |
oneroster.courses.subjects |
item.subjectCodes |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is pre... |
oneroster.courses.subject_codes |
oneroster.demographics.get
Get one Demographics record
Reads one tenant-scoped /demographics record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/demographics/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/demographics/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One demographics.csv record using OneRoster source field names and _platform metadata. |
oneroster.demographics |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.demographics |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.demographics.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.demographics.import_batch_id |
item.sourcedId |
text |
Yes |
The user's sourcedId; in demographics.csv this is the same identifier as the user whose demographics are being described. |
oneroster.demographics.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.demographics.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.demographics.date_last_modified |
item.birthDate |
date |
No |
The date of birth. ISO 861 format: 'YYYY-MM-DD'. |
oneroster.demographics.birth_date |
item.sex |
text |
No |
Sex value reported by the source system for the user described by demographics.sourced_id. It is a sensitive demographic exchange field; unspecified preserves a deliberate source... |
oneroster.demographics.sex |
item.americanIndianOrAlaskaNative |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. This is one of several race indicators that may be true at the same time; it is... |
oneroster.demographics.american_indian_or_alaska_native |
item.asian |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It can be true alongside other race indicators, and consumers must treat it as... |
oneroster.demographics.asian |
item.blackOrAfricanAmerican |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is independent of the other race flags and may coexist with demographic_race... |
oneroster.demographics.black_or_african_american |
item.nativeHawaiianOrOtherPacificIslander |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It may be true alongside other race flags and must not be collapsed into a sing... |
oneroster.demographics.native_hawaiian_or_other_pacific_islander |
item.white |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is preserved exactly because downstream compliance reports often inspect eac... |
oneroster.demographics.white |
item.demographicRaceTwoOrMoreRaces |
text |
No |
OneRoster's explicit indicator that the source reports the user in two or more race categories. It should be true when the source asserts multi-race status; it does not erase the... |
oneroster.demographics.demographic_race_two_or_more_races |
item.hispanicOrLatinoEthnicity |
text |
No |
Ethnicity indicator reported by the source system for the user described by demographics.sourced_id. It is independent of race flags, may be true with any race combination, and is... |
oneroster.demographics.hispanic_or_latino_ethnicity |
item.countryOfBirthCode |
text |
No |
Country where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.country_of_birth_code |
item.stateOfBirthAbbreviation |
text |
No |
State where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.state_of_birth_abbreviation |
item.cityOfBirth |
text |
No |
City where the user was born. |
oneroster.demographics.city_of_birth |
item.publicSchoolResidenceStatus |
text |
No |
An indication of the location of the users legal residence relative to (within or outside) the boundaries of the public school attended and its administrative unit. The permitted... |
oneroster.demographics.public_school_residence_status |
oneroster.enrollments.get
Get one Enrollments record
Reads one tenant-scoped /enrollments record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/enrollments/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/enrollments/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One enrollments.csv record using OneRoster source field names and _platform metadata. |
oneroster.enrollments |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.enrollments |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.enrollments.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.enrollments.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this enrollments row. |
oneroster.enrollments.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.enrollments.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.enrollments.date_last_modified |
item.classSourcedId |
text |
Yes |
SourcedId of the Class. |
oneroster.enrollments.class_sourced_id |
item.schoolSourcedId |
text |
Yes |
SourcedId of an Org with type 'school'. |
oneroster.enrollments.school_sourced_id |
item.userSourcedId |
text |
Yes |
SourcedId of the User. |
oneroster.enrollments.user_sourced_id |
item.role |
text |
Yes |
The user's class-level membership role for this enrollment. It drives whether the row represents a learner, teacher, proctor, or administrator in active-enrollment queries and mus... |
oneroster.enrollments.role |
item.primary |
text |
No |
Teacher-primary marker for a class enrollment. It applies only when enrollments.role is teacher; true identifies the primary teacher for the class/date window, while student, proc... |
oneroster.enrollments.primary |
item.beginDate |
date |
No |
The start date for the enrollment (inclusive). This date must align with the associated academic session (term) identified in the class. |
oneroster.enrollments.begin_date |
item.endDate |
date |
No |
The end date for the enrollment (exclusive). This date must align with the associated academic session (term) identified for the class. |
oneroster.enrollments.end_date |
oneroster.line_item_learning_objective_ids.get
Get one Line Item Learning Objective IDs record
Reads one tenant-scoped /lineItemLearningObjectiveIds record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/lineItemLearningObjectiveIds/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/lineItemLearningObjectiveIds/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
oneroster.line_items.get
Get one Line Items record
Reads one tenant-scoped /lineItems record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/lineItems/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/lineItems/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
oneroster.line_item_score_scales.get
Get one Line Item Score Scales record
Reads one tenant-scoped /lineItemScoreScales record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/lineItemScoreScales/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/lineItemScoreScales/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
oneroster.orgs.get
Get one Organizations record
Reads one tenant-scoped /orgs record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/orgs/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/orgs/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One orgs.csv record using OneRoster source field names and _platform metadata. |
oneroster.orgs |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.orgs |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.orgs.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.orgs.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this orgs row. |
oneroster.orgs.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.orgs.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.orgs.date_last_modified |
item.name |
text |
Yes |
Name of the organization. |
oneroster.orgs.name |
item.type |
text |
Yes |
Organization classification that determines which references this org row can satisfy. school is the value required by classes.school_sourced_id, enrollments.school_sourced_id, an... |
oneroster.orgs.type |
item.identifier |
text |
No |
Human readable identifier for this org e.g. NCES ID. |
oneroster.orgs.identifier |
item.parentSourcedId |
text |
No |
SourcedId of an Org representing the Parent organization. |
oneroster.orgs.parent_sourced_id |
oneroster.resources.get
Get one Resources record
Reads one tenant-scoped /resources record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/resources/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/resources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One resources.csv record using OneRoster source field names and _platform metadata. |
oneroster.resources |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.resources |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.resources.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.resources.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this resources row. |
oneroster.resources.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.resources.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.resources.date_last_modified |
item.vendorResourceId |
text |
Yes |
Unique ID of this resource as allocated by the vendor. It is unique in the context of resource identifiers allocated by the vendor. |
oneroster.resources.vendor_resource_id |
item.title |
text |
No |
Name of this resource. |
oneroster.resources.title |
item.roles |
text |
No |
Audience roles for which a resource is intended. This is an enum list in one CSV cell, so several roles may receive the same resource without creating separate resource rows. |
oneroster.resources.roles |
item.importance |
text |
No |
Resource priority inside its class, course, or user context. primary marks the main resource mapping; secondary marks supporting material. |
oneroster.resources.importance |
item.vendorId |
text |
No |
Identifier of the vendor responsible for this resource. This unique ID will be assigned by 1EdTech during the OneRoster conformance process. |
oneroster.resources.vendor_id |
item.applicationId |
text |
No |
Identifier of the application associated with this resource. This identifier is assigned by the creator/vendor of the resource. |
oneroster.resources.application_id |
oneroster.result_learning_objective_ids.get
Get one Result Learning Objective IDs record
Reads one tenant-scoped /resultLearningObjectiveIds record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/resultLearningObjectiveIds/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/resultLearningObjectiveIds/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
oneroster.results.get
Get one Results record
Reads one tenant-scoped /results record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/results/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/results/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One results.csv record using OneRoster source field names and _platform metadata. |
oneroster.results |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.results |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.results.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.results.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this results row. |
oneroster.results.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.results.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.results.date_last_modified |
item.lineItemSourcedId |
text |
Yes |
Unique identifier of the lineItem. |
oneroster.results.line_item_sourced_id |
item.studentSourcedId |
text |
Yes |
Unique identifier of the student (user). References a record that is/was created in the users.csv file with type of 'student'. |
oneroster.results.student_sourced_id |
item.scoreStatus |
text |
Yes |
Gradebook result state for the student's line item. It tells consumers whether the result is submitted, graded, exempt, or still missing work. |
oneroster.results.score_status |
item.score |
double precision |
No |
Numeric result value for the student's line item. When present, it must resolve to exactly one same-tenant effective score scale before persistence and must stay consistent with l... |
oneroster.results.score |
item.scoreDate |
date |
Yes |
The date the result was submitted and/or the 'scoreStatus' was changed. |
oneroster.results.score_date |
item.comment |
text |
No |
Human readable comment about the result. |
oneroster.results.comment |
item.textScore |
text |
No |
Non-numeric gradebook value for the student's line item. When present, it must align with exactly one same-tenant effective score scale before persistence; a read-time hint cannot... |
oneroster.results.text_score |
item.classSourcedId |
text |
No |
Unique identifier of the class. References a record that is/was created in the classes.csv file. This is a new column added in version 1.2. |
oneroster.results.class_sourced_id |
item.inProgress |
text |
No |
Workflow flag that says assigned work is still in progress and a submitted work product is not expected yet. It affects gradebook interpretation, not row lifecycle. |
oneroster.results.in_progress |
item.incomplete |
text |
No |
Workflow flag that says submitted student work is present but incomplete. It can coexist with score_status values while the teacher resolves grading. |
oneroster.results.incomplete |
item.late |
text |
No |
Workflow flag that says the work was submitted after the due date or is otherwise past due. It may affect scoring policy but does not change the result row's tenant-scoped identit... |
oneroster.results.late |
item.missing |
text |
No |
Workflow flag that says expected work has not been submitted and is considered missing. It should not be inferred only from a blank score; the source must send the flag. |
oneroster.results.missing |
oneroster.result_score_scales.get
Get one Result Score Scales record
Reads one tenant-scoped /resultScoreScales record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/resultScoreScales/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/resultScoreScales/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
oneroster.roles.get
Get one Roles record
Reads one tenant-scoped /roles record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/roles/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/roles/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One roles.csv record using OneRoster source field names and _platform metadata. |
oneroster.roles |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.roles |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.roles.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.roles.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this roles row. |
oneroster.roles.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.roles.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.roles.date_last_modified |
item.userSourcedId |
text |
Yes |
The user whose role is being defined. |
oneroster.roles.user_sourced_id |
item.roleType |
text |
Yes |
Primary/secondary marker for a user's role inside one organization. Only one role per user/org should be primary for the same active date window. |
oneroster.roles.role_type |
item.role |
text |
Yes |
Organization-level role assigned to the user. It is separate from enrollments.role: this field says what the person is in an org, while enrollments.role says what they are in a cl... |
oneroster.roles.role |
item.beginDate |
date |
No |
The start date on which the role became active (inclusive). |
oneroster.roles.begin_date |
item.endDate |
date |
No |
The end date on which the role ceased to be active (exclusive). |
oneroster.roles.end_date |
item.orgSourcedId |
text |
Yes |
SourcedId of the Org within which the User has the assigned role. |
oneroster.roles.org_sourced_id |
item.userProfileSourcedId |
text |
No |
SourcedId of the UserProfile for the User. |
oneroster.roles.user_profile_sourced_id |
oneroster.score_scales.get
Get one Score Scales record
Reads one tenant-scoped /scoreScales record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/scoreScales/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/scoreScales/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
oneroster.user_profiles.get
Get one User Profiles record
Reads one tenant-scoped /userProfiles record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/userProfiles/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/userProfiles/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One userProfiles.csv record using OneRoster source field names and _platform metadata. |
oneroster.user_profiles |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.user_profiles |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.user_profiles.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.user_profiles.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this user profiles row. |
oneroster.user_profiles.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.user_profiles.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.user_profiles.date_last_modified |
item.userSourcedId |
text |
Yes |
Unique ID for the corresponding user. |
oneroster.user_profiles.user_sourced_id |
item.profileType |
text |
Yes |
The type of user profile. This should be a human readable label that has some significance in the context of the related system, app, tool, etc. |
oneroster.user_profiles.profile_type |
item.vendorId |
text |
Yes |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this user profile. |
oneroster.user_profiles.vendor_id |
item.applicationId |
text |
No |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this account. |
oneroster.user_profiles.application_id |
item.description |
text |
No |
A human readable description of the use of the account. This should not contain any security information for access to the account. |
oneroster.user_profiles.description |
item.credentialType |
text |
Yes |
The type of credentials for the user profile. This should be indicative of when this credential should be used. |
oneroster.user_profiles.credential_type |
item.username |
text |
Yes |
The username for this profile. |
oneroster.user_profiles.username |
item.password |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted, the processing system must be aware of the encryption method. |
oneroster.user_profiles.password |
oneroster.user_resources.get
Get one User Resources record
Reads one tenant-scoped /userResources record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/userResources/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/userResources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
oneroster.users.get
Get one Users record
Reads one tenant-scoped /users record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/users/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/users/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One users.csv record using OneRoster source field names and _platform metadata. |
oneroster.users |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.users |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.users.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.users.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this users row. |
oneroster.users.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.users.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.users.date_last_modified |
item.enabledUser |
text |
Yes |
Source-system account availability flag for the user row. true means the source considers the user enabled; false preserves the roster identity but tells platform3 not to treat th... |
oneroster.users.enabled_user |
item.username |
text |
Yes |
User name. |
oneroster.users.username |
item.userIds |
text |
No |
External machine-readable ID (e.g. LDAP id, LTI id) for this user. The ID must be accompanied by a type to indicate the nature of the Identifier. The Type and ID values are enclos... |
oneroster.users.user_ids |
item.givenName |
text |
Yes |
User's first name. |
oneroster.users.given_name |
item.familyName |
text |
Yes |
User's surname. |
oneroster.users.family_name |
item.middleName |
text |
No |
User's middle name(s). If more than one then they are separated by a space. |
oneroster.users.middle_name |
item.identifier |
text |
No |
Identifier for the user with a human readable meaning. |
oneroster.users.identifier |
item.email |
text |
No |
Email address for the User. |
oneroster.users.email |
item.sms |
text |
No |
SMS address for the User. |
oneroster.users.sms |
item.phone |
text |
No |
Phone number for the User. |
oneroster.users.phone |
item.agentSourcedIds |
text |
No |
SourcedIds of the Users to which this user has a relationship. If multiple IDs are required then use double quotes and separate with commas. Note: In most cases this will be for i... |
oneroster.users.agent_sourced_ids |
item.grades |
text |
No |
Grade(s) for which a user with role 'student' is enrolled. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.users.grades |
item.password |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted the processing system must be aware of the encryption method. |
oneroster.users.password |
item.userMasterIdentifier |
text |
No |
The master identifier that could be used to provide globally unique identification of the user across all of the tools, systems, apps, etc. available/accessed by the user. This is... |
oneroster.users.user_master_identifier |
item.preferredGivenName |
text |
No |
The given name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_given_name |
item.preferredMiddleName |
text |
No |
The middle names by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_middle_name |
item.preferredFamilyName |
text |
No |
The family name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_family_name |
item.primaryOrgSourcedId |
text |
No |
The sourcedId of the primary 'org' for the 'user'. In OR 1.2 a user can have one or more 'roles' in one or more 'org's and so this field can be used for identification of the prim... |
oneroster.users.primary_org_sourced_id |
item.pronouns |
text |
No |
The pronoun(s) by which this person is referenced. Examples (in the case of English) include 'she/her/hers', 'he/him/his', 'they/them/theirs', 'ze/hir/hir', 'xe/xir', or a stateme... |
oneroster.users.pronouns |
oneroster.grading_periods.get
Get one Grading Periods record
Reads one tenant-scoped /gradingPeriods record by OneRoster sourcedId and returns an ETag for later If-Match writes.
#
- Method
GET
- Path
/gradingPeriods/{sourcedId}
- Auth
- Bearer JWT with matching tenant_id and relationship scope
- Status
- 200401403404429
Trace: OITD-001 OITD-007 OITD-010 OITD-102 OITD-104 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -i -fsS "$BASE_URL/gradingPeriods/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId for this collection. |
OITD-102 |
oneroster.schools.classes.list
List classes for a school
Alias for school-oriented clients; returns classes whose school sourcedId matches the supplied school org.
#
- Method
GET
- Path
/schools/{sourcedId}/classes
- Auth
- Bearer JWT with matching tenant_id and relationship-scoped claims
- Status
- 200400401403404429
Trace: OITD-010 OITD-102 OITD-103 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -fsS "$BASE_URL/schools/$RESOURCE_ID/classes" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped parent school org sourcedId. |
OITD-102 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from classes.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.classes |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.classes |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.classes.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.classes.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this classes row. |
oneroster.classes.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.classes.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.classes.date_last_modified |
items[].title |
text |
Yes |
Name of this class. |
oneroster.classes.title |
items[].grades |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.classes.grades |
items[].courseSourcedId |
text |
Yes |
SourcedId of the course of which this class is an instance. |
oneroster.classes.course_sourced_id |
items[].classCode |
text |
No |
Human readable code used to help identify this class. |
oneroster.classes.class_code |
items[].classType |
text |
Yes |
Class scheduling category. scheduled is an ordinary instructional section; homeroom is a homeroom grouping that may not carry the same course schedule semantics. |
oneroster.classes.class_type |
items[].location |
text |
No |
Human readable description of where the class is physically located. |
oneroster.classes.location |
items[].schoolSourcedId |
text |
Yes |
SourcedId of the Org that teaches this class of OrgType 'school'. |
oneroster.classes.school_sourced_id |
items[].termSourcedIds |
text |
Yes |
SourcedIds of the terms (the academicSessions) in which the class is taught. |
oneroster.classes.term_sourced_ids |
items[].subjects |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance.... |
oneroster.classes.subjects |
items[].subjectCodes |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is pre... |
oneroster.classes.subject_codes |
items[].periods |
text |
No |
The time slots in the day that the class will be given. If more than one period is needed, use double quotes, and separate with commas (per [RFC4180]). Examples: 1; "1,3,5" |
oneroster.classes.periods |
oneroster.orgs.classes.list
List classes for a school organization
Returns classes whose school or owning organization matches the supplied org sourcedId.
#
- Method
GET
- Path
/orgs/{sourcedId}/classes
- Auth
- Bearer JWT with matching tenant_id and relationship-scoped claims
- Status
- 200400401403404429
Trace: OITD-010 OITD-102 OITD-103 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -fsS "$BASE_URL/orgs/$RESOURCE_ID/classes" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped parent school org sourcedId. |
OITD-102 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from classes.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.classes |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.classes |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.classes.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.classes.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this classes row. |
oneroster.classes.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.classes.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.classes.date_last_modified |
items[].title |
text |
Yes |
Name of this class. |
oneroster.classes.title |
items[].grades |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.classes.grades |
items[].courseSourcedId |
text |
Yes |
SourcedId of the course of which this class is an instance. |
oneroster.classes.course_sourced_id |
items[].classCode |
text |
No |
Human readable code used to help identify this class. |
oneroster.classes.class_code |
items[].classType |
text |
Yes |
Class scheduling category. scheduled is an ordinary instructional section; homeroom is a homeroom grouping that may not carry the same course schedule semantics. |
oneroster.classes.class_type |
items[].location |
text |
No |
Human readable description of where the class is physically located. |
oneroster.classes.location |
items[].schoolSourcedId |
text |
Yes |
SourcedId of the Org that teaches this class of OrgType 'school'. |
oneroster.classes.school_sourced_id |
items[].termSourcedIds |
text |
Yes |
SourcedIds of the terms (the academicSessions) in which the class is taught. |
oneroster.classes.term_sourced_ids |
items[].subjects |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance.... |
oneroster.classes.subjects |
items[].subjectCodes |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is pre... |
oneroster.classes.subject_codes |
items[].periods |
text |
No |
The time slots in the day that the class will be given. If more than one period is needed, use double quotes, and separate with commas (per [RFC4180]). Examples: 1; "1,3,5" |
oneroster.classes.periods |
oneroster.classes.students.list
List students in a class
Returns users with student enrollments in the supplied class.
#
- Method
GET
- Path
/classes/{sourcedId}/students
- Auth
- Bearer JWT with matching tenant_id and relationship-scoped claims
- Status
- 200400401403404429
Trace: OITD-010 OITD-102 OITD-103 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -fsS "$BASE_URL/classes/$RESOURCE_ID/students" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped parent class sourcedId. |
OITD-102 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from users.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.users |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.users |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.users.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.users.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this users row. |
oneroster.users.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.users.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.users.date_last_modified |
items[].enabledUser |
text |
Yes |
Source-system account availability flag for the user row. true means the source considers the user enabled; false preserves the roster identity but tells platform3 not to treat th... |
oneroster.users.enabled_user |
items[].username |
text |
Yes |
User name. |
oneroster.users.username |
items[].userIds |
text |
No |
External machine-readable ID (e.g. LDAP id, LTI id) for this user. The ID must be accompanied by a type to indicate the nature of the Identifier. The Type and ID values are enclos... |
oneroster.users.user_ids |
items[].givenName |
text |
Yes |
User's first name. |
oneroster.users.given_name |
items[].familyName |
text |
Yes |
User's surname. |
oneroster.users.family_name |
items[].middleName |
text |
No |
User's middle name(s). If more than one then they are separated by a space. |
oneroster.users.middle_name |
items[].identifier |
text |
No |
Identifier for the user with a human readable meaning. |
oneroster.users.identifier |
items[].email |
text |
No |
Email address for the User. |
oneroster.users.email |
items[].sms |
text |
No |
SMS address for the User. |
oneroster.users.sms |
items[].phone |
text |
No |
Phone number for the User. |
oneroster.users.phone |
items[].agentSourcedIds |
text |
No |
SourcedIds of the Users to which this user has a relationship. If multiple IDs are required then use double quotes and separate with commas. Note: In most cases this will be for i... |
oneroster.users.agent_sourced_ids |
items[].grades |
text |
No |
Grade(s) for which a user with role 'student' is enrolled. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.users.grades |
items[].password |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted the processing system must be aware of the encryption method. |
oneroster.users.password |
items[].userMasterIdentifier |
text |
No |
The master identifier that could be used to provide globally unique identification of the user across all of the tools, systems, apps, etc. available/accessed by the user. This is... |
oneroster.users.user_master_identifier |
items[].preferredGivenName |
text |
No |
The given name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_given_name |
items[].preferredMiddleName |
text |
No |
The middle names by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_middle_name |
items[].preferredFamilyName |
text |
No |
The family name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_family_name |
items[].primaryOrgSourcedId |
text |
No |
The sourcedId of the primary 'org' for the 'user'. In OR 1.2 a user can have one or more 'roles' in one or more 'org's and so this field can be used for identification of the prim... |
oneroster.users.primary_org_sourced_id |
items[].pronouns |
text |
No |
The pronoun(s) by which this person is referenced. Examples (in the case of English) include 'she/her/hers', 'he/him/his', 'they/them/theirs', 'ze/hir/hir', 'xe/xir', or a stateme... |
oneroster.users.pronouns |
oneroster.classes.line_items.list
List line items for a class
Returns gradebook line items attached to the supplied class.
#
- Method
GET
- Path
/classes/{sourcedId}/lineItems
- Auth
- Bearer JWT with matching tenant_id and relationship-scoped claims
- Status
- 200400401403404429
Trace: OITD-010 OITD-102 OITD-103 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -fsS "$BASE_URL/classes/$RESOURCE_ID/lineItems" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped parent class sourcedId. |
OITD-102 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
oneroster.users.enrollments.list
List enrollments for a user
Returns enrollments where the supplied user is the enrolled person.
#
- Method
GET
- Path
/users/{sourcedId}/enrollments
- Auth
- Bearer JWT with matching tenant_id and relationship-scoped claims
- Status
- 200400401403404429
Trace: OITD-010 OITD-102 OITD-103 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -fsS "$BASE_URL/users/$RESOURCE_ID/enrollments" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped parent user sourcedId. |
OITD-102 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from enrollments.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.enrollments |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.enrollments |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.enrollments.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.enrollments.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this enrollments row. |
oneroster.enrollments.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.enrollments.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.enrollments.date_last_modified |
items[].classSourcedId |
text |
Yes |
SourcedId of the Class. |
oneroster.enrollments.class_sourced_id |
items[].schoolSourcedId |
text |
Yes |
SourcedId of an Org with type 'school'. |
oneroster.enrollments.school_sourced_id |
items[].userSourcedId |
text |
Yes |
SourcedId of the User. |
oneroster.enrollments.user_sourced_id |
items[].role |
text |
Yes |
The user's class-level membership role for this enrollment. It drives whether the row represents a learner, teacher, proctor, or administrator in active-enrollment queries and mus... |
oneroster.enrollments.role |
items[].primary |
text |
No |
Teacher-primary marker for a class enrollment. It applies only when enrollments.role is teacher; true identifies the primary teacher for the class/date window, while student, proc... |
oneroster.enrollments.primary |
items[].beginDate |
date |
No |
The start date for the enrollment (inclusive). This date must align with the associated academic session (term) identified in the class. |
oneroster.enrollments.begin_date |
items[].endDate |
date |
No |
The end date for the enrollment (exclusive). This date must align with the associated academic session (term) identified for the class. |
oneroster.enrollments.end_date |
oneroster.users.results.list
List results for a user
Returns gradebook results visible for the supplied user.
#
- Method
GET
- Path
/users/{sourcedId}/results
- Auth
- Bearer JWT with matching tenant_id and relationship-scoped claims
- Status
- 200400401403404429
Trace: OITD-010 OITD-102 OITD-103 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -fsS "$BASE_URL/users/$RESOURCE_ID/results" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped parent user sourcedId. |
OITD-102 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from results.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.results |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.results |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.results.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.results.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this results row. |
oneroster.results.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.results.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.results.date_last_modified |
items[].lineItemSourcedId |
text |
Yes |
Unique identifier of the lineItem. |
oneroster.results.line_item_sourced_id |
items[].studentSourcedId |
text |
Yes |
Unique identifier of the student (user). References a record that is/was created in the users.csv file with type of 'student'. |
oneroster.results.student_sourced_id |
items[].scoreStatus |
text |
Yes |
Gradebook result state for the student's line item. It tells consumers whether the result is submitted, graded, exempt, or still missing work. |
oneroster.results.score_status |
items[].score |
double precision |
No |
Numeric result value for the student's line item. When present, it must resolve to exactly one same-tenant effective score scale before persistence and must stay consistent with l... |
oneroster.results.score |
items[].scoreDate |
date |
Yes |
The date the result was submitted and/or the 'scoreStatus' was changed. |
oneroster.results.score_date |
items[].comment |
text |
No |
Human readable comment about the result. |
oneroster.results.comment |
items[].textScore |
text |
No |
Non-numeric gradebook value for the student's line item. When present, it must align with exactly one same-tenant effective score scale before persistence; a read-time hint cannot... |
oneroster.results.text_score |
items[].classSourcedId |
text |
No |
Unique identifier of the class. References a record that is/was created in the classes.csv file. This is a new column added in version 1.2. |
oneroster.results.class_sourced_id |
items[].inProgress |
text |
No |
Workflow flag that says assigned work is still in progress and a submitted work product is not expected yet. It affects gradebook interpretation, not row lifecycle. |
oneroster.results.in_progress |
items[].incomplete |
text |
No |
Workflow flag that says submitted student work is present but incomplete. It can coexist with score_status values while the teacher resolves grading. |
oneroster.results.incomplete |
items[].late |
text |
No |
Workflow flag that says the work was submitted after the due date or is otherwise past due. It may affect scoring policy but does not change the result row's tenant-scoped identit... |
oneroster.results.late |
items[].missing |
text |
No |
Workflow flag that says expected work has not been submitted and is considered missing. It should not be inferred only from a blank score; the source must send the flag. |
oneroster.results.missing |
oneroster.students.results.list
List results for a student
Alias for student-oriented clients; returns gradebook results visible for the supplied student user.
#
- Method
GET
- Path
/students/{sourcedId}/results
- Auth
- Bearer JWT with matching tenant_id and relationship-scoped claims
- Status
- 200400401403404429
Trace: OITD-010 OITD-102 OITD-103 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
curl -fsS "$BASE_URL/students/$RESOURCE_ID/results" \
-H "Authorization: Bearer $TOKEN"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped parent student user sourcedId. |
OITD-102 |
filter |
Query |
string |
No |
Narrows a list endpoint to documented field comparisons. Unsupported fields or operators return a typed 400 Problem rather than being ignored. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
sort |
Query |
string |
No |
Orders a list endpoint by documented sortable fields. Unsupported sort fields return a typed 400 Problem. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
limit |
Query |
integer |
No |
Caps the number of returned rows. Must be positive and within the published maximum for the endpoint. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
cursor |
Query |
opaque string |
No |
Continues a paged list from the server-provided continuation token. Client code must treat the value as opaque and tenant-scoped. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
modifiedSince |
Query |
ISO 8601 DateTime |
No |
Requests rows changed after the supplied instant for polling-based sync. Invalid timestamps return a typed 400 Problem; this is the shipped sync primitive instead of webhooks. Current live: Current live deployment: list query validation is fail-loud. Unknown query parameters return a 400 Problem with code oneroster:unsupported_parameter; invalid filter, sort, limit, cursor, or modifiedSince controls return a 400 Problem with code oneroster:validation_failed. |
OITD-103-QUERY-MODEL |
Response schema
| Field | Type | Required | Description | Trace |
items[] |
array<object> |
Yes |
Rows from results.csv projected with OneRoster field names and platform metadata kept visibly separate. |
oneroster.results |
count |
integer |
Yes |
Total number of rows matching tenant scope and supported query controls before any limit page is cut. |
OITD-103 |
links.next |
string |
No |
Continuation link present only when a limit page has more matching rows. Treat the cursor as opaque and tenant-scoped. |
OITD-103 |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.results |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
items[]._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.results.tenant_id |
items[]._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.results.import_batch_id |
items[].sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this results row. |
oneroster.results.sourced_id |
items[].status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.results.status |
items[].dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.results.date_last_modified |
items[].lineItemSourcedId |
text |
Yes |
Unique identifier of the lineItem. |
oneroster.results.line_item_sourced_id |
items[].studentSourcedId |
text |
Yes |
Unique identifier of the student (user). References a record that is/was created in the users.csv file with type of 'student'. |
oneroster.results.student_sourced_id |
items[].scoreStatus |
text |
Yes |
Gradebook result state for the student's line item. It tells consumers whether the result is submitted, graded, exempt, or still missing work. |
oneroster.results.score_status |
items[].score |
double precision |
No |
Numeric result value for the student's line item. When present, it must resolve to exactly one same-tenant effective score scale before persistence and must stay consistent with l... |
oneroster.results.score |
items[].scoreDate |
date |
Yes |
The date the result was submitted and/or the 'scoreStatus' was changed. |
oneroster.results.score_date |
items[].comment |
text |
No |
Human readable comment about the result. |
oneroster.results.comment |
items[].textScore |
text |
No |
Non-numeric gradebook value for the student's line item. When present, it must align with exactly one same-tenant effective score scale before persistence; a read-time hint cannot... |
oneroster.results.text_score |
items[].classSourcedId |
text |
No |
Unique identifier of the class. References a record that is/was created in the classes.csv file. This is a new column added in version 1.2. |
oneroster.results.class_sourced_id |
items[].inProgress |
text |
No |
Workflow flag that says assigned work is still in progress and a submitted work product is not expected yet. It affects gradebook interpretation, not row lifecycle. |
oneroster.results.in_progress |
items[].incomplete |
text |
No |
Workflow flag that says submitted student work is present but incomplete. It can coexist with score_status values while the teacher resolves grading. |
oneroster.results.incomplete |
items[].late |
text |
No |
Workflow flag that says the work was submitted after the due date or is otherwise past due. It may affect scoring policy but does not change the result row's tenant-scoped identit... |
oneroster.results.late |
items[].missing |
text |
No |
Workflow flag that says expected work has not been submitted and is considered missing. It should not be inferred only from a blank score; the source must send the flag. |
oneroster.results.missing |
oneroster.academic_sessions.create
Create a Academic Sessions record
Creates one /academicSessions resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/academicSessions
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/academicSessions" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-academic-sessions-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this academic sessions row. |
oneroster.academic_sessions.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.academic_sessions.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.academic_sessions.date_last_modified |
title |
Body |
text |
Yes |
Name or title of the academic session. |
oneroster.academic_sessions.title |
type |
Body |
text |
Yes |
Calendar-window type for the academic session. Courses usually point at schoolYear, classes usually list term or semester rows, and gradebook reporting can use gradingPeriod. |
oneroster.academic_sessions.type |
startDate |
Body |
date |
Yes |
Inclusive end date for the academic session. ISO 8601 format [ISO8601]. |
oneroster.academic_sessions.start_date |
endDate |
Body |
date |
Yes |
Exclusive end date for the academic session. ISO 8601 format [ISO8601]. |
oneroster.academic_sessions.end_date |
parentSourcedId |
Body |
text |
No |
SourcedId of the parent of this academic session. |
oneroster.academic_sessions.parent_sourced_id |
schoolYear |
Body |
integer |
Yes |
The school year for which the academic session contributes. This year should be that in which the school year ends (Format is: YYYY). |
oneroster.academic_sessions.school_year |
oneroster.categories.create
Create a Categories record
Creates one /categories resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/categories
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/categories" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-categories-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this categories row. |
oneroster.categories.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.categories.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.categories.date_last_modified |
title |
Body |
text |
Yes |
The title assigned to the set of lineItems to denote its nature e.g. homework, essays, etc. |
oneroster.categories.title |
weight |
Body |
integer |
No |
Total weight of this grading category in calculation of course final score. This is a Percent value only, e.g. 80%. This is a new column added in version 1.2. |
oneroster.categories.weight |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One categories.csv record using OneRoster source field names and _platform metadata. |
oneroster.categories |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.categories |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.categories.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.categories.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this categories row. |
oneroster.categories.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.categories.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.categories.date_last_modified |
item.title |
text |
Yes |
The title assigned to the set of lineItems to denote its nature e.g. homework, essays, etc. |
oneroster.categories.title |
item.weight |
integer |
No |
Total weight of this grading category in calculation of course final score. This is a Percent value only, e.g. 80%. This is a new column added in version 1.2. |
oneroster.categories.weight |
oneroster.classes.create
Create a Classes record
Creates one /classes resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/classes
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/classes" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-classes-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this classes row. |
oneroster.classes.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.classes.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.classes.date_last_modified |
title |
Body |
text |
Yes |
Name of this class. |
oneroster.classes.title |
grades |
Body |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.classes.grades |
courseSourcedId |
Body |
text |
Yes |
SourcedId of the course of which this class is an instance. |
oneroster.classes.course_sourced_id |
classCode |
Body |
text |
No |
Human readable code used to help identify this class. |
oneroster.classes.class_code |
classType |
Body |
text |
Yes |
Class scheduling category. scheduled is an ordinary instructional section; homeroom is a homeroom grouping that may not carry the same course schedule semantics. |
oneroster.classes.class_type |
location |
Body |
text |
No |
Human readable description of where the class is physically located. |
oneroster.classes.location |
schoolSourcedId |
Body |
text |
Yes |
SourcedId of the Org that teaches this class of OrgType 'school'. |
oneroster.classes.school_sourced_id |
termSourcedIds |
Body |
text |
Yes |
SourcedIds of the terms (the academicSessions) in which the class is taught. |
oneroster.classes.term_sourced_ids |
subjects |
Body |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance. The permit... |
oneroster.classes.subjects |
subjectCodes |
Body |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is present the t... |
oneroster.classes.subject_codes |
periods |
Body |
text |
No |
The time slots in the day that the class will be given. If more than one period is needed, use double quotes, and separate with commas (per [RFC4180]). Examples: 1; "1,3,5" |
oneroster.classes.periods |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One classes.csv record using OneRoster source field names and _platform metadata. |
oneroster.classes |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.classes |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.classes.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.classes.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this classes row. |
oneroster.classes.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.classes.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.classes.date_last_modified |
item.title |
text |
Yes |
Name of this class. |
oneroster.classes.title |
item.grades |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.classes.grades |
item.courseSourcedId |
text |
Yes |
SourcedId of the course of which this class is an instance. |
oneroster.classes.course_sourced_id |
item.classCode |
text |
No |
Human readable code used to help identify this class. |
oneroster.classes.class_code |
item.classType |
text |
Yes |
Class scheduling category. scheduled is an ordinary instructional section; homeroom is a homeroom grouping that may not carry the same course schedule semantics. |
oneroster.classes.class_type |
item.location |
text |
No |
Human readable description of where the class is physically located. |
oneroster.classes.location |
item.schoolSourcedId |
text |
Yes |
SourcedId of the Org that teaches this class of OrgType 'school'. |
oneroster.classes.school_sourced_id |
item.termSourcedIds |
text |
Yes |
SourcedIds of the terms (the academicSessions) in which the class is taught. |
oneroster.classes.term_sourced_ids |
item.subjects |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance.... |
oneroster.classes.subjects |
item.subjectCodes |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is pre... |
oneroster.classes.subject_codes |
item.periods |
text |
No |
The time slots in the day that the class will be given. If more than one period is needed, use double quotes, and separate with commas (per [RFC4180]). Examples: 1; "1,3,5" |
oneroster.classes.periods |
oneroster.class_resources.create
Create a Class Resources record
Creates one /classResources resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/classResources
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/classResources" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-class-resources-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this class resources row. |
oneroster.class_resources.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.class_resources.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.class_resources.date_last_modified |
title |
Body |
text |
No |
Name of the related class. |
oneroster.class_resources.title |
classSourcedId |
Body |
text |
Yes |
SourcedId of the reference Class. |
oneroster.class_resources.class_sourced_id |
resourceSourcedId |
Body |
text |
Yes |
SourcedId of the Resource associated with the Class. |
oneroster.class_resources.resource_sourced_id |
oneroster.course_resources.create
Create a Course Resources record
Creates one /courseResources resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/courseResources
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/courseResources" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-course-resources-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this course resources row. |
oneroster.course_resources.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.course_resources.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.course_resources.date_last_modified |
title |
Body |
text |
No |
Name of the related class. |
oneroster.course_resources.title |
courseSourcedId |
Body |
text |
Yes |
SourcedId of the reference Course. |
oneroster.course_resources.course_sourced_id |
resourceSourcedId |
Body |
text |
Yes |
SourcedId of the Resource associated with the Course. |
oneroster.course_resources.resource_sourced_id |
oneroster.courses.create
Create a Courses record
Creates one /courses resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/courses
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/courses" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-courses-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this courses row. |
oneroster.courses.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.courses.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.courses.date_last_modified |
schoolYearSourcedId |
Body |
text |
No |
SourcedId of the associated AcademicSession with type of 'schoolYear'. |
oneroster.courses.school_year_sourced_id |
title |
Body |
text |
Yes |
Name of this course. |
oneroster.courses.title |
courseCode |
Body |
text |
No |
Human readable code used to help identify this course. |
oneroster.courses.course_code |
grades |
Body |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.courses.grades |
orgSourcedId |
Body |
text |
Yes |
SourcedId of an org to which this course belongs. |
oneroster.courses.org_sourced_id |
subjects |
Body |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance. The permit... |
oneroster.courses.subjects |
subjectCodes |
Body |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is present the t... |
oneroster.courses.subject_codes |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One courses.csv record using OneRoster source field names and _platform metadata. |
oneroster.courses |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.courses |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.courses.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.courses.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this courses row. |
oneroster.courses.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.courses.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.courses.date_last_modified |
item.schoolYearSourcedId |
text |
No |
SourcedId of the associated AcademicSession with type of 'schoolYear'. |
oneroster.courses.school_year_sourced_id |
item.title |
text |
Yes |
Name of this course. |
oneroster.courses.title |
item.courseCode |
text |
No |
Human readable code used to help identify this course. |
oneroster.courses.course_code |
item.grades |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.courses.grades |
item.orgSourcedId |
text |
Yes |
SourcedId of an org to which this course belongs. |
oneroster.courses.org_sourced_id |
item.subjects |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance.... |
oneroster.courses.subjects |
item.subjectCodes |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is pre... |
oneroster.courses.subject_codes |
oneroster.demographics.create
Create a Demographics record
Creates one /demographics resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/demographics
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/demographics" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-demographics-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
The user's sourcedId; in demographics.csv this is the same identifier as the user whose demographics are being described. |
oneroster.demographics.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.demographics.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.demographics.date_last_modified |
birthDate |
Body |
date |
No |
The date of birth. ISO 861 format: 'YYYY-MM-DD'. |
oneroster.demographics.birth_date |
sex |
Body |
text |
No |
Sex value reported by the source system for the user described by demographics.sourced_id. It is a sensitive demographic exchange field; unspecified preserves a deliberate source value rath... |
oneroster.demographics.sex |
americanIndianOrAlaskaNative |
Body |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. This is one of several race indicators that may be true at the same time; it is demograph... |
oneroster.demographics.american_indian_or_alaska_native |
asian |
Body |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It can be true alongside other race indicators, and consumers must treat it as sensitive... |
oneroster.demographics.asian |
blackOrAfricanAmerican |
Body |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is independent of the other race flags and may coexist with demographic_race_two_or_mo... |
oneroster.demographics.black_or_african_american |
nativeHawaiianOrOtherPacificIslander |
Body |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It may be true alongside other race flags and must not be collapsed into a single display... |
oneroster.demographics.native_hawaiian_or_other_pacific_islander |
white |
Body |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is preserved exactly because downstream compliance reports often inspect each race cat... |
oneroster.demographics.white |
demographicRaceTwoOrMoreRaces |
Body |
text |
No |
OneRoster's explicit indicator that the source reports the user in two or more race categories. It should be true when the source asserts multi-race status; it does not erase the individual... |
oneroster.demographics.demographic_race_two_or_more_races |
hispanicOrLatinoEthnicity |
Body |
text |
No |
Ethnicity indicator reported by the source system for the user described by demographics.sourced_id. It is independent of race flags, may be true with any race combination, and is high-risk... |
oneroster.demographics.hispanic_or_latino_ethnicity |
countryOfBirthCode |
Body |
text |
No |
Country where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.country_of_birth_code |
stateOfBirthAbbreviation |
Body |
text |
No |
State where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.state_of_birth_abbreviation |
cityOfBirth |
Body |
text |
No |
City where the user was born. |
oneroster.demographics.city_of_birth |
publicSchoolResidenceStatus |
Body |
text |
No |
An indication of the location of the users legal residence relative to (within or outside) the boundaries of the public school attended and its administrative unit. The permitted vocabulary... |
oneroster.demographics.public_school_residence_status |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One demographics.csv record using OneRoster source field names and _platform metadata. |
oneroster.demographics |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.demographics |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.demographics.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.demographics.import_batch_id |
item.sourcedId |
text |
Yes |
The user's sourcedId; in demographics.csv this is the same identifier as the user whose demographics are being described. |
oneroster.demographics.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.demographics.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.demographics.date_last_modified |
item.birthDate |
date |
No |
The date of birth. ISO 861 format: 'YYYY-MM-DD'. |
oneroster.demographics.birth_date |
item.sex |
text |
No |
Sex value reported by the source system for the user described by demographics.sourced_id. It is a sensitive demographic exchange field; unspecified preserves a deliberate source... |
oneroster.demographics.sex |
item.americanIndianOrAlaskaNative |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. This is one of several race indicators that may be true at the same time; it is... |
oneroster.demographics.american_indian_or_alaska_native |
item.asian |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It can be true alongside other race indicators, and consumers must treat it as... |
oneroster.demographics.asian |
item.blackOrAfricanAmerican |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is independent of the other race flags and may coexist with demographic_race... |
oneroster.demographics.black_or_african_american |
item.nativeHawaiianOrOtherPacificIslander |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It may be true alongside other race flags and must not be collapsed into a sing... |
oneroster.demographics.native_hawaiian_or_other_pacific_islander |
item.white |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is preserved exactly because downstream compliance reports often inspect eac... |
oneroster.demographics.white |
item.demographicRaceTwoOrMoreRaces |
text |
No |
OneRoster's explicit indicator that the source reports the user in two or more race categories. It should be true when the source asserts multi-race status; it does not erase the... |
oneroster.demographics.demographic_race_two_or_more_races |
item.hispanicOrLatinoEthnicity |
text |
No |
Ethnicity indicator reported by the source system for the user described by demographics.sourced_id. It is independent of race flags, may be true with any race combination, and is... |
oneroster.demographics.hispanic_or_latino_ethnicity |
item.countryOfBirthCode |
text |
No |
Country where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.country_of_birth_code |
item.stateOfBirthAbbreviation |
text |
No |
State where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.state_of_birth_abbreviation |
item.cityOfBirth |
text |
No |
City where the user was born. |
oneroster.demographics.city_of_birth |
item.publicSchoolResidenceStatus |
text |
No |
An indication of the location of the users legal residence relative to (within or outside) the boundaries of the public school attended and its administrative unit. The permitted... |
oneroster.demographics.public_school_residence_status |
oneroster.enrollments.create
Create a Enrollments record
Creates one /enrollments resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/enrollments
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/enrollments" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-enrollments-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this enrollments row. |
oneroster.enrollments.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.enrollments.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.enrollments.date_last_modified |
classSourcedId |
Body |
text |
Yes |
SourcedId of the Class. |
oneroster.enrollments.class_sourced_id |
schoolSourcedId |
Body |
text |
Yes |
SourcedId of an Org with type 'school'. |
oneroster.enrollments.school_sourced_id |
userSourcedId |
Body |
text |
Yes |
SourcedId of the User. |
oneroster.enrollments.user_sourced_id |
role |
Body |
text |
Yes |
The user's class-level membership role for this enrollment. It drives whether the row represents a learner, teacher, proctor, or administrator in active-enrollment queries and must match th... |
oneroster.enrollments.role |
primary |
Body |
text |
No |
Teacher-primary marker for a class enrollment. It applies only when enrollments.role is teacher; true identifies the primary teacher for the class/date window, while student, proctor, and a... |
oneroster.enrollments.primary |
beginDate |
Body |
date |
No |
The start date for the enrollment (inclusive). This date must align with the associated academic session (term) identified in the class. |
oneroster.enrollments.begin_date |
endDate |
Body |
date |
No |
The end date for the enrollment (exclusive). This date must align with the associated academic session (term) identified for the class. |
oneroster.enrollments.end_date |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One enrollments.csv record using OneRoster source field names and _platform metadata. |
oneroster.enrollments |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.enrollments |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.enrollments.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.enrollments.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this enrollments row. |
oneroster.enrollments.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.enrollments.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.enrollments.date_last_modified |
item.classSourcedId |
text |
Yes |
SourcedId of the Class. |
oneroster.enrollments.class_sourced_id |
item.schoolSourcedId |
text |
Yes |
SourcedId of an Org with type 'school'. |
oneroster.enrollments.school_sourced_id |
item.userSourcedId |
text |
Yes |
SourcedId of the User. |
oneroster.enrollments.user_sourced_id |
item.role |
text |
Yes |
The user's class-level membership role for this enrollment. It drives whether the row represents a learner, teacher, proctor, or administrator in active-enrollment queries and mus... |
oneroster.enrollments.role |
item.primary |
text |
No |
Teacher-primary marker for a class enrollment. It applies only when enrollments.role is teacher; true identifies the primary teacher for the class/date window, while student, proc... |
oneroster.enrollments.primary |
item.beginDate |
date |
No |
The start date for the enrollment (inclusive). This date must align with the associated academic session (term) identified in the class. |
oneroster.enrollments.begin_date |
item.endDate |
date |
No |
The end date for the enrollment (exclusive). This date must align with the associated academic session (term) identified for the class. |
oneroster.enrollments.end_date |
oneroster.line_item_learning_objective_ids.create
Create a Line Item Learning Objective IDs record
Creates one /lineItemLearningObjectiveIds resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/lineItemLearningObjectiveIds
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/lineItemLearningObjectiveIds" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-line-item-learning-objective-ids-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this line item learning objective ids row. |
oneroster.line_item_learning_objective_ids.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.line_item_learning_objective_ids.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.line_item_learning_objective_ids.date_last_modified |
lineItemSourcedId |
Body |
text |
Yes |
SourcedId of the parent LineItem for this learning objective. |
oneroster.line_item_learning_objective_ids.line_item_sourced_id |
source |
Body |
text |
Yes |
Vocabulary source for the learning objective identifier attached to a line item. case means the identifier should validate as an IMS CASE identifier; unknown preserves a sender value whose... |
oneroster.line_item_learning_objective_ids.source |
learningObjectiveId |
Body |
text |
Yes |
Unique identifier for the associated learning objective. If an 1EdTech CASE identifier then it MUST be a valid UUID URN. |
oneroster.line_item_learning_objective_ids.learning_objective_id |
oneroster.line_items.create
Create a Line Items record
Creates one /lineItems resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/lineItems
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/lineItems" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-line-items-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this line items row. |
oneroster.line_items.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.line_items.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.line_items.date_last_modified |
title |
Body |
text |
Yes |
The title assigned to the lineItem. |
oneroster.line_items.title |
description |
Body |
text |
No |
Short description of the role of the lineItem. |
oneroster.line_items.description |
assignDate |
Body |
date |
Yes |
Date the associated activity was assigned. |
oneroster.line_items.assign_date |
dueDate |
Body |
date |
Yes |
Date the associated activity is due to be completed. |
oneroster.line_items.due_date |
classSourcedId |
Body |
text |
Yes |
SourcedId of the Class. |
oneroster.line_items.class_sourced_id |
categorySourcedId |
Body |
text |
Yes |
SourcedId of the Category. |
oneroster.line_items.category_sourced_id |
academicSessionSourcedId |
Body |
text |
Yes |
SourcedId of the academicSession to which the lineItem is based. |
oneroster.line_items.academic_session_sourced_id |
resultValueMin |
Body |
double precision |
No |
The minimum value permitted for the score (inclusive) e.g. 0.0. |
oneroster.line_items.result_value_min |
resultValueMax |
Body |
double precision |
No |
The maximum value permitted for the score (inclusive) e.g. 100.0. |
oneroster.line_items.result_value_max |
schoolSourcedId |
Body |
text |
Yes |
SourcedId of the School. This is a new column added in version 1.2. |
oneroster.line_items.school_sourced_id |
oneroster.line_item_score_scales.create
Create a Line Item Score Scales record
Creates one /lineItemScoreScales resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/lineItemScoreScales
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/lineItemScoreScales" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-line-item-score-scales-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this line item score scales row. |
oneroster.line_item_score_scales.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.line_item_score_scales.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.line_item_score_scales.date_last_modified |
title |
Body |
text |
No |
Name of the related scoreScale. |
oneroster.line_item_score_scales.title |
lineItemSourcedId |
Body |
text |
Yes |
SourcedId of the reference LineItem. |
oneroster.line_item_score_scales.line_item_sourced_id |
scoreScaleSourcedId |
Body |
text |
Yes |
SourcedId of the reference ScoreScale. |
oneroster.line_item_score_scales.score_scale_sourced_id |
oneroster.orgs.create
Create a Organizations record
Creates one /orgs resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/orgs
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/orgs" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-orgs-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this orgs row. |
oneroster.orgs.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.orgs.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.orgs.date_last_modified |
name |
Body |
text |
Yes |
Name of the organization. |
oneroster.orgs.name |
type |
Body |
text |
Yes |
Organization classification that determines which references this org row can satisfy. school is the value required by classes.school_sourced_id, enrollments.school_sourced_id, and line_ite... |
oneroster.orgs.type |
identifier |
Body |
text |
No |
Human readable identifier for this org e.g. NCES ID. |
oneroster.orgs.identifier |
parentSourcedId |
Body |
text |
No |
SourcedId of an Org representing the Parent organization. |
oneroster.orgs.parent_sourced_id |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One orgs.csv record using OneRoster source field names and _platform metadata. |
oneroster.orgs |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.orgs |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.orgs.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.orgs.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this orgs row. |
oneroster.orgs.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.orgs.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.orgs.date_last_modified |
item.name |
text |
Yes |
Name of the organization. |
oneroster.orgs.name |
item.type |
text |
Yes |
Organization classification that determines which references this org row can satisfy. school is the value required by classes.school_sourced_id, enrollments.school_sourced_id, an... |
oneroster.orgs.type |
item.identifier |
text |
No |
Human readable identifier for this org e.g. NCES ID. |
oneroster.orgs.identifier |
item.parentSourcedId |
text |
No |
SourcedId of an Org representing the Parent organization. |
oneroster.orgs.parent_sourced_id |
oneroster.resources.create
Create a Resources record
Creates one /resources resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/resources
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/resources" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-resources-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this resources row. |
oneroster.resources.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.resources.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.resources.date_last_modified |
vendorResourceId |
Body |
text |
Yes |
Unique ID of this resource as allocated by the vendor. It is unique in the context of resource identifiers allocated by the vendor. |
oneroster.resources.vendor_resource_id |
title |
Body |
text |
No |
Name of this resource. |
oneroster.resources.title |
roles |
Body |
text |
No |
Audience roles for which a resource is intended. This is an enum list in one CSV cell, so several roles may receive the same resource without creating separate resource rows. |
oneroster.resources.roles |
importance |
Body |
text |
No |
Resource priority inside its class, course, or user context. primary marks the main resource mapping; secondary marks supporting material. |
oneroster.resources.importance |
vendorId |
Body |
text |
No |
Identifier of the vendor responsible for this resource. This unique ID will be assigned by 1EdTech during the OneRoster conformance process. |
oneroster.resources.vendor_id |
applicationId |
Body |
text |
No |
Identifier of the application associated with this resource. This identifier is assigned by the creator/vendor of the resource. |
oneroster.resources.application_id |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One resources.csv record using OneRoster source field names and _platform metadata. |
oneroster.resources |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.resources |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.resources.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.resources.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this resources row. |
oneroster.resources.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.resources.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.resources.date_last_modified |
item.vendorResourceId |
text |
Yes |
Unique ID of this resource as allocated by the vendor. It is unique in the context of resource identifiers allocated by the vendor. |
oneroster.resources.vendor_resource_id |
item.title |
text |
No |
Name of this resource. |
oneroster.resources.title |
item.roles |
text |
No |
Audience roles for which a resource is intended. This is an enum list in one CSV cell, so several roles may receive the same resource without creating separate resource rows. |
oneroster.resources.roles |
item.importance |
text |
No |
Resource priority inside its class, course, or user context. primary marks the main resource mapping; secondary marks supporting material. |
oneroster.resources.importance |
item.vendorId |
text |
No |
Identifier of the vendor responsible for this resource. This unique ID will be assigned by 1EdTech during the OneRoster conformance process. |
oneroster.resources.vendor_id |
item.applicationId |
text |
No |
Identifier of the application associated with this resource. This identifier is assigned by the creator/vendor of the resource. |
oneroster.resources.application_id |
oneroster.result_learning_objective_ids.create
Create a Result Learning Objective IDs record
Creates one /resultLearningObjectiveIds resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/resultLearningObjectiveIds
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/resultLearningObjectiveIds" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-result-learning-objective-ids-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this result learning objective ids row. |
oneroster.result_learning_objective_ids.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.result_learning_objective_ids.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.result_learning_objective_ids.date_last_modified |
resultSourcedId |
Body |
text |
Yes |
SourcedId of the parent Result for this learning objective. |
oneroster.result_learning_objective_ids.result_sourced_id |
source |
Body |
text |
Yes |
Vocabulary source for the learning objective identifier attached to a result. case means the identifier should validate as an IMS CASE identifier; unknown preserves a sender value whose sou... |
oneroster.result_learning_objective_ids.source |
learningObjectiveId |
Body |
text |
Yes |
Unique identifier for the associated learning objective. If a CASE identifier then it MUST be a valid UUID URN. |
oneroster.result_learning_objective_ids.learning_objective_id |
score |
Body |
double precision |
No |
The optional mastery score supplied as a numeric value. |
oneroster.result_learning_objective_ids.score |
textScore |
Body |
text |
No |
The optional mastery score supplied as a string. |
oneroster.result_learning_objective_ids.text_score |
oneroster.results.create
Create a Results record
Creates one /results resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/results
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/results" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-results-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this results row. |
oneroster.results.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.results.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.results.date_last_modified |
lineItemSourcedId |
Body |
text |
Yes |
Unique identifier of the lineItem. |
oneroster.results.line_item_sourced_id |
studentSourcedId |
Body |
text |
Yes |
Unique identifier of the student (user). References a record that is/was created in the users.csv file with type of 'student'. |
oneroster.results.student_sourced_id |
scoreStatus |
Body |
text |
Yes |
Gradebook result state for the student's line item. It tells consumers whether the result is submitted, graded, exempt, or still missing work. |
oneroster.results.score_status |
score |
Body |
double precision |
No |
Numeric result value for the student's line item. When present, it must resolve to exactly one same-tenant effective score scale before persistence and must stay consistent with lineItems r... |
oneroster.results.score |
scoreDate |
Body |
date |
Yes |
The date the result was submitted and/or the 'scoreStatus' was changed. |
oneroster.results.score_date |
comment |
Body |
text |
No |
Human readable comment about the result. |
oneroster.results.comment |
textScore |
Body |
text |
No |
Non-numeric gradebook value for the student's line item. When present, it must align with exactly one same-tenant effective score scale before persistence; a read-time hint cannot substitut... |
oneroster.results.text_score |
classSourcedId |
Body |
text |
No |
Unique identifier of the class. References a record that is/was created in the classes.csv file. This is a new column added in version 1.2. |
oneroster.results.class_sourced_id |
inProgress |
Body |
text |
No |
Workflow flag that says assigned work is still in progress and a submitted work product is not expected yet. It affects gradebook interpretation, not row lifecycle. |
oneroster.results.in_progress |
incomplete |
Body |
text |
No |
Workflow flag that says submitted student work is present but incomplete. It can coexist with score_status values while the teacher resolves grading. |
oneroster.results.incomplete |
late |
Body |
text |
No |
Workflow flag that says the work was submitted after the due date or is otherwise past due. It may affect scoring policy but does not change the result row's tenant-scoped identity. |
oneroster.results.late |
missing |
Body |
text |
No |
Workflow flag that says expected work has not been submitted and is considered missing. It should not be inferred only from a blank score; the source must send the flag. |
oneroster.results.missing |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One results.csv record using OneRoster source field names and _platform metadata. |
oneroster.results |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.results |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.results.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.results.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this results row. |
oneroster.results.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.results.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.results.date_last_modified |
item.lineItemSourcedId |
text |
Yes |
Unique identifier of the lineItem. |
oneroster.results.line_item_sourced_id |
item.studentSourcedId |
text |
Yes |
Unique identifier of the student (user). References a record that is/was created in the users.csv file with type of 'student'. |
oneroster.results.student_sourced_id |
item.scoreStatus |
text |
Yes |
Gradebook result state for the student's line item. It tells consumers whether the result is submitted, graded, exempt, or still missing work. |
oneroster.results.score_status |
item.score |
double precision |
No |
Numeric result value for the student's line item. When present, it must resolve to exactly one same-tenant effective score scale before persistence and must stay consistent with l... |
oneroster.results.score |
item.scoreDate |
date |
Yes |
The date the result was submitted and/or the 'scoreStatus' was changed. |
oneroster.results.score_date |
item.comment |
text |
No |
Human readable comment about the result. |
oneroster.results.comment |
item.textScore |
text |
No |
Non-numeric gradebook value for the student's line item. When present, it must align with exactly one same-tenant effective score scale before persistence; a read-time hint cannot... |
oneroster.results.text_score |
item.classSourcedId |
text |
No |
Unique identifier of the class. References a record that is/was created in the classes.csv file. This is a new column added in version 1.2. |
oneroster.results.class_sourced_id |
item.inProgress |
text |
No |
Workflow flag that says assigned work is still in progress and a submitted work product is not expected yet. It affects gradebook interpretation, not row lifecycle. |
oneroster.results.in_progress |
item.incomplete |
text |
No |
Workflow flag that says submitted student work is present but incomplete. It can coexist with score_status values while the teacher resolves grading. |
oneroster.results.incomplete |
item.late |
text |
No |
Workflow flag that says the work was submitted after the due date or is otherwise past due. It may affect scoring policy but does not change the result row's tenant-scoped identit... |
oneroster.results.late |
item.missing |
text |
No |
Workflow flag that says expected work has not been submitted and is considered missing. It should not be inferred only from a blank score; the source must send the flag. |
oneroster.results.missing |
oneroster.result_score_scales.create
Create a Result Score Scales record
Creates one /resultScoreScales resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/resultScoreScales
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/resultScoreScales" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-result-score-scales-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this result score scales row. |
oneroster.result_score_scales.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.result_score_scales.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.result_score_scales.date_last_modified |
title |
Body |
text |
No |
Name of the related scoreScale. |
oneroster.result_score_scales.title |
resultSourcedId |
Body |
text |
Yes |
SourcedId of the reference Result. |
oneroster.result_score_scales.result_sourced_id |
scoreScaleSourcedId |
Body |
text |
Yes |
SourcedId of the reference ScoreScale. |
oneroster.result_score_scales.score_scale_sourced_id |
oneroster.roles.create
Create a Roles record
Creates one /roles resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/roles
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/roles" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-roles-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this roles row. |
oneroster.roles.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.roles.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.roles.date_last_modified |
userSourcedId |
Body |
text |
Yes |
The user whose role is being defined. |
oneroster.roles.user_sourced_id |
roleType |
Body |
text |
Yes |
Primary/secondary marker for a user's role inside one organization. Only one role per user/org should be primary for the same active date window. |
oneroster.roles.role_type |
role |
Body |
text |
Yes |
Organization-level role assigned to the user. It is separate from enrollments.role: this field says what the person is in an org, while enrollments.role says what they are in a class. |
oneroster.roles.role |
beginDate |
Body |
date |
No |
The start date on which the role became active (inclusive). |
oneroster.roles.begin_date |
endDate |
Body |
date |
No |
The end date on which the role ceased to be active (exclusive). |
oneroster.roles.end_date |
orgSourcedId |
Body |
text |
Yes |
SourcedId of the Org within which the User has the assigned role. |
oneroster.roles.org_sourced_id |
userProfileSourcedId |
Body |
text |
No |
SourcedId of the UserProfile for the User. |
oneroster.roles.user_profile_sourced_id |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One roles.csv record using OneRoster source field names and _platform metadata. |
oneroster.roles |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.roles |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.roles.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.roles.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this roles row. |
oneroster.roles.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.roles.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.roles.date_last_modified |
item.userSourcedId |
text |
Yes |
The user whose role is being defined. |
oneroster.roles.user_sourced_id |
item.roleType |
text |
Yes |
Primary/secondary marker for a user's role inside one organization. Only one role per user/org should be primary for the same active date window. |
oneroster.roles.role_type |
item.role |
text |
Yes |
Organization-level role assigned to the user. It is separate from enrollments.role: this field says what the person is in an org, while enrollments.role says what they are in a cl... |
oneroster.roles.role |
item.beginDate |
date |
No |
The start date on which the role became active (inclusive). |
oneroster.roles.begin_date |
item.endDate |
date |
No |
The end date on which the role ceased to be active (exclusive). |
oneroster.roles.end_date |
item.orgSourcedId |
text |
Yes |
SourcedId of the Org within which the User has the assigned role. |
oneroster.roles.org_sourced_id |
item.userProfileSourcedId |
text |
No |
SourcedId of the UserProfile for the User. |
oneroster.roles.user_profile_sourced_id |
oneroster.score_scales.create
Create a Score Scales record
Creates one /scoreScales resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/scoreScales
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/scoreScales" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-score-scales-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this score scales row. |
oneroster.score_scales.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.score_scales.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.score_scales.date_last_modified |
title |
Body |
text |
Yes |
A human readable title for the score scale. |
oneroster.score_scales.title |
type |
Body |
text |
Yes |
The type of score scaling e.g. percent. |
oneroster.score_scales.type |
orgSourcedId |
Body |
text |
Yes |
The org for which the score scale is used. |
oneroster.score_scales.org_sourced_id |
courseSourcedId |
Body |
text |
Yes |
The course for which the score scale is used. |
oneroster.score_scales.course_sourced_id |
classSourcedId |
Body |
text |
Yes |
The class for which the score scale is used. |
oneroster.score_scales.class_sourced_id |
scoreScaleValue |
Body |
text |
Yes |
OneRoster score-scale mapping cell. Each {left:right} pair maps a source scale label or range to a target value and multiple mappings stay in the same CSV cell. |
oneroster.score_scales.score_scale_value |
oneroster.user_profiles.create
Create a User Profiles record
Creates one /userProfiles resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/userProfiles
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/userProfiles" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-user-profiles-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this user profiles row. |
oneroster.user_profiles.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.user_profiles.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.user_profiles.date_last_modified |
userSourcedId |
Body |
text |
Yes |
Unique ID for the corresponding user. |
oneroster.user_profiles.user_sourced_id |
profileType |
Body |
text |
Yes |
The type of user profile. This should be a human readable label that has some significance in the context of the related system, app, tool, etc. |
oneroster.user_profiles.profile_type |
vendorId |
Body |
text |
Yes |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this user profile. |
oneroster.user_profiles.vendor_id |
applicationId |
Body |
text |
No |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this account. |
oneroster.user_profiles.application_id |
description |
Body |
text |
No |
A human readable description of the use of the account. This should not contain any security information for access to the account. |
oneroster.user_profiles.description |
credentialType |
Body |
text |
Yes |
The type of credentials for the user profile. This should be indicative of when this credential should be used. |
oneroster.user_profiles.credential_type |
username |
Body |
text |
Yes |
The username for this profile. |
oneroster.user_profiles.username |
password |
Body |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted, the processing system must be aware of the encryption method. |
oneroster.user_profiles.password |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One userProfiles.csv record using OneRoster source field names and _platform metadata. |
oneroster.user_profiles |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.user_profiles |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.user_profiles.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.user_profiles.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this user profiles row. |
oneroster.user_profiles.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.user_profiles.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.user_profiles.date_last_modified |
item.userSourcedId |
text |
Yes |
Unique ID for the corresponding user. |
oneroster.user_profiles.user_sourced_id |
item.profileType |
text |
Yes |
The type of user profile. This should be a human readable label that has some significance in the context of the related system, app, tool, etc. |
oneroster.user_profiles.profile_type |
item.vendorId |
text |
Yes |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this user profile. |
oneroster.user_profiles.vendor_id |
item.applicationId |
text |
No |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this account. |
oneroster.user_profiles.application_id |
item.description |
text |
No |
A human readable description of the use of the account. This should not contain any security information for access to the account. |
oneroster.user_profiles.description |
item.credentialType |
text |
Yes |
The type of credentials for the user profile. This should be indicative of when this credential should be used. |
oneroster.user_profiles.credential_type |
item.username |
text |
Yes |
The username for this profile. |
oneroster.user_profiles.username |
item.password |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted, the processing system must be aware of the encryption method. |
oneroster.user_profiles.password |
oneroster.user_resources.create
Create a User Resources record
Creates one /userResources resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/userResources
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/userResources" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-user-resources-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this user resources row. |
oneroster.user_resources.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.user_resources.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.user_resources.date_last_modified |
userSourcedId |
Body |
text |
Yes |
SourcedId of the user who will have access to this resource. |
oneroster.user_resources.user_sourced_id |
orgSourcedId |
Body |
text |
No |
SourcedId of the reference Organization. |
oneroster.user_resources.org_sourced_id |
classSourcedId |
Body |
text |
No |
SourcedId of the reference Class. |
oneroster.user_resources.class_sourced_id |
resourceSourcedId |
Body |
text |
Yes |
SourcedId of the Resource associated with the User. |
oneroster.user_resources.resource_sourced_id |
oneroster.users.create
Create a Users record
Creates one /users resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/users
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/users" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-users-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this users row. |
oneroster.users.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.users.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.users.date_last_modified |
enabledUser |
Body |
text |
Yes |
Source-system account availability flag for the user row. true means the source considers the user enabled; false preserves the roster identity but tells platform3 not to treat the user as... |
oneroster.users.enabled_user |
username |
Body |
text |
Yes |
User name. |
oneroster.users.username |
userIds |
Body |
text |
No |
External machine-readable ID (e.g. LDAP id, LTI id) for this user. The ID must be accompanied by a type to indicate the nature of the Identifier. The Type and ID values are enclosed in '{}'... |
oneroster.users.user_ids |
givenName |
Body |
text |
Yes |
User's first name. |
oneroster.users.given_name |
familyName |
Body |
text |
Yes |
User's surname. |
oneroster.users.family_name |
middleName |
Body |
text |
No |
User's middle name(s). If more than one then they are separated by a space. |
oneroster.users.middle_name |
identifier |
Body |
text |
No |
Identifier for the user with a human readable meaning. |
oneroster.users.identifier |
email |
Body |
text |
No |
Email address for the User. |
oneroster.users.email |
sms |
Body |
text |
No |
SMS address for the User. |
oneroster.users.sms |
phone |
Body |
text |
No |
Phone number for the User. |
oneroster.users.phone |
agentSourcedIds |
Body |
text |
No |
SourcedIds of the Users to which this user has a relationship. If multiple IDs are required then use double quotes and separate with commas. Note: In most cases this will be for indicating... |
oneroster.users.agent_sourced_ids |
grades |
Body |
text |
No |
Grade(s) for which a user with role 'student' is enrolled. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.users.grades |
password |
Body |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted the processing system must be aware of the encryption method. |
oneroster.users.password |
userMasterIdentifier |
Body |
text |
No |
The master identifier that could be used to provide globally unique identification of the user across all of the tools, systems, apps, etc. available/accessed by the user. This is a new col... |
oneroster.users.user_master_identifier |
preferredGivenName |
Body |
text |
No |
The given name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_given_name |
preferredMiddleName |
Body |
text |
No |
The middle names by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_middle_name |
preferredFamilyName |
Body |
text |
No |
The family name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_family_name |
primaryOrgSourcedId |
Body |
text |
No |
The sourcedId of the primary 'org' for the 'user'. In OR 1.2 a user can have one or more 'roles' in one or more 'org's and so this field can be used for identification of the primary 'org'.... |
oneroster.users.primary_org_sourced_id |
pronouns |
Body |
text |
No |
The pronoun(s) by which this person is referenced. Examples (in the case of English) include 'she/her/hers', 'he/him/his', 'they/them/theirs', 'ze/hir/hir', 'xe/xir', or a statement that th... |
oneroster.users.pronouns |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One users.csv record using OneRoster source field names and _platform metadata. |
oneroster.users |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.users |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.users.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.users.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this users row. |
oneroster.users.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.users.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.users.date_last_modified |
item.enabledUser |
text |
Yes |
Source-system account availability flag for the user row. true means the source considers the user enabled; false preserves the roster identity but tells platform3 not to treat th... |
oneroster.users.enabled_user |
item.username |
text |
Yes |
User name. |
oneroster.users.username |
item.userIds |
text |
No |
External machine-readable ID (e.g. LDAP id, LTI id) for this user. The ID must be accompanied by a type to indicate the nature of the Identifier. The Type and ID values are enclos... |
oneroster.users.user_ids |
item.givenName |
text |
Yes |
User's first name. |
oneroster.users.given_name |
item.familyName |
text |
Yes |
User's surname. |
oneroster.users.family_name |
item.middleName |
text |
No |
User's middle name(s). If more than one then they are separated by a space. |
oneroster.users.middle_name |
item.identifier |
text |
No |
Identifier for the user with a human readable meaning. |
oneroster.users.identifier |
item.email |
text |
No |
Email address for the User. |
oneroster.users.email |
item.sms |
text |
No |
SMS address for the User. |
oneroster.users.sms |
item.phone |
text |
No |
Phone number for the User. |
oneroster.users.phone |
item.agentSourcedIds |
text |
No |
SourcedIds of the Users to which this user has a relationship. If multiple IDs are required then use double quotes and separate with commas. Note: In most cases this will be for i... |
oneroster.users.agent_sourced_ids |
item.grades |
text |
No |
Grade(s) for which a user with role 'student' is enrolled. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.users.grades |
item.password |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted the processing system must be aware of the encryption method. |
oneroster.users.password |
item.userMasterIdentifier |
text |
No |
The master identifier that could be used to provide globally unique identification of the user across all of the tools, systems, apps, etc. available/accessed by the user. This is... |
oneroster.users.user_master_identifier |
item.preferredGivenName |
text |
No |
The given name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_given_name |
item.preferredMiddleName |
text |
No |
The middle names by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_middle_name |
item.preferredFamilyName |
text |
No |
The family name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_family_name |
item.primaryOrgSourcedId |
text |
No |
The sourcedId of the primary 'org' for the 'user'. In OR 1.2 a user can have one or more 'roles' in one or more 'org's and so this field can be used for identification of the prim... |
oneroster.users.primary_org_sourced_id |
item.pronouns |
text |
No |
The pronoun(s) by which this person is referenced. Examples (in the case of English) include 'she/her/hers', 'he/him/his', 'they/them/theirs', 'ze/hir/hir', 'xe/xir', or a stateme... |
oneroster.users.pronouns |
oneroster.grading_periods.create
Create a Grading Periods record
Creates one /gradingPeriods resource without submitting a full CSV package. The body uses OneRoster source field names; _platform fields are generated by the API.
#
- Method
POST
- Path
/gradingPeriods
- Auth
- Bearer JWT with write scope; scoped claims may narrow writable schools/classes
- Status
- 201400401403409422429
Trace: OITD-010 OITD-101 OITD-105 OITD-106 OITD-108 OITD-111
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
curl -fsS -X POST "$BASE_URL/gradingPeriods" \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: create-grading-periods-001" \
-H "Content-Type: application/json" \
--data '{"sourcedId":"demo-resource-001","status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Body |
text |
Yes |
Tenant-scoped OneRoster identifier for this academic sessions row. |
oneroster.academic_sessions.sourced_id |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.academic_sessions.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.academic_sessions.date_last_modified |
title |
Body |
text |
Yes |
Name or title of the academic session. |
oneroster.academic_sessions.title |
type |
Body |
text |
Yes |
Calendar-window type for the academic session. Courses usually point at schoolYear, classes usually list term or semester rows, and gradebook reporting can use gradingPeriod. |
oneroster.academic_sessions.type |
startDate |
Body |
date |
Yes |
Inclusive end date for the academic session. ISO 8601 format [ISO8601]. |
oneroster.academic_sessions.start_date |
endDate |
Body |
date |
Yes |
Exclusive end date for the academic session. ISO 8601 format [ISO8601]. |
oneroster.academic_sessions.end_date |
parentSourcedId |
Body |
text |
No |
SourcedId of the parent of this academic session. |
oneroster.academic_sessions.parent_sourced_id |
schoolYear |
Body |
integer |
Yes |
The school year for which the academic session contributes. This year should be that in which the school year ends (Format is: YYYY). |
oneroster.academic_sessions.school_year |
oneroster.academic_sessions.replace
Replace a Academic Sessions record
Replaces one /academicSessions resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/academicSessions/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/academicSessions/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-academic-sessions-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.date_last_modified |
title |
Body |
text |
Yes |
Name or title of the academic session. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.title |
type |
Body |
text |
Yes |
Calendar-window type for the academic session. Courses usually point at schoolYear, classes usually list term or semester rows, and gradebo... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.type |
startDate |
Body |
date |
Yes |
Inclusive end date for the academic session. ISO 8601 format [ISO8601]. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.start_date |
endDate |
Body |
date |
Yes |
Exclusive end date for the academic session. ISO 8601 format [ISO8601]. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.end_date |
parentSourcedId |
Body |
text |
No |
SourcedId of the parent of this academic session. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.parent_sourced_id |
schoolYear |
Body |
integer |
Yes |
The school year for which the academic session contributes. This year should be that in which the school year ends (Format is: YYYY). Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.school_year |
oneroster.categories.replace
Replace a Categories record
Replaces one /categories resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/categories/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/categories/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-categories-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.categories.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.categories.date_last_modified |
title |
Body |
text |
Yes |
The title assigned to the set of lineItems to denote its nature e.g. homework, essays, etc. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.categories.title |
weight |
Body |
integer |
No |
Total weight of this grading category in calculation of course final score. This is a Percent value only, e.g. 80%. This is a new column ad... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.categories.weight |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One categories.csv record using OneRoster source field names and _platform metadata. |
oneroster.categories |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.categories |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.categories.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.categories.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this categories row. |
oneroster.categories.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.categories.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.categories.date_last_modified |
item.title |
text |
Yes |
The title assigned to the set of lineItems to denote its nature e.g. homework, essays, etc. |
oneroster.categories.title |
item.weight |
integer |
No |
Total weight of this grading category in calculation of course final score. This is a Percent value only, e.g. 80%. This is a new column added in version 1.2. |
oneroster.categories.weight |
oneroster.classes.replace
Replace a Classes record
Replaces one /classes resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/classes/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/classes/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-classes-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.date_last_modified |
title |
Body |
text |
Yes |
Name of this class. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.title |
grades |
Body |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specific... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.grades |
courseSourcedId |
Body |
text |
Yes |
SourcedId of the course of which this class is an instance. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.course_sourced_id |
classCode |
Body |
text |
No |
Human readable code used to help identify this class. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.class_code |
classType |
Body |
text |
Yes |
Class scheduling category. scheduled is an ordinary instructional section; homeroom is a homeroom grouping that may not carry the same cour... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.class_type |
location |
Body |
text |
No |
Human readable description of where the class is physically located. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.location |
schoolSourcedId |
Body |
text |
Yes |
SourcedId of the Org that teaches this class of OrgType 'school'. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.school_sourced_id |
termSourcedIds |
Body |
text |
Yes |
SourcedIds of the terms (the academicSessions) in which the class is taught. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.term_sourced_ids |
subjects |
Body |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the s... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.subjects |
subjectCodes |
Body |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC41... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.subject_codes |
periods |
Body |
text |
No |
The time slots in the day that the class will be given. If more than one period is needed, use double quotes, and separate with commas (per... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.classes.periods |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One classes.csv record using OneRoster source field names and _platform metadata. |
oneroster.classes |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.classes |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.classes.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.classes.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this classes row. |
oneroster.classes.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.classes.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.classes.date_last_modified |
item.title |
text |
Yes |
Name of this class. |
oneroster.classes.title |
item.grades |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.classes.grades |
item.courseSourcedId |
text |
Yes |
SourcedId of the course of which this class is an instance. |
oneroster.classes.course_sourced_id |
item.classCode |
text |
No |
Human readable code used to help identify this class. |
oneroster.classes.class_code |
item.classType |
text |
Yes |
Class scheduling category. scheduled is an ordinary instructional section; homeroom is a homeroom grouping that may not carry the same course schedule semantics. |
oneroster.classes.class_type |
item.location |
text |
No |
Human readable description of where the class is physically located. |
oneroster.classes.location |
item.schoolSourcedId |
text |
Yes |
SourcedId of the Org that teaches this class of OrgType 'school'. |
oneroster.classes.school_sourced_id |
item.termSourcedIds |
text |
Yes |
SourcedIds of the terms (the academicSessions) in which the class is taught. |
oneroster.classes.term_sourced_ids |
item.subjects |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance.... |
oneroster.classes.subjects |
item.subjectCodes |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is pre... |
oneroster.classes.subject_codes |
item.periods |
text |
No |
The time slots in the day that the class will be given. If more than one period is needed, use double quotes, and separate with commas (per [RFC4180]). Examples: 1; "1,3,5" |
oneroster.classes.periods |
oneroster.class_resources.replace
Replace a Class Resources record
Replaces one /classResources resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/classResources/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/classResources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-class-resources-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.class_resources.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.class_resources.date_last_modified |
title |
Body |
text |
No |
Name of the related class. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.class_resources.title |
classSourcedId |
Body |
text |
Yes |
SourcedId of the reference Class. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.class_resources.class_sourced_id |
resourceSourcedId |
Body |
text |
Yes |
SourcedId of the Resource associated with the Class. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.class_resources.resource_sourced_id |
oneroster.course_resources.replace
Replace a Course Resources record
Replaces one /courseResources resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/courseResources/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/courseResources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-course-resources-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.course_resources.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.course_resources.date_last_modified |
title |
Body |
text |
No |
Name of the related class. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.course_resources.title |
courseSourcedId |
Body |
text |
Yes |
SourcedId of the reference Course. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.course_resources.course_sourced_id |
resourceSourcedId |
Body |
text |
Yes |
SourcedId of the Resource associated with the Course. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.course_resources.resource_sourced_id |
oneroster.courses.replace
Replace a Courses record
Replaces one /courses resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/courses/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/courses/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-courses-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.courses.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.courses.date_last_modified |
schoolYearSourcedId |
Body |
text |
No |
SourcedId of the associated AcademicSession with type of 'schoolYear'. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.courses.school_year_sourced_id |
title |
Body |
text |
Yes |
Name of this course. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.courses.title |
courseCode |
Body |
text |
No |
Human readable code used to help identify this course. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.courses.course_code |
grades |
Body |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specific... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.courses.grades |
orgSourcedId |
Body |
text |
Yes |
SourcedId of an org to which this course belongs. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.courses.org_sourced_id |
subjects |
Body |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the s... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.courses.subjects |
subjectCodes |
Body |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC41... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.courses.subject_codes |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One courses.csv record using OneRoster source field names and _platform metadata. |
oneroster.courses |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.courses |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.courses.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.courses.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this courses row. |
oneroster.courses.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.courses.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.courses.date_last_modified |
item.schoolYearSourcedId |
text |
No |
SourcedId of the associated AcademicSession with type of 'schoolYear'. |
oneroster.courses.school_year_sourced_id |
item.title |
text |
Yes |
Name of this course. |
oneroster.courses.title |
item.courseCode |
text |
No |
Human readable code used to help identify this course. |
oneroster.courses.course_code |
item.grades |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.courses.grades |
item.orgSourcedId |
text |
Yes |
SourcedId of an org to which this course belongs. |
oneroster.courses.org_sourced_id |
item.subjects |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance.... |
oneroster.courses.subjects |
item.subjectCodes |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is pre... |
oneroster.courses.subject_codes |
oneroster.demographics.replace
Replace a Demographics record
Replaces one /demographics resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/demographics/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/demographics/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-demographics-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.date_last_modified |
birthDate |
Body |
date |
No |
The date of birth. ISO 861 format: 'YYYY-MM-DD'. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.birth_date |
sex |
Body |
text |
No |
Sex value reported by the source system for the user described by demographics.sourced_id. It is a sensitive demographic exchange field; un... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.sex |
americanIndianOrAlaskaNative |
Body |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. This is one of several race indicators... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.american_indian_or_alaska_native |
asian |
Body |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It can be true alongside other race ind... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.asian |
blackOrAfricanAmerican |
Body |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is independent of the other race fla... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.black_or_african_american |
nativeHawaiianOrOtherPacificIslander |
Body |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It may be true alongside other race fla... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.native_hawaiian_or_other_pacific_islander |
white |
Body |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is preserved exactly because downstr... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.white |
demographicRaceTwoOrMoreRaces |
Body |
text |
No |
OneRoster's explicit indicator that the source reports the user in two or more race categories. It should be true when the source asserts m... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.demographic_race_two_or_more_races |
hispanicOrLatinoEthnicity |
Body |
text |
No |
Ethnicity indicator reported by the source system for the user described by demographics.sourced_id. It is independent of race flags, may b... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.hispanic_or_latino_ethnicity |
countryOfBirthCode |
Body |
text |
No |
Country where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.country_of_birth_code |
stateOfBirthAbbreviation |
Body |
text |
No |
State where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.state_of_birth_abbreviation |
cityOfBirth |
Body |
text |
No |
City where the user was born. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.city_of_birth |
publicSchoolResidenceStatus |
Body |
text |
No |
An indication of the location of the users legal residence relative to (within or outside) the boundaries of the public school attended and... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.demographics.public_school_residence_status |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One demographics.csv record using OneRoster source field names and _platform metadata. |
oneroster.demographics |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.demographics |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.demographics.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.demographics.import_batch_id |
item.sourcedId |
text |
Yes |
The user's sourcedId; in demographics.csv this is the same identifier as the user whose demographics are being described. |
oneroster.demographics.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.demographics.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.demographics.date_last_modified |
item.birthDate |
date |
No |
The date of birth. ISO 861 format: 'YYYY-MM-DD'. |
oneroster.demographics.birth_date |
item.sex |
text |
No |
Sex value reported by the source system for the user described by demographics.sourced_id. It is a sensitive demographic exchange field; unspecified preserves a deliberate source... |
oneroster.demographics.sex |
item.americanIndianOrAlaskaNative |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. This is one of several race indicators that may be true at the same time; it is... |
oneroster.demographics.american_indian_or_alaska_native |
item.asian |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It can be true alongside other race indicators, and consumers must treat it as... |
oneroster.demographics.asian |
item.blackOrAfricanAmerican |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is independent of the other race flags and may coexist with demographic_race... |
oneroster.demographics.black_or_african_american |
item.nativeHawaiianOrOtherPacificIslander |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It may be true alongside other race flags and must not be collapsed into a sing... |
oneroster.demographics.native_hawaiian_or_other_pacific_islander |
item.white |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is preserved exactly because downstream compliance reports often inspect eac... |
oneroster.demographics.white |
item.demographicRaceTwoOrMoreRaces |
text |
No |
OneRoster's explicit indicator that the source reports the user in two or more race categories. It should be true when the source asserts multi-race status; it does not erase the... |
oneroster.demographics.demographic_race_two_or_more_races |
item.hispanicOrLatinoEthnicity |
text |
No |
Ethnicity indicator reported by the source system for the user described by demographics.sourced_id. It is independent of race flags, may be true with any race combination, and is... |
oneroster.demographics.hispanic_or_latino_ethnicity |
item.countryOfBirthCode |
text |
No |
Country where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.country_of_birth_code |
item.stateOfBirthAbbreviation |
text |
No |
State where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.state_of_birth_abbreviation |
item.cityOfBirth |
text |
No |
City where the user was born. |
oneroster.demographics.city_of_birth |
item.publicSchoolResidenceStatus |
text |
No |
An indication of the location of the users legal residence relative to (within or outside) the boundaries of the public school attended and its administrative unit. The permitted... |
oneroster.demographics.public_school_residence_status |
oneroster.enrollments.replace
Replace a Enrollments record
Replaces one /enrollments resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/enrollments/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/enrollments/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-enrollments-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.enrollments.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.enrollments.date_last_modified |
classSourcedId |
Body |
text |
Yes |
SourcedId of the Class. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.enrollments.class_sourced_id |
schoolSourcedId |
Body |
text |
Yes |
SourcedId of an Org with type 'school'. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.enrollments.school_sourced_id |
userSourcedId |
Body |
text |
Yes |
SourcedId of the User. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.enrollments.user_sourced_id |
role |
Body |
text |
Yes |
The user's class-level membership role for this enrollment. It drives whether the row represents a learner, teacher, proctor, or administra... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.enrollments.role |
primary |
Body |
text |
No |
Teacher-primary marker for a class enrollment. It applies only when enrollments.role is teacher; true identifies the primary teacher for th... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.enrollments.primary |
beginDate |
Body |
date |
No |
The start date for the enrollment (inclusive). This date must align with the associated academic session (term) identified in the class. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.enrollments.begin_date |
endDate |
Body |
date |
No |
The end date for the enrollment (exclusive). This date must align with the associated academic session (term) identified for the class. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.enrollments.end_date |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One enrollments.csv record using OneRoster source field names and _platform metadata. |
oneroster.enrollments |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.enrollments |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.enrollments.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.enrollments.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this enrollments row. |
oneroster.enrollments.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.enrollments.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.enrollments.date_last_modified |
item.classSourcedId |
text |
Yes |
SourcedId of the Class. |
oneroster.enrollments.class_sourced_id |
item.schoolSourcedId |
text |
Yes |
SourcedId of an Org with type 'school'. |
oneroster.enrollments.school_sourced_id |
item.userSourcedId |
text |
Yes |
SourcedId of the User. |
oneroster.enrollments.user_sourced_id |
item.role |
text |
Yes |
The user's class-level membership role for this enrollment. It drives whether the row represents a learner, teacher, proctor, or administrator in active-enrollment queries and mus... |
oneroster.enrollments.role |
item.primary |
text |
No |
Teacher-primary marker for a class enrollment. It applies only when enrollments.role is teacher; true identifies the primary teacher for the class/date window, while student, proc... |
oneroster.enrollments.primary |
item.beginDate |
date |
No |
The start date for the enrollment (inclusive). This date must align with the associated academic session (term) identified in the class. |
oneroster.enrollments.begin_date |
item.endDate |
date |
No |
The end date for the enrollment (exclusive). This date must align with the associated academic session (term) identified for the class. |
oneroster.enrollments.end_date |
oneroster.line_item_learning_objective_ids.replace
Replace a Line Item Learning Objective IDs record
Replaces one /lineItemLearningObjectiveIds resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/lineItemLearningObjectiveIds/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/lineItemLearningObjectiveIds/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-line-item-learning-objective-ids-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_item_learning_objective_ids.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_item_learning_objective_ids.date_last_modified |
lineItemSourcedId |
Body |
text |
Yes |
SourcedId of the parent LineItem for this learning objective. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_item_learning_objective_ids.line_item_sourced_id |
source |
Body |
text |
Yes |
Vocabulary source for the learning objective identifier attached to a line item. case means the identifier should validate as an IMS CASE i... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_item_learning_objective_ids.source |
learningObjectiveId |
Body |
text |
Yes |
Unique identifier for the associated learning objective. If an 1EdTech CASE identifier then it MUST be a valid UUID URN. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_item_learning_objective_ids.learning_objective_id |
oneroster.line_items.replace
Replace a Line Items record
Replaces one /lineItems resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/lineItems/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/lineItems/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-line-items-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_items.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_items.date_last_modified |
title |
Body |
text |
Yes |
The title assigned to the lineItem. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_items.title |
description |
Body |
text |
No |
Short description of the role of the lineItem. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_items.description |
assignDate |
Body |
date |
Yes |
Date the associated activity was assigned. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_items.assign_date |
dueDate |
Body |
date |
Yes |
Date the associated activity is due to be completed. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_items.due_date |
classSourcedId |
Body |
text |
Yes |
SourcedId of the Class. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_items.class_sourced_id |
categorySourcedId |
Body |
text |
Yes |
SourcedId of the Category. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_items.category_sourced_id |
academicSessionSourcedId |
Body |
text |
Yes |
SourcedId of the academicSession to which the lineItem is based. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_items.academic_session_sourced_id |
resultValueMin |
Body |
double precision |
No |
The minimum value permitted for the score (inclusive) e.g. 0.0. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_items.result_value_min |
resultValueMax |
Body |
double precision |
No |
The maximum value permitted for the score (inclusive) e.g. 100.0. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_items.result_value_max |
schoolSourcedId |
Body |
text |
Yes |
SourcedId of the School. This is a new column added in version 1.2. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_items.school_sourced_id |
oneroster.line_item_score_scales.replace
Replace a Line Item Score Scales record
Replaces one /lineItemScoreScales resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/lineItemScoreScales/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/lineItemScoreScales/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-line-item-score-scales-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_item_score_scales.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_item_score_scales.date_last_modified |
title |
Body |
text |
No |
Name of the related scoreScale. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_item_score_scales.title |
lineItemSourcedId |
Body |
text |
Yes |
SourcedId of the reference LineItem. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_item_score_scales.line_item_sourced_id |
scoreScaleSourcedId |
Body |
text |
Yes |
SourcedId of the reference ScoreScale. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.line_item_score_scales.score_scale_sourced_id |
oneroster.orgs.replace
Replace a Organizations record
Replaces one /orgs resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/orgs/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/orgs/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-orgs-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.orgs.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.orgs.date_last_modified |
name |
Body |
text |
Yes |
Name of the organization. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.orgs.name |
type |
Body |
text |
Yes |
Organization classification that determines which references this org row can satisfy. school is the value required by classes.school_sourc... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.orgs.type |
identifier |
Body |
text |
No |
Human readable identifier for this org e.g. NCES ID. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.orgs.identifier |
parentSourcedId |
Body |
text |
No |
SourcedId of an Org representing the Parent organization. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.orgs.parent_sourced_id |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One orgs.csv record using OneRoster source field names and _platform metadata. |
oneroster.orgs |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.orgs |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.orgs.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.orgs.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this orgs row. |
oneroster.orgs.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.orgs.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.orgs.date_last_modified |
item.name |
text |
Yes |
Name of the organization. |
oneroster.orgs.name |
item.type |
text |
Yes |
Organization classification that determines which references this org row can satisfy. school is the value required by classes.school_sourced_id, enrollments.school_sourced_id, an... |
oneroster.orgs.type |
item.identifier |
text |
No |
Human readable identifier for this org e.g. NCES ID. |
oneroster.orgs.identifier |
item.parentSourcedId |
text |
No |
SourcedId of an Org representing the Parent organization. |
oneroster.orgs.parent_sourced_id |
oneroster.resources.replace
Replace a Resources record
Replaces one /resources resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/resources/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/resources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-resources-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.resources.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.resources.date_last_modified |
vendorResourceId |
Body |
text |
Yes |
Unique ID of this resource as allocated by the vendor. It is unique in the context of resource identifiers allocated by the vendor. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.resources.vendor_resource_id |
title |
Body |
text |
No |
Name of this resource. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.resources.title |
roles |
Body |
text |
No |
Audience roles for which a resource is intended. This is an enum list in one CSV cell, so several roles may receive the same resource witho... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.resources.roles |
importance |
Body |
text |
No |
Resource priority inside its class, course, or user context. primary marks the main resource mapping; secondary marks supporting material. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.resources.importance |
vendorId |
Body |
text |
No |
Identifier of the vendor responsible for this resource. This unique ID will be assigned by 1EdTech during the OneRoster conformance process. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.resources.vendor_id |
applicationId |
Body |
text |
No |
Identifier of the application associated with this resource. This identifier is assigned by the creator/vendor of the resource. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.resources.application_id |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One resources.csv record using OneRoster source field names and _platform metadata. |
oneroster.resources |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.resources |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.resources.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.resources.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this resources row. |
oneroster.resources.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.resources.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.resources.date_last_modified |
item.vendorResourceId |
text |
Yes |
Unique ID of this resource as allocated by the vendor. It is unique in the context of resource identifiers allocated by the vendor. |
oneroster.resources.vendor_resource_id |
item.title |
text |
No |
Name of this resource. |
oneroster.resources.title |
item.roles |
text |
No |
Audience roles for which a resource is intended. This is an enum list in one CSV cell, so several roles may receive the same resource without creating separate resource rows. |
oneroster.resources.roles |
item.importance |
text |
No |
Resource priority inside its class, course, or user context. primary marks the main resource mapping; secondary marks supporting material. |
oneroster.resources.importance |
item.vendorId |
text |
No |
Identifier of the vendor responsible for this resource. This unique ID will be assigned by 1EdTech during the OneRoster conformance process. |
oneroster.resources.vendor_id |
item.applicationId |
text |
No |
Identifier of the application associated with this resource. This identifier is assigned by the creator/vendor of the resource. |
oneroster.resources.application_id |
oneroster.result_learning_objective_ids.replace
Replace a Result Learning Objective IDs record
Replaces one /resultLearningObjectiveIds resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/resultLearningObjectiveIds/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/resultLearningObjectiveIds/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-result-learning-objective-ids-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.result_learning_objective_ids.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.result_learning_objective_ids.date_last_modified |
resultSourcedId |
Body |
text |
Yes |
SourcedId of the parent Result for this learning objective. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.result_learning_objective_ids.result_sourced_id |
source |
Body |
text |
Yes |
Vocabulary source for the learning objective identifier attached to a result. case means the identifier should validate as an IMS CASE iden... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.result_learning_objective_ids.source |
learningObjectiveId |
Body |
text |
Yes |
Unique identifier for the associated learning objective. If a CASE identifier then it MUST be a valid UUID URN. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.result_learning_objective_ids.learning_objective_id |
score |
Body |
double precision |
No |
The optional mastery score supplied as a numeric value. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.result_learning_objective_ids.score |
textScore |
Body |
text |
No |
The optional mastery score supplied as a string. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.result_learning_objective_ids.text_score |
oneroster.results.replace
Replace a Results record
Replaces one /results resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/results/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/results/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-results-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.date_last_modified |
lineItemSourcedId |
Body |
text |
Yes |
Unique identifier of the lineItem. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.line_item_sourced_id |
studentSourcedId |
Body |
text |
Yes |
Unique identifier of the student (user). References a record that is/was created in the users.csv file with type of 'student'. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.student_sourced_id |
scoreStatus |
Body |
text |
Yes |
Gradebook result state for the student's line item. It tells consumers whether the result is submitted, graded, exempt, or still missing wo... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.score_status |
score |
Body |
double precision |
No |
Numeric result value for the student's line item. When present, it must resolve to exactly one same-tenant effective score scale before per... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.score |
scoreDate |
Body |
date |
Yes |
The date the result was submitted and/or the 'scoreStatus' was changed. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.score_date |
comment |
Body |
text |
No |
Human readable comment about the result. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.comment |
textScore |
Body |
text |
No |
Non-numeric gradebook value for the student's line item. When present, it must align with exactly one same-tenant effective score scale bef... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.text_score |
classSourcedId |
Body |
text |
No |
Unique identifier of the class. References a record that is/was created in the classes.csv file. This is a new column added in version 1.2. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.class_sourced_id |
inProgress |
Body |
text |
No |
Workflow flag that says assigned work is still in progress and a submitted work product is not expected yet. It affects gradebook interpret... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.in_progress |
incomplete |
Body |
text |
No |
Workflow flag that says submitted student work is present but incomplete. It can coexist with score_status values while the teacher resolve... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.incomplete |
late |
Body |
text |
No |
Workflow flag that says the work was submitted after the due date or is otherwise past due. It may affect scoring policy but does not chang... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.late |
missing |
Body |
text |
No |
Workflow flag that says expected work has not been submitted and is considered missing. It should not be inferred only from a blank score;... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.results.missing |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One results.csv record using OneRoster source field names and _platform metadata. |
oneroster.results |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.results |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.results.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.results.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this results row. |
oneroster.results.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.results.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.results.date_last_modified |
item.lineItemSourcedId |
text |
Yes |
Unique identifier of the lineItem. |
oneroster.results.line_item_sourced_id |
item.studentSourcedId |
text |
Yes |
Unique identifier of the student (user). References a record that is/was created in the users.csv file with type of 'student'. |
oneroster.results.student_sourced_id |
item.scoreStatus |
text |
Yes |
Gradebook result state for the student's line item. It tells consumers whether the result is submitted, graded, exempt, or still missing work. |
oneroster.results.score_status |
item.score |
double precision |
No |
Numeric result value for the student's line item. When present, it must resolve to exactly one same-tenant effective score scale before persistence and must stay consistent with l... |
oneroster.results.score |
item.scoreDate |
date |
Yes |
The date the result was submitted and/or the 'scoreStatus' was changed. |
oneroster.results.score_date |
item.comment |
text |
No |
Human readable comment about the result. |
oneroster.results.comment |
item.textScore |
text |
No |
Non-numeric gradebook value for the student's line item. When present, it must align with exactly one same-tenant effective score scale before persistence; a read-time hint cannot... |
oneroster.results.text_score |
item.classSourcedId |
text |
No |
Unique identifier of the class. References a record that is/was created in the classes.csv file. This is a new column added in version 1.2. |
oneroster.results.class_sourced_id |
item.inProgress |
text |
No |
Workflow flag that says assigned work is still in progress and a submitted work product is not expected yet. It affects gradebook interpretation, not row lifecycle. |
oneroster.results.in_progress |
item.incomplete |
text |
No |
Workflow flag that says submitted student work is present but incomplete. It can coexist with score_status values while the teacher resolves grading. |
oneroster.results.incomplete |
item.late |
text |
No |
Workflow flag that says the work was submitted after the due date or is otherwise past due. It may affect scoring policy but does not change the result row's tenant-scoped identit... |
oneroster.results.late |
item.missing |
text |
No |
Workflow flag that says expected work has not been submitted and is considered missing. It should not be inferred only from a blank score; the source must send the flag. |
oneroster.results.missing |
oneroster.result_score_scales.replace
Replace a Result Score Scales record
Replaces one /resultScoreScales resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/resultScoreScales/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/resultScoreScales/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-result-score-scales-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.result_score_scales.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.result_score_scales.date_last_modified |
title |
Body |
text |
No |
Name of the related scoreScale. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.result_score_scales.title |
resultSourcedId |
Body |
text |
Yes |
SourcedId of the reference Result. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.result_score_scales.result_sourced_id |
scoreScaleSourcedId |
Body |
text |
Yes |
SourcedId of the reference ScoreScale. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.result_score_scales.score_scale_sourced_id |
oneroster.roles.replace
Replace a Roles record
Replaces one /roles resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/roles/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/roles/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-roles-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.roles.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.roles.date_last_modified |
userSourcedId |
Body |
text |
Yes |
The user whose role is being defined. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.roles.user_sourced_id |
roleType |
Body |
text |
Yes |
Primary/secondary marker for a user's role inside one organization. Only one role per user/org should be primary for the same active date w... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.roles.role_type |
role |
Body |
text |
Yes |
Organization-level role assigned to the user. It is separate from enrollments.role: this field says what the person is in an org, while enr... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.roles.role |
beginDate |
Body |
date |
No |
The start date on which the role became active (inclusive). Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.roles.begin_date |
endDate |
Body |
date |
No |
The end date on which the role ceased to be active (exclusive). Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.roles.end_date |
orgSourcedId |
Body |
text |
Yes |
SourcedId of the Org within which the User has the assigned role. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.roles.org_sourced_id |
userProfileSourcedId |
Body |
text |
No |
SourcedId of the UserProfile for the User. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.roles.user_profile_sourced_id |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One roles.csv record using OneRoster source field names and _platform metadata. |
oneroster.roles |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.roles |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.roles.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.roles.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this roles row. |
oneroster.roles.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.roles.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.roles.date_last_modified |
item.userSourcedId |
text |
Yes |
The user whose role is being defined. |
oneroster.roles.user_sourced_id |
item.roleType |
text |
Yes |
Primary/secondary marker for a user's role inside one organization. Only one role per user/org should be primary for the same active date window. |
oneroster.roles.role_type |
item.role |
text |
Yes |
Organization-level role assigned to the user. It is separate from enrollments.role: this field says what the person is in an org, while enrollments.role says what they are in a cl... |
oneroster.roles.role |
item.beginDate |
date |
No |
The start date on which the role became active (inclusive). |
oneroster.roles.begin_date |
item.endDate |
date |
No |
The end date on which the role ceased to be active (exclusive). |
oneroster.roles.end_date |
item.orgSourcedId |
text |
Yes |
SourcedId of the Org within which the User has the assigned role. |
oneroster.roles.org_sourced_id |
item.userProfileSourcedId |
text |
No |
SourcedId of the UserProfile for the User. |
oneroster.roles.user_profile_sourced_id |
oneroster.score_scales.replace
Replace a Score Scales record
Replaces one /scoreScales resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/scoreScales/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/scoreScales/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-score-scales-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.score_scales.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.score_scales.date_last_modified |
title |
Body |
text |
Yes |
A human readable title for the score scale. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.score_scales.title |
type |
Body |
text |
Yes |
The type of score scaling e.g. percent. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.score_scales.type |
orgSourcedId |
Body |
text |
Yes |
The org for which the score scale is used. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.score_scales.org_sourced_id |
courseSourcedId |
Body |
text |
Yes |
The course for which the score scale is used. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.score_scales.course_sourced_id |
classSourcedId |
Body |
text |
Yes |
The class for which the score scale is used. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.score_scales.class_sourced_id |
scoreScaleValue |
Body |
text |
Yes |
OneRoster score-scale mapping cell. Each {left:right} pair maps a source scale label or range to a target value and multiple mappings stay... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.score_scales.score_scale_value |
oneroster.user_profiles.replace
Replace a User Profiles record
Replaces one /userProfiles resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/userProfiles/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/userProfiles/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-user-profiles-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_profiles.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_profiles.date_last_modified |
userSourcedId |
Body |
text |
Yes |
Unique ID for the corresponding user. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_profiles.user_sourced_id |
profileType |
Body |
text |
Yes |
The type of user profile. This should be a human readable label that has some significance in the context of the related system, app, tool,... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_profiles.profile_type |
vendorId |
Body |
text |
Yes |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this user profile. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_profiles.vendor_id |
applicationId |
Body |
text |
No |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this account. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_profiles.application_id |
description |
Body |
text |
No |
A human readable description of the use of the account. This should not contain any security information for access to the account. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_profiles.description |
credentialType |
Body |
text |
Yes |
The type of credentials for the user profile. This should be indicative of when this credential should be used. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_profiles.credential_type |
username |
Body |
text |
Yes |
The username for this profile. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_profiles.username |
password |
Body |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted, the processing system must be aware of the encryption... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_profiles.password |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One userProfiles.csv record using OneRoster source field names and _platform metadata. |
oneroster.user_profiles |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.user_profiles |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.user_profiles.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.user_profiles.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this user profiles row. |
oneroster.user_profiles.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.user_profiles.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.user_profiles.date_last_modified |
item.userSourcedId |
text |
Yes |
Unique ID for the corresponding user. |
oneroster.user_profiles.user_sourced_id |
item.profileType |
text |
Yes |
The type of user profile. This should be a human readable label that has some significance in the context of the related system, app, tool, etc. |
oneroster.user_profiles.profile_type |
item.vendorId |
text |
Yes |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this user profile. |
oneroster.user_profiles.vendor_id |
item.applicationId |
text |
No |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this account. |
oneroster.user_profiles.application_id |
item.description |
text |
No |
A human readable description of the use of the account. This should not contain any security information for access to the account. |
oneroster.user_profiles.description |
item.credentialType |
text |
Yes |
The type of credentials for the user profile. This should be indicative of when this credential should be used. |
oneroster.user_profiles.credential_type |
item.username |
text |
Yes |
The username for this profile. |
oneroster.user_profiles.username |
item.password |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted, the processing system must be aware of the encryption method. |
oneroster.user_profiles.password |
oneroster.user_resources.replace
Replace a User Resources record
Replaces one /userResources resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/userResources/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/userResources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-user-resources-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_resources.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_resources.date_last_modified |
userSourcedId |
Body |
text |
Yes |
SourcedId of the user who will have access to this resource. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_resources.user_sourced_id |
orgSourcedId |
Body |
text |
No |
SourcedId of the reference Organization. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_resources.org_sourced_id |
classSourcedId |
Body |
text |
No |
SourcedId of the reference Class. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_resources.class_sourced_id |
resourceSourcedId |
Body |
text |
Yes |
SourcedId of the Resource associated with the User. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.user_resources.resource_sourced_id |
oneroster.users.replace
Replace a Users record
Replaces one /users resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/users/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/users/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-users-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.date_last_modified |
enabledUser |
Body |
text |
Yes |
Source-system account availability flag for the user row. true means the source considers the user enabled; false preserves the roster iden... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.enabled_user |
username |
Body |
text |
Yes |
User name. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.username |
userIds |
Body |
text |
No |
External machine-readable ID (e.g. LDAP id, LTI id) for this user. The ID must be accompanied by a type to indicate the nature of the Ident... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.user_ids |
givenName |
Body |
text |
Yes |
User's first name. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.given_name |
familyName |
Body |
text |
Yes |
User's surname. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.family_name |
middleName |
Body |
text |
No |
User's middle name(s). If more than one then they are separated by a space. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.middle_name |
identifier |
Body |
text |
No |
Identifier for the user with a human readable meaning. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.identifier |
email |
Body |
text |
No |
Email address for the User. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.email |
sms |
Body |
text |
No |
SMS address for the User. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.sms |
phone |
Body |
text |
No |
Phone number for the User. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.phone |
agentSourcedIds |
Body |
text |
No |
SourcedIds of the Users to which this user has a relationship. If multiple IDs are required then use double quotes and separate with commas... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.agent_sourced_ids |
grades |
Body |
text |
No |
Grade(s) for which a user with role 'student' is enrolled. The permitted vocabulary should be agreed as part of the definition of the usage... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.grades |
password |
Body |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted the processing system must be aware of the encryption m... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.password |
userMasterIdentifier |
Body |
text |
No |
The master identifier that could be used to provide globally unique identification of the user across all of the tools, systems, apps, etc.... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.user_master_identifier |
preferredGivenName |
Body |
text |
No |
The given name by which the User prefers to be known. This is a new column added in version 1.2. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.preferred_given_name |
preferredMiddleName |
Body |
text |
No |
The middle names by which the User prefers to be known. This is a new column added in version 1.2. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.preferred_middle_name |
preferredFamilyName |
Body |
text |
No |
The family name by which the User prefers to be known. This is a new column added in version 1.2. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.preferred_family_name |
primaryOrgSourcedId |
Body |
text |
No |
The sourcedId of the primary 'org' for the 'user'. In OR 1.2 a user can have one or more 'roles' in one or more 'org's and so this field ca... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.primary_org_sourced_id |
pronouns |
Body |
text |
No |
The pronoun(s) by which this person is referenced. Examples (in the case of English) include 'she/her/hers', 'he/him/his', 'they/them/their... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.users.pronouns |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One users.csv record using OneRoster source field names and _platform metadata. |
oneroster.users |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.users |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.users.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.users.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this users row. |
oneroster.users.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.users.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.users.date_last_modified |
item.enabledUser |
text |
Yes |
Source-system account availability flag for the user row. true means the source considers the user enabled; false preserves the roster identity but tells platform3 not to treat th... |
oneroster.users.enabled_user |
item.username |
text |
Yes |
User name. |
oneroster.users.username |
item.userIds |
text |
No |
External machine-readable ID (e.g. LDAP id, LTI id) for this user. The ID must be accompanied by a type to indicate the nature of the Identifier. The Type and ID values are enclos... |
oneroster.users.user_ids |
item.givenName |
text |
Yes |
User's first name. |
oneroster.users.given_name |
item.familyName |
text |
Yes |
User's surname. |
oneroster.users.family_name |
item.middleName |
text |
No |
User's middle name(s). If more than one then they are separated by a space. |
oneroster.users.middle_name |
item.identifier |
text |
No |
Identifier for the user with a human readable meaning. |
oneroster.users.identifier |
item.email |
text |
No |
Email address for the User. |
oneroster.users.email |
item.sms |
text |
No |
SMS address for the User. |
oneroster.users.sms |
item.phone |
text |
No |
Phone number for the User. |
oneroster.users.phone |
item.agentSourcedIds |
text |
No |
SourcedIds of the Users to which this user has a relationship. If multiple IDs are required then use double quotes and separate with commas. Note: In most cases this will be for i... |
oneroster.users.agent_sourced_ids |
item.grades |
text |
No |
Grade(s) for which a user with role 'student' is enrolled. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.users.grades |
item.password |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted the processing system must be aware of the encryption method. |
oneroster.users.password |
item.userMasterIdentifier |
text |
No |
The master identifier that could be used to provide globally unique identification of the user across all of the tools, systems, apps, etc. available/accessed by the user. This is... |
oneroster.users.user_master_identifier |
item.preferredGivenName |
text |
No |
The given name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_given_name |
item.preferredMiddleName |
text |
No |
The middle names by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_middle_name |
item.preferredFamilyName |
text |
No |
The family name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_family_name |
item.primaryOrgSourcedId |
text |
No |
The sourcedId of the primary 'org' for the 'user'. In OR 1.2 a user can have one or more 'roles' in one or more 'org's and so this field can be used for identification of the prim... |
oneroster.users.primary_org_sourced_id |
item.pronouns |
text |
No |
The pronoun(s) by which this person is referenced. Examples (in the case of English) include 'she/her/hers', 'he/him/his', 'they/them/theirs', 'ze/hir/hir', 'xe/xir', or a stateme... |
oneroster.users.pronouns |
oneroster.grading_periods.replace
Replace a Grading Periods record
Replaces one /gradingPeriods resource. The client must first read the resource, keep its ETag, and send that value in If-Match.
#
- Method
PUT
- Path
/gradingPeriods/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PUT "$BASE_URL/gradingPeriods/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: replace-grading-periods-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
Conditional |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.status |
dateLastModified |
Body |
timestamptz |
Conditional |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.date_last_modified |
title |
Body |
text |
Yes |
Name or title of the academic session. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.title |
type |
Body |
text |
Yes |
Calendar-window type for the academic session. Courses usually point at schoolYear, classes usually list term or semester rows, and gradebo... Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.type |
startDate |
Body |
date |
Yes |
Inclusive end date for the academic session. ISO 8601 format [ISO8601]. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.start_date |
endDate |
Body |
date |
Yes |
Exclusive end date for the academic session. ISO 8601 format [ISO8601]. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.end_date |
parentSourcedId |
Body |
text |
No |
SourcedId of the parent of this academic session. Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.parent_sourced_id |
schoolYear |
Body |
integer |
Yes |
The school year for which the academic session contributes. This year should be that in which the school year ends (Format is: YYYY). Path sourcedId identifies the row; body sourcedId is omitted to avoid mismatches. |
oneroster.academic_sessions.school_year |
oneroster.academic_sessions.patch
Patch a Academic Sessions record
Partially updates one /academicSessions resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/academicSessions/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/academicSessions/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-academic-sessions-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.academic_sessions.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.academic_sessions.date_last_modified |
title |
Body |
text |
No; at least one mutable field is required |
Name or title of the academic session. |
oneroster.academic_sessions.title |
type |
Body |
text |
No; at least one mutable field is required |
Calendar-window type for the academic session. Courses usually point at schoolYear, classes usually list term or semester rows, and gradebook reporting can use gradingPeriod. |
oneroster.academic_sessions.type |
startDate |
Body |
date |
No; at least one mutable field is required |
Inclusive end date for the academic session. ISO 8601 format [ISO8601]. |
oneroster.academic_sessions.start_date |
endDate |
Body |
date |
No; at least one mutable field is required |
Exclusive end date for the academic session. ISO 8601 format [ISO8601]. |
oneroster.academic_sessions.end_date |
parentSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the parent of this academic session. |
oneroster.academic_sessions.parent_sourced_id |
schoolYear |
Body |
integer |
No; at least one mutable field is required |
The school year for which the academic session contributes. This year should be that in which the school year ends (Format is: YYYY). |
oneroster.academic_sessions.school_year |
oneroster.categories.patch
Patch a Categories record
Partially updates one /categories resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/categories/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/categories/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-categories-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.categories.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.categories.date_last_modified |
title |
Body |
text |
No; at least one mutable field is required |
The title assigned to the set of lineItems to denote its nature e.g. homework, essays, etc. |
oneroster.categories.title |
weight |
Body |
integer |
No; at least one mutable field is required |
Total weight of this grading category in calculation of course final score. This is a Percent value only, e.g. 80%. This is a new column added in version 1.2. |
oneroster.categories.weight |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One categories.csv record using OneRoster source field names and _platform metadata. |
oneroster.categories |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.categories |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.categories.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.categories.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this categories row. |
oneroster.categories.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.categories.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.categories.date_last_modified |
item.title |
text |
Yes |
The title assigned to the set of lineItems to denote its nature e.g. homework, essays, etc. |
oneroster.categories.title |
item.weight |
integer |
No |
Total weight of this grading category in calculation of course final score. This is a Percent value only, e.g. 80%. This is a new column added in version 1.2. |
oneroster.categories.weight |
oneroster.classes.patch
Patch a Classes record
Partially updates one /classes resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/classes/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/classes/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-classes-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.classes.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.classes.date_last_modified |
title |
Body |
text |
No; at least one mutable field is required |
Name of this class. |
oneroster.classes.title |
grades |
Body |
text |
No; at least one mutable field is required |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.classes.grades |
courseSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the course of which this class is an instance. |
oneroster.classes.course_sourced_id |
classCode |
Body |
text |
No; at least one mutable field is required |
Human readable code used to help identify this class. |
oneroster.classes.class_code |
classType |
Body |
text |
No; at least one mutable field is required |
Class scheduling category. scheduled is an ordinary instructional section; homeroom is a homeroom grouping that may not carry the same course schedule semantics. |
oneroster.classes.class_type |
location |
Body |
text |
No; at least one mutable field is required |
Human readable description of where the class is physically located. |
oneroster.classes.location |
schoolSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the Org that teaches this class of OrgType 'school'. |
oneroster.classes.school_sourced_id |
termSourcedIds |
Body |
text |
No; at least one mutable field is required |
SourcedIds of the terms (the academicSessions) in which the class is taught. |
oneroster.classes.term_sourced_ids |
subjects |
Body |
text |
No; at least one mutable field is required |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance. The permit... |
oneroster.classes.subjects |
subjectCodes |
Body |
text |
No; at least one mutable field is required |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is present the t... |
oneroster.classes.subject_codes |
periods |
Body |
text |
No; at least one mutable field is required |
The time slots in the day that the class will be given. If more than one period is needed, use double quotes, and separate with commas (per [RFC4180]). Examples: 1; "1,3,5" |
oneroster.classes.periods |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One classes.csv record using OneRoster source field names and _platform metadata. |
oneroster.classes |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.classes |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.classes.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.classes.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this classes row. |
oneroster.classes.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.classes.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.classes.date_last_modified |
item.title |
text |
Yes |
Name of this class. |
oneroster.classes.title |
item.grades |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.classes.grades |
item.courseSourcedId |
text |
Yes |
SourcedId of the course of which this class is an instance. |
oneroster.classes.course_sourced_id |
item.classCode |
text |
No |
Human readable code used to help identify this class. |
oneroster.classes.class_code |
item.classType |
text |
Yes |
Class scheduling category. scheduled is an ordinary instructional section; homeroom is a homeroom grouping that may not carry the same course schedule semantics. |
oneroster.classes.class_type |
item.location |
text |
No |
Human readable description of where the class is physically located. |
oneroster.classes.location |
item.schoolSourcedId |
text |
Yes |
SourcedId of the Org that teaches this class of OrgType 'school'. |
oneroster.classes.school_sourced_id |
item.termSourcedIds |
text |
Yes |
SourcedIds of the terms (the academicSessions) in which the class is taught. |
oneroster.classes.term_sourced_ids |
item.subjects |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance.... |
oneroster.classes.subjects |
item.subjectCodes |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is pre... |
oneroster.classes.subject_codes |
item.periods |
text |
No |
The time slots in the day that the class will be given. If more than one period is needed, use double quotes, and separate with commas (per [RFC4180]). Examples: 1; "1,3,5" |
oneroster.classes.periods |
oneroster.class_resources.patch
Patch a Class Resources record
Partially updates one /classResources resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/classResources/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/classResources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-class-resources-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.class_resources.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.class_resources.date_last_modified |
title |
Body |
text |
No; at least one mutable field is required |
Name of the related class. |
oneroster.class_resources.title |
classSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the reference Class. |
oneroster.class_resources.class_sourced_id |
resourceSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the Resource associated with the Class. |
oneroster.class_resources.resource_sourced_id |
oneroster.course_resources.patch
Patch a Course Resources record
Partially updates one /courseResources resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/courseResources/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/courseResources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-course-resources-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.course_resources.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.course_resources.date_last_modified |
title |
Body |
text |
No; at least one mutable field is required |
Name of the related class. |
oneroster.course_resources.title |
courseSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the reference Course. |
oneroster.course_resources.course_sourced_id |
resourceSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the Resource associated with the Course. |
oneroster.course_resources.resource_sourced_id |
oneroster.courses.patch
Patch a Courses record
Partially updates one /courses resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/courses/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/courses/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-courses-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.courses.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.courses.date_last_modified |
schoolYearSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the associated AcademicSession with type of 'schoolYear'. |
oneroster.courses.school_year_sourced_id |
title |
Body |
text |
No; at least one mutable field is required |
Name of this course. |
oneroster.courses.title |
courseCode |
Body |
text |
No; at least one mutable field is required |
Human readable code used to help identify this course. |
oneroster.courses.course_code |
grades |
Body |
text |
No; at least one mutable field is required |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.courses.grades |
orgSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of an org to which this course belongs. |
oneroster.courses.org_sourced_id |
subjects |
Body |
text |
No; at least one mutable field is required |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance. The permit... |
oneroster.courses.subjects |
subjectCodes |
Body |
text |
No; at least one mutable field is required |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is present the t... |
oneroster.courses.subject_codes |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One courses.csv record using OneRoster source field names and _platform metadata. |
oneroster.courses |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.courses |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.courses.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.courses.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this courses row. |
oneroster.courses.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.courses.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.courses.date_last_modified |
item.schoolYearSourcedId |
text |
No |
SourcedId of the associated AcademicSession with type of 'schoolYear'. |
oneroster.courses.school_year_sourced_id |
item.title |
text |
Yes |
Name of this course. |
oneroster.courses.title |
item.courseCode |
text |
No |
Human readable code used to help identify this course. |
oneroster.courses.course_code |
item.grades |
text |
No |
Grade(s) for which the class is attended. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.courses.grades |
item.orgSourcedId |
text |
Yes |
SourcedId of an org to which this course belongs. |
oneroster.courses.org_sourced_id |
item.subjects |
text |
No |
Subject name(s) in human readable form. If the 'subjectCodes' attribute is present then the subjects and subjectCodes lists must have the same length and have order significance.... |
oneroster.courses.subjects |
item.subjectCodes |
text |
No |
Subject codes(s) in machine readable form. If more than one subject code is needed, use double quotes, and separate with commas (per [RFC4180]). If the 'subjects' attribute is pre... |
oneroster.courses.subject_codes |
oneroster.demographics.patch
Patch a Demographics record
Partially updates one /demographics resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/demographics/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/demographics/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-demographics-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.demographics.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.demographics.date_last_modified |
birthDate |
Body |
date |
No; at least one mutable field is required |
The date of birth. ISO 861 format: 'YYYY-MM-DD'. |
oneroster.demographics.birth_date |
sex |
Body |
text |
No; at least one mutable field is required |
Sex value reported by the source system for the user described by demographics.sourced_id. It is a sensitive demographic exchange field; unspecified preserves a deliberate source value rath... |
oneroster.demographics.sex |
americanIndianOrAlaskaNative |
Body |
text |
No; at least one mutable field is required |
Race category flag reported by the source system for the user described by demographics.sourced_id. This is one of several race indicators that may be true at the same time; it is demograph... |
oneroster.demographics.american_indian_or_alaska_native |
asian |
Body |
text |
No; at least one mutable field is required |
Race category flag reported by the source system for the user described by demographics.sourced_id. It can be true alongside other race indicators, and consumers must treat it as sensitive... |
oneroster.demographics.asian |
blackOrAfricanAmerican |
Body |
text |
No; at least one mutable field is required |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is independent of the other race flags and may coexist with demographic_race_two_or_mo... |
oneroster.demographics.black_or_african_american |
nativeHawaiianOrOtherPacificIslander |
Body |
text |
No; at least one mutable field is required |
Race category flag reported by the source system for the user described by demographics.sourced_id. It may be true alongside other race flags and must not be collapsed into a single display... |
oneroster.demographics.native_hawaiian_or_other_pacific_islander |
white |
Body |
text |
No; at least one mutable field is required |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is preserved exactly because downstream compliance reports often inspect each race cat... |
oneroster.demographics.white |
demographicRaceTwoOrMoreRaces |
Body |
text |
No; at least one mutable field is required |
OneRoster's explicit indicator that the source reports the user in two or more race categories. It should be true when the source asserts multi-race status; it does not erase the individual... |
oneroster.demographics.demographic_race_two_or_more_races |
hispanicOrLatinoEthnicity |
Body |
text |
No; at least one mutable field is required |
Ethnicity indicator reported by the source system for the user described by demographics.sourced_id. It is independent of race flags, may be true with any race combination, and is high-risk... |
oneroster.demographics.hispanic_or_latino_ethnicity |
countryOfBirthCode |
Body |
text |
No; at least one mutable field is required |
Country where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.country_of_birth_code |
stateOfBirthAbbreviation |
Body |
text |
No; at least one mutable field is required |
State where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.state_of_birth_abbreviation |
cityOfBirth |
Body |
text |
No; at least one mutable field is required |
City where the user was born. |
oneroster.demographics.city_of_birth |
publicSchoolResidenceStatus |
Body |
text |
No; at least one mutable field is required |
An indication of the location of the users legal residence relative to (within or outside) the boundaries of the public school attended and its administrative unit. The permitted vocabulary... |
oneroster.demographics.public_school_residence_status |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One demographics.csv record using OneRoster source field names and _platform metadata. |
oneroster.demographics |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.demographics |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.demographics.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.demographics.import_batch_id |
item.sourcedId |
text |
Yes |
The user's sourcedId; in demographics.csv this is the same identifier as the user whose demographics are being described. |
oneroster.demographics.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.demographics.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.demographics.date_last_modified |
item.birthDate |
date |
No |
The date of birth. ISO 861 format: 'YYYY-MM-DD'. |
oneroster.demographics.birth_date |
item.sex |
text |
No |
Sex value reported by the source system for the user described by demographics.sourced_id. It is a sensitive demographic exchange field; unspecified preserves a deliberate source... |
oneroster.demographics.sex |
item.americanIndianOrAlaskaNative |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. This is one of several race indicators that may be true at the same time; it is... |
oneroster.demographics.american_indian_or_alaska_native |
item.asian |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It can be true alongside other race indicators, and consumers must treat it as... |
oneroster.demographics.asian |
item.blackOrAfricanAmerican |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is independent of the other race flags and may coexist with demographic_race... |
oneroster.demographics.black_or_african_american |
item.nativeHawaiianOrOtherPacificIslander |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It may be true alongside other race flags and must not be collapsed into a sing... |
oneroster.demographics.native_hawaiian_or_other_pacific_islander |
item.white |
text |
No |
Race category flag reported by the source system for the user described by demographics.sourced_id. It is preserved exactly because downstream compliance reports often inspect eac... |
oneroster.demographics.white |
item.demographicRaceTwoOrMoreRaces |
text |
No |
OneRoster's explicit indicator that the source reports the user in two or more race categories. It should be true when the source asserts multi-race status; it does not erase the... |
oneroster.demographics.demographic_race_two_or_more_races |
item.hispanicOrLatinoEthnicity |
text |
No |
Ethnicity indicator reported by the source system for the user described by demographics.sourced_id. It is independent of race flags, may be true with any race combination, and is... |
oneroster.demographics.hispanic_or_latino_ethnicity |
item.countryOfBirthCode |
text |
No |
Country where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.country_of_birth_code |
item.stateOfBirthAbbreviation |
text |
No |
State where the user was born. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.demographics.state_of_birth_abbreviation |
item.cityOfBirth |
text |
No |
City where the user was born. |
oneroster.demographics.city_of_birth |
item.publicSchoolResidenceStatus |
text |
No |
An indication of the location of the users legal residence relative to (within or outside) the boundaries of the public school attended and its administrative unit. The permitted... |
oneroster.demographics.public_school_residence_status |
oneroster.enrollments.patch
Patch a Enrollments record
Partially updates one /enrollments resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/enrollments/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/enrollments/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-enrollments-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.enrollments.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.enrollments.date_last_modified |
classSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the Class. |
oneroster.enrollments.class_sourced_id |
schoolSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of an Org with type 'school'. |
oneroster.enrollments.school_sourced_id |
userSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the User. |
oneroster.enrollments.user_sourced_id |
role |
Body |
text |
No; at least one mutable field is required |
The user's class-level membership role for this enrollment. It drives whether the row represents a learner, teacher, proctor, or administrator in active-enrollment queries and must match th... |
oneroster.enrollments.role |
primary |
Body |
text |
No; at least one mutable field is required |
Teacher-primary marker for a class enrollment. It applies only when enrollments.role is teacher; true identifies the primary teacher for the class/date window, while student, proctor, and a... |
oneroster.enrollments.primary |
beginDate |
Body |
date |
No; at least one mutable field is required |
The start date for the enrollment (inclusive). This date must align with the associated academic session (term) identified in the class. |
oneroster.enrollments.begin_date |
endDate |
Body |
date |
No; at least one mutable field is required |
The end date for the enrollment (exclusive). This date must align with the associated academic session (term) identified for the class. |
oneroster.enrollments.end_date |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One enrollments.csv record using OneRoster source field names and _platform metadata. |
oneroster.enrollments |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.enrollments |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.enrollments.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.enrollments.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this enrollments row. |
oneroster.enrollments.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.enrollments.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.enrollments.date_last_modified |
item.classSourcedId |
text |
Yes |
SourcedId of the Class. |
oneroster.enrollments.class_sourced_id |
item.schoolSourcedId |
text |
Yes |
SourcedId of an Org with type 'school'. |
oneroster.enrollments.school_sourced_id |
item.userSourcedId |
text |
Yes |
SourcedId of the User. |
oneroster.enrollments.user_sourced_id |
item.role |
text |
Yes |
The user's class-level membership role for this enrollment. It drives whether the row represents a learner, teacher, proctor, or administrator in active-enrollment queries and mus... |
oneroster.enrollments.role |
item.primary |
text |
No |
Teacher-primary marker for a class enrollment. It applies only when enrollments.role is teacher; true identifies the primary teacher for the class/date window, while student, proc... |
oneroster.enrollments.primary |
item.beginDate |
date |
No |
The start date for the enrollment (inclusive). This date must align with the associated academic session (term) identified in the class. |
oneroster.enrollments.begin_date |
item.endDate |
date |
No |
The end date for the enrollment (exclusive). This date must align with the associated academic session (term) identified for the class. |
oneroster.enrollments.end_date |
oneroster.line_item_learning_objective_ids.patch
Patch a Line Item Learning Objective IDs record
Partially updates one /lineItemLearningObjectiveIds resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/lineItemLearningObjectiveIds/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/lineItemLearningObjectiveIds/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-line-item-learning-objective-ids-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.line_item_learning_objective_ids.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.line_item_learning_objective_ids.date_last_modified |
lineItemSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the parent LineItem for this learning objective. |
oneroster.line_item_learning_objective_ids.line_item_sourced_id |
source |
Body |
text |
No; at least one mutable field is required |
Vocabulary source for the learning objective identifier attached to a line item. case means the identifier should validate as an IMS CASE identifier; unknown preserves a sender value whose... |
oneroster.line_item_learning_objective_ids.source |
learningObjectiveId |
Body |
text |
No; at least one mutable field is required |
Unique identifier for the associated learning objective. If an 1EdTech CASE identifier then it MUST be a valid UUID URN. |
oneroster.line_item_learning_objective_ids.learning_objective_id |
oneroster.line_items.patch
Patch a Line Items record
Partially updates one /lineItems resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/lineItems/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/lineItems/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-line-items-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.line_items.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.line_items.date_last_modified |
title |
Body |
text |
No; at least one mutable field is required |
The title assigned to the lineItem. |
oneroster.line_items.title |
description |
Body |
text |
No; at least one mutable field is required |
Short description of the role of the lineItem. |
oneroster.line_items.description |
assignDate |
Body |
date |
No; at least one mutable field is required |
Date the associated activity was assigned. |
oneroster.line_items.assign_date |
dueDate |
Body |
date |
No; at least one mutable field is required |
Date the associated activity is due to be completed. |
oneroster.line_items.due_date |
classSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the Class. |
oneroster.line_items.class_sourced_id |
categorySourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the Category. |
oneroster.line_items.category_sourced_id |
academicSessionSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the academicSession to which the lineItem is based. |
oneroster.line_items.academic_session_sourced_id |
resultValueMin |
Body |
double precision |
No; at least one mutable field is required |
The minimum value permitted for the score (inclusive) e.g. 0.0. |
oneroster.line_items.result_value_min |
resultValueMax |
Body |
double precision |
No; at least one mutable field is required |
The maximum value permitted for the score (inclusive) e.g. 100.0. |
oneroster.line_items.result_value_max |
schoolSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the School. This is a new column added in version 1.2. |
oneroster.line_items.school_sourced_id |
oneroster.line_item_score_scales.patch
Patch a Line Item Score Scales record
Partially updates one /lineItemScoreScales resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/lineItemScoreScales/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/lineItemScoreScales/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-line-item-score-scales-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.line_item_score_scales.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.line_item_score_scales.date_last_modified |
title |
Body |
text |
No; at least one mutable field is required |
Name of the related scoreScale. |
oneroster.line_item_score_scales.title |
lineItemSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the reference LineItem. |
oneroster.line_item_score_scales.line_item_sourced_id |
scoreScaleSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the reference ScoreScale. |
oneroster.line_item_score_scales.score_scale_sourced_id |
oneroster.orgs.patch
Patch a Organizations record
Partially updates one /orgs resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/orgs/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/orgs/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-orgs-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.orgs.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.orgs.date_last_modified |
name |
Body |
text |
No; at least one mutable field is required |
Name of the organization. |
oneroster.orgs.name |
type |
Body |
text |
No; at least one mutable field is required |
Organization classification that determines which references this org row can satisfy. school is the value required by classes.school_sourced_id, enrollments.school_sourced_id, and line_ite... |
oneroster.orgs.type |
identifier |
Body |
text |
No; at least one mutable field is required |
Human readable identifier for this org e.g. NCES ID. |
oneroster.orgs.identifier |
parentSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of an Org representing the Parent organization. |
oneroster.orgs.parent_sourced_id |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One orgs.csv record using OneRoster source field names and _platform metadata. |
oneroster.orgs |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.orgs |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.orgs.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.orgs.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this orgs row. |
oneroster.orgs.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.orgs.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.orgs.date_last_modified |
item.name |
text |
Yes |
Name of the organization. |
oneroster.orgs.name |
item.type |
text |
Yes |
Organization classification that determines which references this org row can satisfy. school is the value required by classes.school_sourced_id, enrollments.school_sourced_id, an... |
oneroster.orgs.type |
item.identifier |
text |
No |
Human readable identifier for this org e.g. NCES ID. |
oneroster.orgs.identifier |
item.parentSourcedId |
text |
No |
SourcedId of an Org representing the Parent organization. |
oneroster.orgs.parent_sourced_id |
oneroster.resources.patch
Patch a Resources record
Partially updates one /resources resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/resources/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/resources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-resources-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.resources.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.resources.date_last_modified |
vendorResourceId |
Body |
text |
No; at least one mutable field is required |
Unique ID of this resource as allocated by the vendor. It is unique in the context of resource identifiers allocated by the vendor. |
oneroster.resources.vendor_resource_id |
title |
Body |
text |
No; at least one mutable field is required |
Name of this resource. |
oneroster.resources.title |
roles |
Body |
text |
No; at least one mutable field is required |
Audience roles for which a resource is intended. This is an enum list in one CSV cell, so several roles may receive the same resource without creating separate resource rows. |
oneroster.resources.roles |
importance |
Body |
text |
No; at least one mutable field is required |
Resource priority inside its class, course, or user context. primary marks the main resource mapping; secondary marks supporting material. |
oneroster.resources.importance |
vendorId |
Body |
text |
No; at least one mutable field is required |
Identifier of the vendor responsible for this resource. This unique ID will be assigned by 1EdTech during the OneRoster conformance process. |
oneroster.resources.vendor_id |
applicationId |
Body |
text |
No; at least one mutable field is required |
Identifier of the application associated with this resource. This identifier is assigned by the creator/vendor of the resource. |
oneroster.resources.application_id |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One resources.csv record using OneRoster source field names and _platform metadata. |
oneroster.resources |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.resources |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.resources.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.resources.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this resources row. |
oneroster.resources.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.resources.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.resources.date_last_modified |
item.vendorResourceId |
text |
Yes |
Unique ID of this resource as allocated by the vendor. It is unique in the context of resource identifiers allocated by the vendor. |
oneroster.resources.vendor_resource_id |
item.title |
text |
No |
Name of this resource. |
oneroster.resources.title |
item.roles |
text |
No |
Audience roles for which a resource is intended. This is an enum list in one CSV cell, so several roles may receive the same resource without creating separate resource rows. |
oneroster.resources.roles |
item.importance |
text |
No |
Resource priority inside its class, course, or user context. primary marks the main resource mapping; secondary marks supporting material. |
oneroster.resources.importance |
item.vendorId |
text |
No |
Identifier of the vendor responsible for this resource. This unique ID will be assigned by 1EdTech during the OneRoster conformance process. |
oneroster.resources.vendor_id |
item.applicationId |
text |
No |
Identifier of the application associated with this resource. This identifier is assigned by the creator/vendor of the resource. |
oneroster.resources.application_id |
oneroster.result_learning_objective_ids.patch
Patch a Result Learning Objective IDs record
Partially updates one /resultLearningObjectiveIds resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/resultLearningObjectiveIds/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/resultLearningObjectiveIds/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-result-learning-objective-ids-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.result_learning_objective_ids.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.result_learning_objective_ids.date_last_modified |
resultSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the parent Result for this learning objective. |
oneroster.result_learning_objective_ids.result_sourced_id |
source |
Body |
text |
No; at least one mutable field is required |
Vocabulary source for the learning objective identifier attached to a result. case means the identifier should validate as an IMS CASE identifier; unknown preserves a sender value whose sou... |
oneroster.result_learning_objective_ids.source |
learningObjectiveId |
Body |
text |
No; at least one mutable field is required |
Unique identifier for the associated learning objective. If a CASE identifier then it MUST be a valid UUID URN. |
oneroster.result_learning_objective_ids.learning_objective_id |
score |
Body |
double precision |
No; at least one mutable field is required |
The optional mastery score supplied as a numeric value. |
oneroster.result_learning_objective_ids.score |
textScore |
Body |
text |
No; at least one mutable field is required |
The optional mastery score supplied as a string. |
oneroster.result_learning_objective_ids.text_score |
oneroster.results.patch
Patch a Results record
Partially updates one /results resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/results/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/results/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-results-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.results.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.results.date_last_modified |
lineItemSourcedId |
Body |
text |
No; at least one mutable field is required |
Unique identifier of the lineItem. |
oneroster.results.line_item_sourced_id |
studentSourcedId |
Body |
text |
No; at least one mutable field is required |
Unique identifier of the student (user). References a record that is/was created in the users.csv file with type of 'student'. |
oneroster.results.student_sourced_id |
scoreStatus |
Body |
text |
No; at least one mutable field is required |
Gradebook result state for the student's line item. It tells consumers whether the result is submitted, graded, exempt, or still missing work. |
oneroster.results.score_status |
score |
Body |
double precision |
No; at least one mutable field is required |
Numeric result value for the student's line item. When present, it must resolve to exactly one same-tenant effective score scale before persistence and must stay consistent with lineItems r... |
oneroster.results.score |
scoreDate |
Body |
date |
No; at least one mutable field is required |
The date the result was submitted and/or the 'scoreStatus' was changed. |
oneroster.results.score_date |
comment |
Body |
text |
No; at least one mutable field is required |
Human readable comment about the result. |
oneroster.results.comment |
textScore |
Body |
text |
No; at least one mutable field is required |
Non-numeric gradebook value for the student's line item. When present, it must align with exactly one same-tenant effective score scale before persistence; a read-time hint cannot substitut... |
oneroster.results.text_score |
classSourcedId |
Body |
text |
No; at least one mutable field is required |
Unique identifier of the class. References a record that is/was created in the classes.csv file. This is a new column added in version 1.2. |
oneroster.results.class_sourced_id |
inProgress |
Body |
text |
No; at least one mutable field is required |
Workflow flag that says assigned work is still in progress and a submitted work product is not expected yet. It affects gradebook interpretation, not row lifecycle. |
oneroster.results.in_progress |
incomplete |
Body |
text |
No; at least one mutable field is required |
Workflow flag that says submitted student work is present but incomplete. It can coexist with score_status values while the teacher resolves grading. |
oneroster.results.incomplete |
late |
Body |
text |
No; at least one mutable field is required |
Workflow flag that says the work was submitted after the due date or is otherwise past due. It may affect scoring policy but does not change the result row's tenant-scoped identity. |
oneroster.results.late |
missing |
Body |
text |
No; at least one mutable field is required |
Workflow flag that says expected work has not been submitted and is considered missing. It should not be inferred only from a blank score; the source must send the flag. |
oneroster.results.missing |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One results.csv record using OneRoster source field names and _platform metadata. |
oneroster.results |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.results |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.results.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.results.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this results row. |
oneroster.results.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.results.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.results.date_last_modified |
item.lineItemSourcedId |
text |
Yes |
Unique identifier of the lineItem. |
oneroster.results.line_item_sourced_id |
item.studentSourcedId |
text |
Yes |
Unique identifier of the student (user). References a record that is/was created in the users.csv file with type of 'student'. |
oneroster.results.student_sourced_id |
item.scoreStatus |
text |
Yes |
Gradebook result state for the student's line item. It tells consumers whether the result is submitted, graded, exempt, or still missing work. |
oneroster.results.score_status |
item.score |
double precision |
No |
Numeric result value for the student's line item. When present, it must resolve to exactly one same-tenant effective score scale before persistence and must stay consistent with l... |
oneroster.results.score |
item.scoreDate |
date |
Yes |
The date the result was submitted and/or the 'scoreStatus' was changed. |
oneroster.results.score_date |
item.comment |
text |
No |
Human readable comment about the result. |
oneroster.results.comment |
item.textScore |
text |
No |
Non-numeric gradebook value for the student's line item. When present, it must align with exactly one same-tenant effective score scale before persistence; a read-time hint cannot... |
oneroster.results.text_score |
item.classSourcedId |
text |
No |
Unique identifier of the class. References a record that is/was created in the classes.csv file. This is a new column added in version 1.2. |
oneroster.results.class_sourced_id |
item.inProgress |
text |
No |
Workflow flag that says assigned work is still in progress and a submitted work product is not expected yet. It affects gradebook interpretation, not row lifecycle. |
oneroster.results.in_progress |
item.incomplete |
text |
No |
Workflow flag that says submitted student work is present but incomplete. It can coexist with score_status values while the teacher resolves grading. |
oneroster.results.incomplete |
item.late |
text |
No |
Workflow flag that says the work was submitted after the due date or is otherwise past due. It may affect scoring policy but does not change the result row's tenant-scoped identit... |
oneroster.results.late |
item.missing |
text |
No |
Workflow flag that says expected work has not been submitted and is considered missing. It should not be inferred only from a blank score; the source must send the flag. |
oneroster.results.missing |
oneroster.result_score_scales.patch
Patch a Result Score Scales record
Partially updates one /resultScoreScales resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/resultScoreScales/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/resultScoreScales/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-result-score-scales-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.result_score_scales.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.result_score_scales.date_last_modified |
title |
Body |
text |
No; at least one mutable field is required |
Name of the related scoreScale. |
oneroster.result_score_scales.title |
resultSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the reference Result. |
oneroster.result_score_scales.result_sourced_id |
scoreScaleSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the reference ScoreScale. |
oneroster.result_score_scales.score_scale_sourced_id |
oneroster.roles.patch
Patch a Roles record
Partially updates one /roles resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/roles/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/roles/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-roles-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.roles.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.roles.date_last_modified |
userSourcedId |
Body |
text |
No; at least one mutable field is required |
The user whose role is being defined. |
oneroster.roles.user_sourced_id |
roleType |
Body |
text |
No; at least one mutable field is required |
Primary/secondary marker for a user's role inside one organization. Only one role per user/org should be primary for the same active date window. |
oneroster.roles.role_type |
role |
Body |
text |
No; at least one mutable field is required |
Organization-level role assigned to the user. It is separate from enrollments.role: this field says what the person is in an org, while enrollments.role says what they are in a class. |
oneroster.roles.role |
beginDate |
Body |
date |
No; at least one mutable field is required |
The start date on which the role became active (inclusive). |
oneroster.roles.begin_date |
endDate |
Body |
date |
No; at least one mutable field is required |
The end date on which the role ceased to be active (exclusive). |
oneroster.roles.end_date |
orgSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the Org within which the User has the assigned role. |
oneroster.roles.org_sourced_id |
userProfileSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the UserProfile for the User. |
oneroster.roles.user_profile_sourced_id |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One roles.csv record using OneRoster source field names and _platform metadata. |
oneroster.roles |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.roles |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.roles.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.roles.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this roles row. |
oneroster.roles.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.roles.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.roles.date_last_modified |
item.userSourcedId |
text |
Yes |
The user whose role is being defined. |
oneroster.roles.user_sourced_id |
item.roleType |
text |
Yes |
Primary/secondary marker for a user's role inside one organization. Only one role per user/org should be primary for the same active date window. |
oneroster.roles.role_type |
item.role |
text |
Yes |
Organization-level role assigned to the user. It is separate from enrollments.role: this field says what the person is in an org, while enrollments.role says what they are in a cl... |
oneroster.roles.role |
item.beginDate |
date |
No |
The start date on which the role became active (inclusive). |
oneroster.roles.begin_date |
item.endDate |
date |
No |
The end date on which the role ceased to be active (exclusive). |
oneroster.roles.end_date |
item.orgSourcedId |
text |
Yes |
SourcedId of the Org within which the User has the assigned role. |
oneroster.roles.org_sourced_id |
item.userProfileSourcedId |
text |
No |
SourcedId of the UserProfile for the User. |
oneroster.roles.user_profile_sourced_id |
oneroster.score_scales.patch
Patch a Score Scales record
Partially updates one /scoreScales resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/scoreScales/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/scoreScales/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-score-scales-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.score_scales.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.score_scales.date_last_modified |
title |
Body |
text |
No; at least one mutable field is required |
A human readable title for the score scale. |
oneroster.score_scales.title |
type |
Body |
text |
No; at least one mutable field is required |
The type of score scaling e.g. percent. |
oneroster.score_scales.type |
orgSourcedId |
Body |
text |
No; at least one mutable field is required |
The org for which the score scale is used. |
oneroster.score_scales.org_sourced_id |
courseSourcedId |
Body |
text |
No; at least one mutable field is required |
The course for which the score scale is used. |
oneroster.score_scales.course_sourced_id |
classSourcedId |
Body |
text |
No; at least one mutable field is required |
The class for which the score scale is used. |
oneroster.score_scales.class_sourced_id |
scoreScaleValue |
Body |
text |
No; at least one mutable field is required |
OneRoster score-scale mapping cell. Each {left:right} pair maps a source scale label or range to a target value and multiple mappings stay in the same CSV cell. |
oneroster.score_scales.score_scale_value |
oneroster.user_profiles.patch
Patch a User Profiles record
Partially updates one /userProfiles resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/userProfiles/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/userProfiles/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-user-profiles-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.user_profiles.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.user_profiles.date_last_modified |
userSourcedId |
Body |
text |
No; at least one mutable field is required |
Unique ID for the corresponding user. |
oneroster.user_profiles.user_sourced_id |
profileType |
Body |
text |
No; at least one mutable field is required |
The type of user profile. This should be a human readable label that has some significance in the context of the related system, app, tool, etc. |
oneroster.user_profiles.profile_type |
vendorId |
Body |
text |
No; at least one mutable field is required |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this user profile. |
oneroster.user_profiles.vendor_id |
applicationId |
Body |
text |
No; at least one mutable field is required |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this account. |
oneroster.user_profiles.application_id |
description |
Body |
text |
No; at least one mutable field is required |
A human readable description of the use of the account. This should not contain any security information for access to the account. |
oneroster.user_profiles.description |
credentialType |
Body |
text |
No; at least one mutable field is required |
The type of credentials for the user profile. This should be indicative of when this credential should be used. |
oneroster.user_profiles.credential_type |
username |
Body |
text |
No; at least one mutable field is required |
The username for this profile. |
oneroster.user_profiles.username |
password |
Body |
text |
No; at least one mutable field is required |
The password for the user. This may or may not be an encrypted string. If encrypted, the processing system must be aware of the encryption method. |
oneroster.user_profiles.password |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One userProfiles.csv record using OneRoster source field names and _platform metadata. |
oneroster.user_profiles |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.user_profiles |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.user_profiles.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.user_profiles.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this user profiles row. |
oneroster.user_profiles.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.user_profiles.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.user_profiles.date_last_modified |
item.userSourcedId |
text |
Yes |
Unique ID for the corresponding user. |
oneroster.user_profiles.user_sourced_id |
item.profileType |
text |
Yes |
The type of user profile. This should be a human readable label that has some significance in the context of the related system, app, tool, etc. |
oneroster.user_profiles.profile_type |
item.vendorId |
text |
Yes |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this user profile. |
oneroster.user_profiles.vendor_id |
item.applicationId |
text |
No |
The unique identifier for the vendor of the system, tool, app, etc. which requires the use of this account. |
oneroster.user_profiles.application_id |
item.description |
text |
No |
A human readable description of the use of the account. This should not contain any security information for access to the account. |
oneroster.user_profiles.description |
item.credentialType |
text |
Yes |
The type of credentials for the user profile. This should be indicative of when this credential should be used. |
oneroster.user_profiles.credential_type |
item.username |
text |
Yes |
The username for this profile. |
oneroster.user_profiles.username |
item.password |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted, the processing system must be aware of the encryption method. |
oneroster.user_profiles.password |
oneroster.user_resources.patch
Patch a User Resources record
Partially updates one /userResources resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/userResources/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/userResources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-user-resources-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.user_resources.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.user_resources.date_last_modified |
userSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the user who will have access to this resource. |
oneroster.user_resources.user_sourced_id |
orgSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the reference Organization. |
oneroster.user_resources.org_sourced_id |
classSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the reference Class. |
oneroster.user_resources.class_sourced_id |
resourceSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the Resource associated with the User. |
oneroster.user_resources.resource_sourced_id |
oneroster.users.patch
Patch a Users record
Partially updates one /users resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/users/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/users/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-users-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.users.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.users.date_last_modified |
enabledUser |
Body |
text |
No; at least one mutable field is required |
Source-system account availability flag for the user row. true means the source considers the user enabled; false preserves the roster identity but tells platform3 not to treat the user as... |
oneroster.users.enabled_user |
username |
Body |
text |
No; at least one mutable field is required |
User name. |
oneroster.users.username |
userIds |
Body |
text |
No; at least one mutable field is required |
External machine-readable ID (e.g. LDAP id, LTI id) for this user. The ID must be accompanied by a type to indicate the nature of the Identifier. The Type and ID values are enclosed in '{}'... |
oneroster.users.user_ids |
givenName |
Body |
text |
No; at least one mutable field is required |
User's first name. |
oneroster.users.given_name |
familyName |
Body |
text |
No; at least one mutable field is required |
User's surname. |
oneroster.users.family_name |
middleName |
Body |
text |
No; at least one mutable field is required |
User's middle name(s). If more than one then they are separated by a space. |
oneroster.users.middle_name |
identifier |
Body |
text |
No; at least one mutable field is required |
Identifier for the user with a human readable meaning. |
oneroster.users.identifier |
email |
Body |
text |
No; at least one mutable field is required |
Email address for the User. |
oneroster.users.email |
sms |
Body |
text |
No; at least one mutable field is required |
SMS address for the User. |
oneroster.users.sms |
phone |
Body |
text |
No; at least one mutable field is required |
Phone number for the User. |
oneroster.users.phone |
agentSourcedIds |
Body |
text |
No; at least one mutable field is required |
SourcedIds of the Users to which this user has a relationship. If multiple IDs are required then use double quotes and separate with commas. Note: In most cases this will be for indicating... |
oneroster.users.agent_sourced_ids |
grades |
Body |
text |
No; at least one mutable field is required |
Grade(s) for which a user with role 'student' is enrolled. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.users.grades |
password |
Body |
text |
No; at least one mutable field is required |
The password for the user. This may or may not be an encrypted string. If encrypted the processing system must be aware of the encryption method. |
oneroster.users.password |
userMasterIdentifier |
Body |
text |
No; at least one mutable field is required |
The master identifier that could be used to provide globally unique identification of the user across all of the tools, systems, apps, etc. available/accessed by the user. This is a new col... |
oneroster.users.user_master_identifier |
preferredGivenName |
Body |
text |
No; at least one mutable field is required |
The given name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_given_name |
preferredMiddleName |
Body |
text |
No; at least one mutable field is required |
The middle names by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_middle_name |
preferredFamilyName |
Body |
text |
No; at least one mutable field is required |
The family name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_family_name |
primaryOrgSourcedId |
Body |
text |
No; at least one mutable field is required |
The sourcedId of the primary 'org' for the 'user'. In OR 1.2 a user can have one or more 'roles' in one or more 'org's and so this field can be used for identification of the primary 'org'.... |
oneroster.users.primary_org_sourced_id |
pronouns |
Body |
text |
No; at least one mutable field is required |
The pronoun(s) by which this person is referenced. Examples (in the case of English) include 'she/her/hers', 'he/him/his', 'they/them/theirs', 'ze/hir/hir', 'xe/xir', or a statement that th... |
oneroster.users.pronouns |
Response schema
| Field | Type | Required | Description | Trace |
headers.ETag |
HTTP entity tag |
Yes on detail and mutation responses |
Validator to send back in If-Match before an update or delete. |
OITD-104 |
item |
object |
Yes |
One users.csv record using OneRoster source field names and _platform metadata. |
oneroster.users |
links.dataDictionary |
string |
Yes |
Stable deep link to the source table in the OneRoster data dictionary. |
oneroster.users |
links.architecture |
string |
Yes |
Stable deep link to the architecture decision that owns the route projection. |
OITD-010 |
links.customerWebsite |
string |
Yes |
Stable deep link back to this endpoint card. |
customer_website |
item._platform.tenant_id |
uuid |
Yes |
Shared platform tenant that owns this OneRoster row. |
oneroster.users.tenant_id |
item._platform.import_batch_id |
text |
Yes |
Import/export evidence row that produced this generated OneRoster projection row. |
oneroster.users.import_batch_id |
item.sourcedId |
text |
Yes |
Tenant-scoped OneRoster identifier for this users row. |
oneroster.users.sourced_id |
item.status |
text |
Yes for Delta |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.users.status |
item.dateLastModified |
timestamptz |
Yes for Delta |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.users.date_last_modified |
item.enabledUser |
text |
Yes |
Source-system account availability flag for the user row. true means the source considers the user enabled; false preserves the roster identity but tells platform3 not to treat th... |
oneroster.users.enabled_user |
item.username |
text |
Yes |
User name. |
oneroster.users.username |
item.userIds |
text |
No |
External machine-readable ID (e.g. LDAP id, LTI id) for this user. The ID must be accompanied by a type to indicate the nature of the Identifier. The Type and ID values are enclos... |
oneroster.users.user_ids |
item.givenName |
text |
Yes |
User's first name. |
oneroster.users.given_name |
item.familyName |
text |
Yes |
User's surname. |
oneroster.users.family_name |
item.middleName |
text |
No |
User's middle name(s). If more than one then they are separated by a space. |
oneroster.users.middle_name |
item.identifier |
text |
No |
Identifier for the user with a human readable meaning. |
oneroster.users.identifier |
item.email |
text |
No |
Email address for the User. |
oneroster.users.email |
item.sms |
text |
No |
SMS address for the User. |
oneroster.users.sms |
item.phone |
text |
No |
Phone number for the User. |
oneroster.users.phone |
item.agentSourcedIds |
text |
No |
SourcedIds of the Users to which this user has a relationship. If multiple IDs are required then use double quotes and separate with commas. Note: In most cases this will be for i... |
oneroster.users.agent_sourced_ids |
item.grades |
text |
No |
Grade(s) for which a user with role 'student' is enrolled. The permitted vocabulary should be agreed as part of the definition of the usage of this specification. |
oneroster.users.grades |
item.password |
text |
No |
The password for the user. This may or may not be an encrypted string. If encrypted the processing system must be aware of the encryption method. |
oneroster.users.password |
item.userMasterIdentifier |
text |
No |
The master identifier that could be used to provide globally unique identification of the user across all of the tools, systems, apps, etc. available/accessed by the user. This is... |
oneroster.users.user_master_identifier |
item.preferredGivenName |
text |
No |
The given name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_given_name |
item.preferredMiddleName |
text |
No |
The middle names by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_middle_name |
item.preferredFamilyName |
text |
No |
The family name by which the User prefers to be known. This is a new column added in version 1.2. |
oneroster.users.preferred_family_name |
item.primaryOrgSourcedId |
text |
No |
The sourcedId of the primary 'org' for the 'user'. In OR 1.2 a user can have one or more 'roles' in one or more 'org's and so this field can be used for identification of the prim... |
oneroster.users.primary_org_sourced_id |
item.pronouns |
text |
No |
The pronoun(s) by which this person is referenced. Examples (in the case of English) include 'she/her/hers', 'he/him/his', 'they/them/theirs', 'ze/hir/hir', 'xe/xir', or a stateme... |
oneroster.users.pronouns |
oneroster.grading_periods.patch
Patch a Grading Periods record
Partially updates one /gradingPeriods resource. Current live accepts known OneRoster fields from the request schema below and ignores unknown JSON fields; stale validators return 412 or 409.
#
- Method
PATCH
- Path
/gradingPeriods/{sourcedId}
- Auth
- Bearer JWT with write scope and relationship visibility
- Status
- 200400401403404409412428422429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X PATCH "$BASE_URL/gradingPeriods/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: patch-grading-periods-001" \
-H "Content-Type: application/json" \
--data '{"status":"active"}'
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
Content-Type |
Header |
application/json |
Yes when a JSON body is sent |
JSON mutation payload. CSV package import uses multipart/form-data instead. |
OITD-010 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId. The path value is authoritative. |
OITD-102 |
status |
Body |
text |
No; at least one mutable field is required |
Delta-mode lifecycle marker for this row. active means the row is current; tobedeleted means the source system is deleting or retiring it. |
oneroster.academic_sessions.status |
dateLastModified |
Body |
timestamptz |
No; at least one mutable field is required |
Delta-mode timestamp for the last source-system change to this row. It is deliberately absent in bulk files. |
oneroster.academic_sessions.date_last_modified |
title |
Body |
text |
No; at least one mutable field is required |
Name or title of the academic session. |
oneroster.academic_sessions.title |
type |
Body |
text |
No; at least one mutable field is required |
Calendar-window type for the academic session. Courses usually point at schoolYear, classes usually list term or semester rows, and gradebook reporting can use gradingPeriod. |
oneroster.academic_sessions.type |
startDate |
Body |
date |
No; at least one mutable field is required |
Inclusive end date for the academic session. ISO 8601 format [ISO8601]. |
oneroster.academic_sessions.start_date |
endDate |
Body |
date |
No; at least one mutable field is required |
Exclusive end date for the academic session. ISO 8601 format [ISO8601]. |
oneroster.academic_sessions.end_date |
parentSourcedId |
Body |
text |
No; at least one mutable field is required |
SourcedId of the parent of this academic session. |
oneroster.academic_sessions.parent_sourced_id |
schoolYear |
Body |
integer |
No; at least one mutable field is required |
The school year for which the academic session contributes. This year should be that in which the school year ends (Format is: YYYY). |
oneroster.academic_sessions.school_year |
oneroster.academic_sessions.delete
Delete a Academic Sessions record
Deletes or tombstones one /academicSessions resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/academicSessions/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/academicSessions/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-academic-sessions-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.categories.delete
Delete a Categories record
Deletes or tombstones one /categories resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/categories/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/categories/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-categories-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.classes.delete
Delete a Classes record
Deletes or tombstones one /classes resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/classes/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/classes/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-classes-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.class_resources.delete
Delete a Class Resources record
Deletes or tombstones one /classResources resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/classResources/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/classResources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-class-resources-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.course_resources.delete
Delete a Course Resources record
Deletes or tombstones one /courseResources resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/courseResources/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/courseResources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-course-resources-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.courses.delete
Delete a Courses record
Deletes or tombstones one /courses resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/courses/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/courses/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-courses-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.demographics.delete
Delete a Demographics record
Deletes or tombstones one /demographics resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/demographics/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/demographics/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-demographics-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.enrollments.delete
Delete a Enrollments record
Deletes or tombstones one /enrollments resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/enrollments/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/enrollments/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-enrollments-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.line_item_learning_objective_ids.delete
Delete a Line Item Learning Objective IDs record
Deletes or tombstones one /lineItemLearningObjectiveIds resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/lineItemLearningObjectiveIds/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/lineItemLearningObjectiveIds/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-line-item-learning-objective-ids-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.line_items.delete
Delete a Line Items record
Deletes or tombstones one /lineItems resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/lineItems/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/lineItems/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-line-items-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.line_item_score_scales.delete
Delete a Line Item Score Scales record
Deletes or tombstones one /lineItemScoreScales resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/lineItemScoreScales/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/lineItemScoreScales/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-line-item-score-scales-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.orgs.delete
Delete a Organizations record
Deletes or tombstones one /orgs resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/orgs/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/orgs/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-orgs-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.resources.delete
Delete a Resources record
Deletes or tombstones one /resources resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/resources/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/resources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-resources-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.result_learning_objective_ids.delete
Delete a Result Learning Objective IDs record
Deletes or tombstones one /resultLearningObjectiveIds resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/resultLearningObjectiveIds/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/resultLearningObjectiveIds/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-result-learning-objective-ids-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.results.delete
Delete a Results record
Deletes or tombstones one /results resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/results/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/results/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-results-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.result_score_scales.delete
Delete a Result Score Scales record
Deletes or tombstones one /resultScoreScales resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/resultScoreScales/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/resultScoreScales/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-result-score-scales-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.roles.delete
Delete a Roles record
Deletes or tombstones one /roles resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/roles/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/roles/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-roles-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.score_scales.delete
Delete a Score Scales record
Deletes or tombstones one /scoreScales resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/scoreScales/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/scoreScales/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-score-scales-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.user_profiles.delete
Delete a User Profiles record
Deletes or tombstones one /userProfiles resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/userProfiles/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/userProfiles/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-user-profiles-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.user_resources.delete
Delete a User Resources record
Deletes or tombstones one /userResources resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/userResources/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/userResources/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-user-resources-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.users.delete
Delete a Users record
Deletes or tombstones one /users resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/users/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/users/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-users-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |
oneroster.grading_periods.delete
Delete a Grading Periods record
Deletes or tombstones one /gradingPeriods resource according to the OneRoster status model and GDPR-style platform retention rules.
#
- Method
DELETE
- Path
/gradingPeriods/{sourcedId}
- Auth
- Bearer JWT with delete scope and relationship visibility
- Status
- 204400401403404409412428429
Trace: OITD-010 OITD-101 OITD-104 OITD-105 OITD-106 OITD-111 OITD-108
BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(node -e 'const fs=require("fs"); const body=JSON.parse(fs.readFileSync(0,"utf8")); console.log(body.token)' <<< "$TOKEN_JSON")"
RESOURCE_ID="replace-with-sourcedId-from-list-response"
ETAG="replace-with-etag-from-detail-response"
curl -fsS -X DELETE "$BASE_URL/gradingPeriods/$RESOURCE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: delete-grading-periods-001"
Request schema
| Field | Location | Type | Required | Description | Trace |
Authorization |
Header |
Bearer JWT |
Yes |
HS256 token signed with PLATFORM_JWT_SIGNING_SECRET and carrying iss, sub, iat, exp, tenant_id or tenantId, and role/roles/scopes. |
OITD-011 |
Idempotency-Key |
Header |
string |
Yes |
Required for retryable imports, exports, creates, updates, patches, and deletes. Same request hash replays; changed hash returns 409. |
OITD-105 |
If-Match |
Header |
HTTP entity tag |
Yes on update, patch, and delete |
Send the ETag from the most recent detail read. Missing precondition returns 428; stale validators return 412 or 409. |
OITD-104 |
sourcedId |
Path |
text |
Yes |
Tenant-scoped OneRoster sourcedId to delete or tombstone. |
OITD-102 |
body |
Body |
empty |
Yes |
No JSON request body. |
OITD-101 |
Response schema
| Field | Type | Required | Description | Trace |
body |
empty |
Yes |
No JSON body is returned for this status. Use the HTTP status, ETag headers, and Problem JSON on failures. |
OITD-111 |