OneRoster Endpoints


Triand's OneRoster Rostering REST API is a read-only service that exchanges roster data (orgs, users, courses, classes, enrollments, demographics). All endpoints are GET; POST, PUT, PATCH, and DELETE return 400.

Base URLs

VersionPrefix
v1.1https://oneroster-api.triand.com/ims/oneroster/v1p1/
v1.2https://oneroster-api.triand.com/ims/oneroster/rostering/v1p2/

The version is selected by the OAuth2 scope prefix on the access token (v1p1 vs v1p2). The URL prefix must match the scope prefix; mixing them returns 400. See Sample District for token retrieval.

Endpoints

All paths are relative to the version prefix above. {sourcedId} is the GUID-like identifier returned by the API.

Query Parameters

All collection endpoints accept the parameters below. Unknown parameters return 400.

ParameterNotes
limitPage size. Default 100. Use limit=0 with the X-Total-Count response header to get a count without data.
offsetStarting record offset. Default 0.
filterUp to two clauses joined by AND/OR. Predicates: =, !=, >, >=, <, <=, ~. Field names are validated against the model; unknown fields return 400. Example: filter=status='active' AND dateLastModified>'2025-01-01'
sortField to sort by. Invalid fields are ignored with a warning in the response status info.
orderByasc or desc. Used together with sort.
fieldsComma-separated subset of fields to return. Invalid fields are ignored with a warning.

Organizations & Schools

MethodPathReturns
GET/orgsAll organizations (districts and schools)
GET/orgs/{sourcedId}Single organization
GET/schoolsOrgs of type school
GET/schools/{sourcedId}Single school

Academic Sessions, Terms, Grading Periods

MethodPathReturns
GET/academicSessionsAll academic sessions
GET/academicSessions/{sourcedId}Single academic session
GET/termsSessions of type term or semester
GET/terms/{sourcedId}Single term
GET/gradingPeriodsSessions of type gradingPeriod
GET/gradingPeriods/{sourcedId}Single grading period
GET/schools/{schoolId}/termsTerms for a school
GET/terms/{termId}/gradingPeriodsGrading periods within a term

Courses

MethodPathReturns
GET/coursesAll courses
GET/courses/{sourcedId}Single course
GET/schools/{schoolId}/coursesCourses for a school

Classes

MethodPathReturns
GET/classesAll classes
GET/classes/{sourcedId}Single class
GET/courses/{courseId}/classesClasses for a course
GET/schools/{schoolId}/classesClasses for a school
GET/terms/{termId}/classesClasses for a term
GET/students/{studentId}/classesClasses a student is enrolled in
GET/teachers/{teacherId}/classesClasses a teacher teaches
GET/users/{userId}/classesClasses a user is associated with

Users, Students, Teachers

MethodPathReturns
GET/usersAll users (guardians require the guardians scope)
GET/users/{sourcedId}Single user
GET/studentsUsers with role student
GET/students/{sourcedId}Single student
GET/teachersUsers with role teacher
GET/teachers/{sourcedId}Single teacher
GET/schools/{schoolId}/studentsStudents at a school
GET/schools/{schoolId}/teachersTeachers at a school
GET/classes/{classId}/studentsStudents in a class
GET/classes/{classId}/teachersTeachers of a class
GET/schools/{schoolId}/classes/{classId}/studentsStudents in a class within a school
GET/schools/{schoolId}/classes/{classId}/teachersTeachers of a class within a school

Enrollments

MethodPathReturns
GET/enrollmentsAll enrollments
GET/enrollments/{sourcedId}Single enrollment
GET/schools/{schoolId}/enrollmentsEnrollments at a school
GET/schools/{schoolId}/classes/{classId}/enrollmentsEnrollments for a class within a school

Demographics

MethodPathReturns
GET/demographicsAll demographic records (requires roster-demographics.readonly scope)
GET/demographics/{sourcedId}Single demographic record

Response Format

Collection endpoints return a JSON object keyed by the plural resource name; single-item endpoints use the singular key. Collection responses include an X-Total-Count header.

// Collection
{ "users": [ { "sourcedId": "...", "givenName": "...", ... } ] }

// Single item
{ "user": { "sourcedId": "...", "givenName": "...", ... } }

Record Status & Soft Delete

Every resource (org, user, class, course, enrollment, academic session, demographic) carries a status field with one of two values:

  • "active" — the record is current.
  • "tobedeleted" — the record has been removed from the upstream SIS and is being torn down.

When an entity disappears from the source data on a nightly sync, its OneRoster record is flagged "tobedeleted" rather than removed immediately. It remains queryable in the API for roughly 7 days with that status, then is hard-deleted on a later nightly run. This window gives consuming systems a chance to detect the disappearance and reconcile their own data.

Vendors should treat "tobedeleted" as "remove on next sync." The dateLastModified on a flagged record is updated to the day it was marked, which is useful for delta-sync filters such as filter=dateLastModified>'2025-01-01'.

Errors

Errors return a JSON envelope with an statusInfoSet describing the failure. The same envelope is also used for non-fatal warnings (e.g., an unknown fields entry) alongside a 200.

{
  "statusInfoSet": {
    "imsx_codeMajor": "failure",
    "imsx_severity": "error",
    "imsx_codeMinor": "invalid_filter_field",
    "imsx_description": "unknown field 'foo' [GET /users?filter=foo='bar']"
  }
}

Scope-Gated Behavior

Some fields and roles are conditionally included based on the scopes granted on the access token:

  • guardians.readonly — includes users with role guardian in /users responses.
  • guardians-metadata.readonly — includes the metadata object on guardian users.
  • students-metadata.readonly — includes the metadata object on student users.
  • demographic-metadata.readonly — includes the metadata object on demographic records.
  • orgs-metadata.readonly — includes the metadata object on org responses.

See Data Dictionary for the full list of metadata fields and the scope each one requires.