Academic API
Base URL: /api/v1/academic/
Manage academic calendar, courses, sections, degrees, majors, minors, and requirements.
Endpoints Overview
Academic Calendar
| Resource | Endpoint | Description |
|---|---|---|
| Academic Years | /academic-years | Academic year management |
| Terms | /terms | Term/semester management |
| Sub-Terms | /sub-terms | Sub-term management |
| Term Campus Offerings | /term-campus-offerings | Campus-specific term availability |
Courses & Sections
| Resource | Endpoint | Description |
|---|---|---|
| Courses | /courses | Course catalog management |
| Course Attributes | /course-attributes | Course attribute tags |
| Course Requisites | /course-requisites | Prerequisites/corequisites |
| Course Equivalents | /course-equivalents | Course equivalencies |
| Course Patterns | /course-patterns | Flexible course matching patterns |
| Course Substitutions | /course-substitutions | Course substitution rules |
| Student Course Substitutions | /student-course-substitutions | Student-specific substitutions |
| Course Bulletins | /course-bulletins | Course-to-bulletin assignments |
| Course Materials | /course-materials | Course material assignments |
| Sections | /sections | Course section management |
| Section Schedules | /section-schedules | Meeting times |
| Section Instructors | /section-instructors | Instructor assignments |
| Section Materials | /section-materials | Section material assignments |
| Section Scheduling | /sections/{sectionID}/scheduling | Meeting times for a section |
| Materials | /materials | Material/textbook catalog |
Programs & Requirements
| Resource | Endpoint | Description |
|---|---|---|
| Degrees | /degrees | Degree programs |
| Degree Levels | /degree-levels | Degree level definitions (Bachelor's, Master's, etc.) |
| Degree Blocks | /degree-blocks | Degree-to-requirement block associations |
| Majors | /majors | Major programs |
| Minors | /minors | Minor programs |
| Requirement Blocks | /requirement-blocks | Degree requirement blocks |
| Requirement Items | /requirement-items | Items within requirement blocks |
| Requirement Groups | /requirement-groups | Requirement groupings |
| Requirement Group Rules | /requirement-group-rules | Rules within requirement groups |
| Schedule Templates | /schedule-templates | Schedule template management |
Grading & Bulletins
| Resource | Endpoint | Description |
|---|---|---|
| Grading Systems | /grading-systems | Grading scale definitions |
| Grades | /grades | Grade values within systems |
| Bulletins | /bulletins | Course catalogs by year |
Academic Calendar
Academic Years
List Academic Years
GET /api/v1/academic/academic-yearsQuery Parameters
| Parameter | Type | Description |
|---|---|---|
is_current | boolean | Filter by current year |
search | string | Search in year_code |
ordering | string | Sort by: year_code, start_date |
Success Response (200 OK)
{
"count": 5,
"results": [
{
"academic_year_id": 1,
"year_code": "2024-2025",
"start_date": "2024-08-01",
"end_date": "2025-07-31",
"is_current": true,
"term_count": 3
}
]
}Custom Actions
| Action | Method | Endpoint | Description |
|---|---|---|---|
| Get Terms | GET | /academic-years/{id}/terms | Get all terms for a year |
| Current | GET | /academic-years/current | Get the current academic year |
Academic Terms
List Terms
GET /api/v1/academic/termsQuery Parameters
| Parameter | Type | Description |
|---|---|---|
academic_year | integer | Filter by academic year ID |
is_current | boolean | Filter by current term |
term_type_id | integer | Filter by term type |
search | string | Search in term_code, term_name |
ordering | string | Sort by: start_date, term_code |
Success Response (200 OK)
{
"count": 12,
"results": [
{
"term_id": 1,
"term_code": "FA2024",
"term_name": "Fall 2024",
"academic_year_id": 1,
"academic_year_code": "2024-2025",
"term_type_code": "FALL",
"start_date": "2024-08-26",
"end_date": "2024-12-13",
"registration_open_date": "2024-04-01",
"is_current": true
}
]
}Custom Actions
| Action | Method | Endpoint | Description |
|---|---|---|---|
| Current | GET | /terms/current | Get the current term |
| Sections | GET | /terms/{id}/sections | Get sections offered in term |
| Available | GET | /terms/available_for_registration | Terms open for registration. With student_id, a term with registration windows also carries my_registration_opens_on and my_registration_window for that student |
add_deadline is the add/drop deadline. On create and update it must be on or before withdrawal_deadline (validation error on add_deadline), and drop_deadline is set equal to it: drop_deadline is returned but not accepted, and a value sent is ignored (migration 300). An update that touches neither deadline leaves them as they are, so past summer terms that keep their own drop date can still be edited. The database also holds drop_deadline <= withdrawal_deadline as a CHECK. registration_open_date cannot be moved after the term's earliest registration window.
Registration Windows
Staged registration start dates for a term (migration 289). A student may register from the earliest window whose rule they match. A window with rule: null is "everyone else", at most one per term. See Registration Windows.
| Method | Endpoint | Node | Description |
|---|---|---|---|
| GET | /terms/{termID}/registration-windows | ACADEMIC.TERMS | The term's windows and its open date |
| GET | /terms/{termID}/registration-windows/preview[?student_id=] | ACADEMIC.TERMS | How many current students each window decides; with student_id, that student's day and the facts behind it |
| POST | /terms/{termID}/registration-windows | ACADEMIC.REGISTRATION_WINDOWS | Create a window |
| PUT | /terms/{termID}/registration-windows/{windowID} | ACADEMIC.REGISTRATION_WINDOWS | Replace a window |
| DELETE | /terms/{termID}/registration-windows/{windowID} | ACADEMIC.REGISTRATION_WINDOWS | Delete a window |
| POST | /registration-windows/rule-matches | ACADEMIC.REGISTRATION_WINDOWS | Count the current students an unsaved rule selects |
| GET | /registration-windows/fields | ACADEMIC.REGISTRATION_WINDOWS | Fields a rule may test |
Request Body (POST, PUT)
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Max 100 |
start_date | date | Yes | YYYY-MM-DD, on or after the term's registration_open_date |
rule | object | null | No | Expression tree (internal/shared/expr, the same language as the billing selectors). null = everyone else |
sort_order | integer | No |
Rule fields: campus, program (major), minor, cohort, student_list, academic_level, class_standing, academic_status, gpa (cumulative, at the student's level). Each node has a kind: and / or / not with children, or test with field, op and value (or values for in). Test operators are eq, ne, in, matches, not_matches (a trailing % pattern), gte, lte, gt, lt, is_set and is_not_set.
A second everyone-else window is refused with 409, and so is deleting the everyone-else window while group windows remain.
List Response
{
"term_id": 42,
"registration_open_date": "2026-11-02",
"has_everyone_window": true,
"fields": ["campus", "program", "minor", "cohort", "student_list", "academic_level", "class_standing", "academic_status", "gpa"],
"windows": [
{
"term_registration_window_id": 7,
"term_id": 42,
"name": "Seniors",
"start_date": "2026-11-02",
"rule": { "kind": "test", "field": "class_standing", "op": "eq", "value": "SR" },
"rule_description": "class standing is SR",
"is_everyone": false,
"sort_order": 0
}
]
}Enforcement is in registration: the cart (REGISTRATION_CLOSED, excused by the transaction's override_deadline), plan submission, direct registration and joining a waitlist. On the direct paths a caller holding REGISTRATION.OVERRIDE.DEADLINE is not held to the window.
TypeScript Types
interface AcademicTerm {
term_id: number
academic_year_id: number
academic_year_code: string
term_code: string
term_name: string
term_type_code: string
term_type_display: string
start_date: string
end_date: string
census_date: string | null
add_deadline: string | null
drop_deadline: string | null
withdrawal_deadline: string | null
grades_due_date: string | null
registration_open_date: string | null
is_current: boolean
is_offered_at_all_campuses: boolean
sub_terms?: SubTerm[]
campus_offerings?: TermCampusOffering[]
}Courses
List Courses
GET /api/v1/academic/coursesQuery Parameters
| Parameter | Type | Description |
|---|---|---|
department | integer | Filter by department ID |
status_id | integer | Filter by status |
is_repeatable | boolean | Filter repeatable courses |
grading_system | integer | Filter by grading system |
search | string | Search in course_code, title, description |
ordering | string | Sort by: course_code, title, created_at |
Success Response (200 OK)
{
"count": 500,
"results": [
{
"course_id": 101,
"course_code": "MATH 101",
"title": "College Algebra",
"description": "Fundamental concepts of algebra...",
"department_id": 5,
"department_code": "MATH",
"department_name": "Mathematics",
"credit_display": "3",
"status_code": "ACTIVE",
"status_display": "Active",
"effective_date": "2024-01-01",
"in_current_bulletin": true,
"bulletin_count": 2
}
]
}Get Course Details
GET /api/v1/academic/courses/{id}Returns full course details including attributes, requisites, and equivalents.
Custom Actions
| Action | Method | Endpoint | Description |
|---|---|---|---|
| Search | GET | /courses/search?q={query} | Quick search (min 2 chars) |
| Sections | GET | /courses/{id}/sections | Get sections for course |
| Equivalents | GET | /courses/{id}/equivalents | Get course equivalents |
| Materials | GET | /courses/{id}/materials | Get assigned materials |
Create/Update Course
POST /api/v1/academic/courses
PATCH /api/v1/academic/courses/{id}| Field | Type | Required | Description |
|---|---|---|---|
course_code | string | Yes | Unique course code |
title | string | Yes | Course title |
description | string | No | Course description |
department_id | integer | Yes | Department ID |
credit_hours_min | decimal | Yes | Minimum credits |
credit_hours_max | decimal | Yes | Maximum credits |
contact_hours | decimal | No | Contact hours |
is_variable_credit | boolean | No | The course may carry a credit range. Students choose credits only on sections that also set is_variable_credit |
is_repeatable | boolean | No | Repeatable for credit |
max_repeats | integer | No | Total attempts allowed for a repeatable course, the first included; blank or 0 = unlimited |
grading_system_id | integer | No | Grading system |
status_id | integer | Yes | Status |
TypeScript Types
interface Course {
course_id: number
course_code: string
title: string
description: string | null
department_id: number
department_code: string
department_name: string
credit_hours_min: number
credit_hours_max: number
credit_display: string
is_variable_credit: boolean
is_repeatable: boolean
status_code: string
status_display: string
attributes?: CourseAttribute[]
requisites?: CourseRequisite[]
equivalents?: CourseEquivalent[]
}Course Sections
List Sections
GET /api/v1/academic/sectionsQuery Parameters
| Parameter | Type | Description |
|---|---|---|
course_id | integer | Filter by course ID |
term_id | integer | Filter by term ID |
campus_id | integer | Filter by campus |
section_status_id | integer | Filter by status |
search | string | Search in section_code, course code |
ordering | string | Sort by section_code (default), max_enrollment or current_enrollment; prefix with - to reverse |
There is no modality filter
Neither instruction_mode_id nor instructional_method_id is a supported query parameter. Both are returned on each section (see below), but the list endpoint cannot be filtered by either — CourseSectionQueryParams in internal/domain/academic/repository.go is the exact set, and an unrecognised ordering value falls back to the default rather than erroring.
Success Response (200 OK)
{
"count": 1500,
"results": [
{
"section_id": 512,
"course_id": 101,
"course_code": "MATH 101",
"course_title": "College Algebra",
"section_code": "001",
"term_id": 8,
"term_code": "FA2024",
"instruction_mode_code": "IN_PERSON",
"instruction_mode_display": "In Person",
"instructional_method_code": "LEC",
"instructional_method_display": "Lecture",
"section_status_code": "OPEN",
"section_status_display": "Open",
"campus_id": 1,
"campus_name": "Main Campus",
"enrollment_count": 25,
"enrollment_max": 30,
"waitlist_count": 2,
"waitlist_max": 10,
"credits": 3.0
}
]
}Modality and pedagogy are two different fields
A section carries both, and they answer different questions. Reading one for the other is the mistake migration 263 exists to prevent.
| Field | Lookup | Values | Answers | Origin |
|---|---|---|---|---|
instruction_mode_id | INSTRUCTION_MODE | 4 — IN_PERSON, ONLINE, HYBRID, REMOTE | Where is the student? | Derived by the importer |
instructional_method_id | INSTRUCTIONAL_METHOD | 26 — LEC, LAB, SEM, ONL, HYB, … | What kind of teaching is it? | Declared by Colleague, stored verbatim |
Twenty-four of the twenty-six methods say nothing about modality at all; only ONL and HYB overlap, and those are two of the inputs the mode is derived from. Storing the declared method alongside the derived mode is what lets the derivation rule be re-audited, or changed, without re-importing from ODS.
Both are returned as *_code / *_display pairs, and both are null on sections Colleague has not declared. See Section fields for the derivation rule itself.
Custom Actions
| Action | Method | Endpoint | Description |
|---|---|---|---|
| Scheduling | GET | /sections/{sectionID}/scheduling | Get meeting times and rooms |
| Set scheduling | POST | /sections/{sectionID}/scheduling | Create or replace the schedule |
| Clear scheduling | DELETE | /sections/{sectionID}/scheduling | Remove the schedule |
| Link | POST | /sections/{sectionID}/scheduling/link | Link to another section's schedule |
| Unlink | POST | /sections/{sectionID}/scheduling/unlink | Break a schedule link |
| Roster | GET | /sections/{sectionID}/roster | Get the roster |
| Available | GET | /sections/available | Get available sections for registration |
| Materials | GET | /sections/{id}/materials | Get assigned materials |
Variable credits
Sections carry is_variable_credit (students choose their credits) and credit_increment (default 1, must be > 0), both writable on create and update (migration 279). Responses also include effective_credit_hours_min and effective_credit_hours_max, which are the section's own range or else the course's.
Saving is_variable_credit: true is refused (validation error) when the course is not a variable-credit course, when the range does not span at least one increment, or when billing_credits is set. A variable section bills the credits the student chose. The choice is sent to registration as credits (direct registration) or credits_selected (plans and transaction items); see the Registration API.
Requisites
/course-requisites reads and writes the hand-entered records.course_requisites rows. Registration enforces the imported Colleague rules instead (records.course_requisite_links, migration 285, which no API route writes), and of the hand-entered rows only corequisites (COREQ / COREQUISITE) are checked, as warnings. See Course fields.
Programs
Degree Levels
Manage degree level definitions (Bachelor's, Master's, Doctorate, etc.).
| Method | Endpoint | Description |
|---|---|---|
| GET | /degree-levels | List all degree levels |
| GET | /degree-levels/{levelID} | Get degree level details |
Read-only reference data — no create, update or delete endpoint exists, and these are gated on ACADEMIC.YEARS rather than ACADEMIC.DEGREES.
Degrees
List Degrees
GET /api/v1/academic/degreesQuery Parameters
| Parameter | Type | Description |
|---|---|---|
degree_level | integer | Filter by degree level ID |
status_id | integer | Filter by status |
department | integer | Filter by department |
search | string | Search in degree_code, name |
Success Response (200 OK)
{
"count": 50,
"results": [
{
"degree_id": 1,
"degree_code": "BS-CS",
"name": "Bachelor of Science in Computer Science",
"degree_level_id": 1,
"degree_level_name": "Bachelor's",
"department_id": 10,
"department_name": "Computer Science",
"total_credits_required": 120,
"status_code": "ACTIVE",
"status_display": "Active",
"major_count": 1,
"requirement_block_count": 8
}
]
}Custom Actions
| Action | Method | Endpoint | Description |
|---|---|---|---|
| Blocks | GET | /degrees/{id}/blocks | Get requirement blocks for degree |
| Add Block | POST | /degrees/{id}/add_block | Associate a requirement block |
| Remove Block | DELETE | /degrees/{id}/remove_block | Remove a requirement block association |
| Copy | POST | /degrees/{id}/copy | Copy a degree with its blocks |
Degree Blocks
Manage associations between degrees and requirement blocks.
| Method | Endpoint | Description |
|---|---|---|
| GET | /degree-blocks | List degree-block associations |
| POST | /degree-blocks | Create association |
| GET | /degree-blocks/{id} | Get association details |
| PATCH | /degree-blocks/{id} | Update association |
| DELETE | /degree-blocks/{id} | Delete association |
Majors
List Majors
GET /api/v1/academic/majorsSuccess Response (200 OK)
{
"count": 75,
"results": [
{
"major_id": 1,
"major_code": "CS",
"name": "Computer Science",
"department_id": 10,
"department_name": "Computer Science",
"degree_ids": [1, 2],
"status_code": "ACTIVE",
"credits_required": 45
}
]
}Custom Actions
| Action | Method | Endpoint | Description |
|---|---|---|---|
| Blocks | GET | /majors/{id}/blocks | Get requirement blocks for major |
| Add Block | POST | /majors/{id}/add_block | Associate a requirement block |
| Remove Block | DELETE | /majors/{id}/remove_block | Remove a requirement block association |
| Campuses | GET | /majors/{id}/campuses | Get campus offerings |
| Add Campus | POST | /majors/{id}/add_campus | Add campus offering |
| Remove Campus | POST | /majors/{majorID}/remove_campus | Remove campus offering (POST, not DELETE) |
| Add Degree Level | POST | /majors/{id}/add_degree_level | Add degree level association |
| Remove Degree Level | DELETE | /majors/{id}/remove_degree_level | Remove degree level association |
| Add Degree | POST | /majors/{id}/add_degree | Add degree association |
| Remove Degree | DELETE | /majors/{id}/remove_degree | Remove degree association |
Major Default Advisors
| Method | Endpoint | Description |
|---|---|---|
| GET | /major-default-advisors | List default advisors |
| GET | /major-default-advisors/for_major | Default advisors for one major |
| GET | /major-default-advisors/{advisorID} | Get one default advisor |
| POST | /major-default-advisors | Add default advisor |
| PATCH | /major-default-advisors/{advisorID} | Update default advisor |
| DELETE | /major-default-advisors/{advisorID} | Remove default advisor |
Minors
List Minors
GET /api/v1/academic/minorsSuccess Response (200 OK)
{
"count": 30,
"results": [
{
"minor_id": 1,
"minor_code": "MATH-MIN",
"name": "Mathematics Minor",
"department_id": 5,
"department_name": "Mathematics",
"status_code": "ACTIVE",
"credits_required": 18
}
]
}Custom Actions
| Action | Method | Endpoint | Description |
|---|---|---|---|
| Blocks | GET | /minors/{minorID}/blocks | Get requirement blocks for minor |
| Campuses | GET | /minors/{minorID}/campuses | Get campus offerings |
| Add Campus | POST | /minors/{minorID}/add_campus | Add campus offering |
| Remove Campus | POST | /minors/{minorID}/remove_campus | Remove campus offering |
Minors have no block, degree or degree-level association endpoints — only campus offerings. Removing a campus is a POST, not a DELETE.
Minor Default Advisors
| Method | Endpoint | Description |
|---|---|---|
| GET | /minor-default-advisors | List default advisors |
| GET | /minor-default-advisors/for_minor | Default advisors for one minor |
| GET | /minor-default-advisors/{advisorID} | Get one default advisor |
| POST | /minor-default-advisors | Add default advisor |
| PATCH | /minor-default-advisors/{advisorID} | Update default advisor |
| DELETE | /minor-default-advisors/{advisorID} | Remove default advisor |
Degree Default Advisors
| Method | Endpoint | Description |
|---|---|---|
| GET | /degree-default-advisors | List default advisors |
| GET | /degree-default-advisors/for_degree | Default advisors for one degree |
| GET | /degree-default-advisors/{advisorID} | Get one default advisor |
| POST | /degree-default-advisors | Add default advisor |
| PATCH | /degree-default-advisors/{advisorID} | Update default advisor |
| DELETE | /degree-default-advisors/{advisorID} | Remove default advisor |
Requirement Blocks
List Requirement Blocks
GET /api/v1/academic/requirement-blocksQuery Parameters
| Parameter | Type | Description |
|---|---|---|
degree | integer | Filter by degree ID |
major | integer | Filter by major ID |
minor | integer | Filter by minor ID |
block_type_id | integer | Filter by block type |
search | string | Search in block_code, name |
Success Response (200 OK)
{
"count": 200,
"results": [
{
"block_id": 1,
"block_code": "CS-CORE",
"name": "Computer Science Core Requirements",
"block_type_code": "MAJOR_CORE",
"block_type_display": "Major Core",
"credits_required": 24,
"courses_required": 8,
"item_count": 8
}
]
}Custom Actions
| Action | Method | Endpoint | Description |
|---|---|---|---|
| Groups | GET | /requirement-blocks/{id}/groups | Get requirement groups within block |
| Children | GET | /requirement-blocks/{id}/children | Get child blocks |
| Copy | POST | /requirement-blocks/{id}/copy | Copy a requirement block |
Requirement Items
GET /api/v1/academic/requirement-itemsIndividual courses or course patterns that satisfy requirements.
Success Response (200 OK)
{
"count": 500,
"results": [
{
"item_id": 1,
"block_id": 1,
"course_id": 201,
"course_code": "CS 101",
"course_title": "Intro to Programming",
"credits": 3,
"is_required": true,
"sequence_number": 1
}
]
}Requirement Groups
Manage logical groupings of requirements within blocks.
| Method | Endpoint | Description |
|---|---|---|
| GET | /requirement-groups | List requirement groups |
| POST | /requirement-groups | Create requirement group |
| GET | /requirement-groups/{id} | Get requirement group details |
| PATCH | /requirement-groups/{id} | Update requirement group |
| DELETE | /requirement-groups/{id} | Delete requirement group |
Requirement Group Rules
Manage rules within requirement groups (e.g., "choose 3 of the following").
| Method | Endpoint | Description |
|---|---|---|
| GET | /requirement-group-rules | List group rules |
| POST | /requirement-group-rules | Create group rule |
| GET | /requirement-group-rules/{id} | Get group rule details |
| PATCH | /requirement-group-rules/{id} | Update group rule |
| DELETE | /requirement-group-rules/{id} | Delete group rule |
Course Patterns
Flexible course matching patterns used in requirements (e.g., "any 300-level MATH course").
Custom Actions
| Action | Method | Endpoint | Description |
|---|---|---|---|
| Test Pattern | POST | /course-patterns/test_pattern | Test a pattern against course catalog |
| Preview | GET | /course-patterns/{id}/preview | Preview matching courses |
Course Equivalents
Manage course equivalency relationships.
| Method | Endpoint | Description |
|---|---|---|
| GET | /course-equivalents | List all equivalencies |
| POST | /course-equivalents | Create equivalency |
| DELETE | /course-equivalents/{id} | Delete equivalency |
| GET | /courses/{id}/equivalents | Get equivalents for a specific course |
Course Substitutions
Manage course substitution rules (institutional-level substitution policies).
| Method | Endpoint | Description |
|---|---|---|
| GET | /course-substitutions | List substitution rules |
| POST | /course-substitutions | Create substitution rule |
| GET | /course-substitutions/{id} | Get substitution rule details |
| PATCH | /course-substitutions/{id} | Update substitution rule |
| DELETE | /course-substitutions/{id} | Delete substitution rule |
Student Course Substitutions
Manage student-specific course substitutions with approval workflow.
| Method | Endpoint | Description |
|---|---|---|
| GET | /student-course-substitutions | List student substitutions |
| POST | /student-course-substitutions | Create student substitution |
| GET | /student-course-substitutions/{id} | Get substitution details |
| PATCH | /student-course-substitutions/{id} | Update substitution |
| DELETE | /student-course-substitutions/{id} | Delete substitution |
| POST | /student-course-substitutions/{id}/advisor-approve | Advisor approval |
| POST | /student-course-substitutions/{id}/registrar-approve | Registrar approval |
| POST | /student-course-substitutions/{id}/deactivate | Deactivate substitution |
Schedule Templates
Manage reusable schedule templates for course sections.
| Method | Endpoint | Description |
|---|---|---|
| GET | /schedule-templates | List schedule templates |
| POST | /schedule-templates | Create schedule template |
| GET | /schedule-templates/dropdown | Get templates for dropdown selection |
| GET | /schedule-templates/{id} | Get template details |
| PATCH | /schedule-templates/{id} | Update template |
| DELETE | /schedule-templates/{id} | Delete template |
Classes
Retired. Scheduling became section-centric in July 2026. /classes is gone and no /classes/{id}/* sub-resource exists; the frontend route redirects to /sections, and the REGISTRATION.CLASSES permission node survives only as an inactive row.
Use /sections/{sectionID}/scheduling and /sections/{sectionID}/roster instead.
The records.classes and records.class_sections tables do still exist as lazily created schedule containers for cross-listed sections, and /class-schedules below is the live source of meeting times. The retired thing is the concept in the interface, not the tables.
Class Schedules
Manage individual class meeting schedules.
| Method | Endpoint | Description |
|---|---|---|
| GET | /class-schedules | List class schedules |
| POST | /class-schedules | Create class schedule |
| GET | /class-schedules/{id} | Get schedule details |
| PATCH | /class-schedules/{id} | Update schedule |
| DELETE | /class-schedules/{id} | Delete schedule |
| POST | /class-schedules/check_conflict | Check for scheduling conflicts |
Materials
Manage the material/textbook catalog.
| Method | Endpoint | Description |
|---|---|---|
| GET | /materials | List all materials |
| POST | /materials | Create material |
| GET | /materials/{id} | Get material details |
| PATCH | /materials/{id} | Update material |
| DELETE | /materials/{id} | Delete material |
Course Materials
Manage material assignments to courses.
| Method | Endpoint | Description |
|---|---|---|
| GET | /courses/{courseID}/materials | List materials for a course |
| POST | /courses/{courseID}/materials | Assign material to course |
| POST | /sections/{sectionID}/materials | Attach a material to a section |
| GET | /course-materials/{id} | Get course material assignment details |
| PATCH | /course-materials/{id} | Update course material assignment |
| DELETE | /course-materials/{id} | Delete course material assignment |
Section Materials
Manage material assignments to sections.
| Method | Endpoint | Description |
|---|---|---|
| GET | /sections/{sectionID}/materials | List materials for a section |
| POST | /sections/{sectionID}/materials | Assign material to section |
| GET | /section-materials/{id} | Get section material assignment details |
| PATCH | /section-materials/{id} | Update section material assignment |
| DELETE | /section-materials/{id} | Delete section material assignment |
Grading Systems
List Grading Systems
GET /api/v1/academic/grading-systemsSuccess Response (200 OK)
{
"count": 3,
"results": [
{
"grading_system_id": 1,
"system_code": "STANDARD",
"name": "Standard Letter Grades",
"description": "Traditional A-F grading",
"is_active": true,
"grade_count": 12
}
]
}Grades
GET /api/v1/academic/gradesQuery Parameters
| Parameter | Type | Description |
|---|---|---|
grading_system | integer | Filter by grading system ID |
is_passing | boolean | Filter passing grades |
counts_toward_gpa | boolean | Filter GPA-counted grades |
Success Response (200 OK)
{
"count": 12,
"results": [
{
"grade_id": 1,
"grading_system_id": 1,
"letter_grade": "A",
"display_name": "A",
"quality_points": 4.0,
"is_passing": true,
"counts_toward_gpa": true,
"sort_order": 1
},
{
"grade_id": 10,
"grading_system_id": 1,
"letter_grade": "W",
"display_name": "Withdrawal",
"quality_points": null,
"is_passing": false,
"counts_toward_gpa": false,
"sort_order": 10
}
]
}Bulletins (Course Catalogs)
List Bulletins
GET /api/v1/academic/bulletinsSuccess Response (200 OK)
{
"count": 5,
"results": [
{
"bulletin_id": 3,
"bulletin_code": "2024-2025",
"name": "2024-2025 Undergraduate Catalog",
"effective_date": "2024-08-01",
"is_current": true,
"course_count": 500
}
]
}Custom Actions
| Action | Method | Endpoint | Description |
|---|---|---|---|
| Current | GET | /bulletins/current | Get the current bulletin |
| Courses | GET | /bulletins/{id}/courses | Get courses in a bulletin |
| Copy Courses | POST | /bulletins/{id}/copy_courses | Copy courses from another bulletin |
Course Bulletins
Manage course-to-bulletin assignments.
| Method | Endpoint | Description |
|---|---|---|
| GET | /course-bulletins | List course-bulletin assignments |
| POST | /course-bulletins | Create assignment |
| GET | /course-bulletins/{id} | Get assignment details |
| PATCH | /course-bulletins/{id} | Update assignment |
| DELETE | /course-bulletins/{id} | Delete assignment |
| POST | /course-bulletins/bulk_create | Bulk assign courses to bulletin |
Complete endpoint reference
Every route this domain registers, with the permission node that gates it. Generated from the route table, so it is complete by construction — the sections above explain behaviour, this one guarantees nothing is missing.
Paths are relative to /api/v1/academic. A node in italics is an exemption rather than a grant: selfservice acts only on the caller's own record, public needs no session at all, and custom carries its own wrapper.
| Method | Endpoint | Permission node | Description |
|---|---|---|---|
| GET | /academic-years | ACADEMIC.YEARS | List academic years |
| POST | /academic-years | ACADEMIC.YEARS | Create a academic year |
| GET | /academic-years/current | ACADEMIC.YEARS | Get the current record |
| DELETE | /academic-years/{yearID} | ACADEMIC.YEARS | Delete a academic year |
| GET | /academic-years/{yearID} | ACADEMIC.YEARS | Get one academic year |
| PATCH | /academic-years/{yearID} | ACADEMIC.YEARS | Update a academic year |
| GET | /academic-years/{yearID}/terms | ACADEMIC.YEARS | List the academic year's terms |
| GET | /bulletins | ACADEMIC.BULLETINS | List bulletins |
| POST | /bulletins | ACADEMIC.BULLETINS | Create a bulletin |
| GET | /bulletins/current | ACADEMIC.BULLETINS | Get the current record |
| DELETE | /bulletins/{bulletinID} | ACADEMIC.BULLETINS | Delete a bulletin |
| GET | /bulletins/{bulletinID} | ACADEMIC.BULLETINS | Get one bulletin |
| PATCH | /bulletins/{bulletinID} | ACADEMIC.BULLETINS | Update a bulletin |
| POST | /bulletins/{bulletinID}/copy_courses | ACADEMIC.BULLETINS | Copy courses for a bulletin |
| GET | /bulletins/{bulletinID}/courses | ACADEMIC.BULLETINS | List the bulletin's courses |
| GET | /class-schedules | REGISTRATION.SECTIONS | List class schedules |
| POST | /class-schedules | REGISTRATION.SECTIONS | Create a class schedule |
| POST | /class-schedules/check_conflict | REGISTRATION.SECTIONS | Check conflict |
| DELETE | /class-schedules/{scheduleID} | REGISTRATION.SECTIONS | Delete a class schedule |
| GET | /class-schedules/{scheduleID} | REGISTRATION.SECTIONS | Get one class schedule |
| PATCH | /class-schedules/{scheduleID} | REGISTRATION.SECTIONS | Update a class schedule |
| POST | /course-attributes | ACADEMIC.COURSES | Create a course attribute |
| DELETE | /course-attributes/{attributeID} | ACADEMIC.COURSES | Delete a course attribute |
| GET | /course-bulletins | ACADEMIC.BULLETINS | List course bulletins |
| POST | /course-bulletins | ACADEMIC.BULLETINS | Create a course bulletin |
| POST | /course-bulletins/bulk_create | ACADEMIC.BULLETINS | Bulk create |
| DELETE | /course-bulletins/{courseBulletinID} | ACADEMIC.BULLETINS | Delete a course bulletin |
| GET | /course-bulletins/{courseBulletinID} | ACADEMIC.BULLETINS | Get one course bulletin |
| PATCH | /course-bulletins/{courseBulletinID} | ACADEMIC.BULLETINS | Update a course bulletin |
| GET | /course-equivalents | ACADEMIC.COURSES | List course equivalents |
| POST | /course-equivalents | ACADEMIC.COURSES | Create a course equivalent |
| DELETE | /course-equivalents/{equivalentID} | ACADEMIC.COURSES | Delete a course equivalent |
| DELETE | /course-materials/{courseMaterialID} | ACADEMIC.COURSES | Delete a course material |
| GET | /course-materials/{courseMaterialID} | ACADEMIC.COURSES | Get one course material |
| PATCH | /course-materials/{courseMaterialID} | ACADEMIC.COURSES | Update a course material |
| GET | /course-patterns | ACADEMIC.PATTERNS | List course patterns |
| POST | /course-patterns | ACADEMIC.PATTERNS | Create a course pattern |
| POST | /course-patterns/test_pattern | ACADEMIC.PATTERNS | Create test pattern |
| DELETE | /course-patterns/{patternID} | ACADEMIC.PATTERNS | Delete a course pattern |
| GET | /course-patterns/{patternID} | ACADEMIC.PATTERNS | Get one course pattern |
| PATCH | /course-patterns/{patternID} | ACADEMIC.PATTERNS | Update a course pattern |
| GET | /course-patterns/{patternID}/preview | ACADEMIC.PATTERNS | Preview for a course pattern |
| GET | /course-requisites | ACADEMIC.COURSES | List course requisites |
| POST | /course-requisites | ACADEMIC.COURSES | Create a course requisite |
| DELETE | /course-requisites/{requisiteID} | ACADEMIC.COURSES | Delete a course requisite |
| GET | /course-requisites/{requisiteID} | ACADEMIC.COURSES | Get one course requisite |
| PATCH | /course-requisites/{requisiteID} | ACADEMIC.COURSES | Update a course requisite |
| GET | /course-substitutions | ACADEMIC.COURSE_SUBSTITUTIONS | List course substitutions |
| POST | /course-substitutions | ACADEMIC.COURSE_SUBSTITUTIONS | Create a course substitution |
| DELETE | /course-substitutions/{substitutionID} | ACADEMIC.COURSE_SUBSTITUTIONS | Delete a course substitution |
| GET | /course-substitutions/{substitutionID} | ACADEMIC.COURSE_SUBSTITUTIONS | Get one course substitution |
| PATCH | /course-substitutions/{substitutionID} | ACADEMIC.COURSE_SUBSTITUTIONS | Update a course substitution |
| GET | /courses | ACADEMIC.COURSES | List courses |
| POST | /courses | ACADEMIC.COURSES | Create a cours |
| GET | /courses/credit-values | ACADEMIC.COURSES | List credit values |
| GET | /courses/search | ACADEMIC.COURSES | Search |
| DELETE | /courses/{courseID} | ACADEMIC.COURSES | Delete a cours |
| GET | /courses/{courseID} | ACADEMIC.COURSES | Get one cours |
| PATCH | /courses/{courseID} | ACADEMIC.COURSES | Update a cours |
| GET | /courses/{courseID}/attributes | ACADEMIC.COURSES | List the course's attributes |
| GET | /courses/{courseID}/equivalents | ACADEMIC.COURSES | List the cours's equivalents |
| GET | /courses/{courseID}/materials | ACADEMIC.COURSES | List the cours's materials |
| POST | /courses/{courseID}/materials | ACADEMIC.COURSES | Add materials to a cours |
| POST | /courses/{courseID}/materials/push | ACADEMIC.COURSES | Push |
| GET | /courses/{courseID}/sections | REGISTRATION.SECTIONS | List the cours's sections |
| GET | /degree-blocks | ACADEMIC.DEGREES | List degree blocks |
| POST | /degree-blocks | ACADEMIC.DEGREES | Create a degree block |
| DELETE | /degree-blocks/{degreeBlockID} | ACADEMIC.DEGREES | Delete a degree block |
| GET | /degree-blocks/{degreeBlockID} | ACADEMIC.DEGREES | Get one degree block |
| PATCH | /degree-blocks/{degreeBlockID} | ACADEMIC.DEGREES | Update a degree block |
| GET | /degree-default-advisors | ACADEMIC.DEGREES | List degree default advisors |
| POST | /degree-default-advisors | ACADEMIC.DEGREES | Create a degree default advisor |
| GET | /degree-default-advisors/for_degree | ACADEMIC.DEGREES | Get for degree |
| DELETE | /degree-default-advisors/{advisorID} | ACADEMIC.DEGREES | Delete a degree default advisor |
| GET | /degree-default-advisors/{advisorID} | ACADEMIC.DEGREES | Get one degree default advisor |
| PATCH | /degree-default-advisors/{advisorID} | ACADEMIC.DEGREES | Update a degree default advisor |
| GET | /degree-levels | ACADEMIC.YEARS | List degree levels |
| GET | /degree-levels/{levelID} | ACADEMIC.YEARS | Get one degree level |
| GET | /degrees | ACADEMIC.DEGREES | List degrees |
| POST | /degrees | ACADEMIC.DEGREES | Create a degree |
| DELETE | /degrees/{degreeID} | ACADEMIC.DEGREES | Delete a degree |
| GET | /degrees/{degreeID} | ACADEMIC.DEGREES | Get one degree |
| PATCH | /degrees/{degreeID} | ACADEMIC.DEGREES | Update a degree |
| POST | /degrees/{degreeID}/add_block | ACADEMIC.DEGREES | Add block for a degree |
| GET | /degrees/{degreeID}/blocks | ACADEMIC.DEGREES | List the degree's blocks |
| POST | /degrees/{degreeID}/copy | ACADEMIC.DEGREES | Add copy to a degree |
| DELETE | /degrees/{degreeID}/remove_block | ACADEMIC.DEGREES | Remove block for a degree |
| GET | /grades | ADMIN.GRADING_SYSTEMS | List grades |
| POST | /grades | ADMIN.GRADING_SYSTEMS | Create a grade |
| DELETE | /grades/{gradeID} | ADMIN.GRADING_SYSTEMS | Delete a grade |
| GET | /grades/{gradeID} | ADMIN.GRADING_SYSTEMS | Get one grade |
| PATCH | /grades/{gradeID} | ADMIN.GRADING_SYSTEMS | Update a grade |
| GET | /grading-systems | REGISTRATION.SECTIONS | List grading systems |
| POST | /grading-systems | ADMIN.GRADING_SYSTEMS | Create a grading system |
| GET | /grading-systems/default | REGISTRATION.SECTIONS | Get default |
| DELETE | /grading-systems/{gradingSystemID} | ADMIN.GRADING_SYSTEMS | Delete a grading system |
| GET | /grading-systems/{gradingSystemID} | REGISTRATION.SECTIONS | Get one grading system |
| PATCH | /grading-systems/{gradingSystemID} | ADMIN.GRADING_SYSTEMS | Update a grading system |
| GET | /major-default-advisors | ACADEMIC.MAJORS | List major default advisors |
| POST | /major-default-advisors | ACADEMIC.MAJORS | Create a major default advisor |
| GET | /major-default-advisors/for_major | ACADEMIC.MAJORS | Get for major |
| DELETE | /major-default-advisors/{advisorID} | ACADEMIC.MAJORS | Delete a major default advisor |
| GET | /major-default-advisors/{advisorID} | ACADEMIC.MAJORS | Get one major default advisor |
| PATCH | /major-default-advisors/{advisorID} | ACADEMIC.MAJORS | Update a major default advisor |
| GET | /majors | ACADEMIC.MAJORS | List majors |
| POST | /majors | ACADEMIC.MAJORS | Create a major |
| DELETE | /majors/{majorID} | ACADEMIC.MAJORS | Delete a major |
| GET | /majors/{majorID} | ACADEMIC.MAJORS | Get one major |
| PATCH | /majors/{majorID} | ACADEMIC.MAJORS | Update a major |
| POST | /majors/{majorID}/add_block | ACADEMIC.MAJORS | Add block for a major |
| POST | /majors/{majorID}/add_campus | ACADEMIC.MAJORS | Add campus for a major |
| POST | /majors/{majorID}/add_degree | ACADEMIC.MAJORS | Add degree for a major |
| POST | /majors/{majorID}/add_degree_level | ACADEMIC.MAJORS | Add degree level for a major |
| GET | /majors/{majorID}/blocks | ACADEMIC.MAJORS | List the major's blocks |
| GET | /majors/{majorID}/campuses | ACADEMIC.MAJORS | List the major's campuses |
| GET | /majors/{majorID}/emphases | ACADEMIC.MAJORS | List the major's emphases |
| POST | /majors/{majorID}/emphases | ACADEMIC.MAJORS | Add emphases to a major |
| DELETE | /majors/{majorID}/emphases/{emphasisID} | ACADEMIC.MAJORS | Delete a emphas |
| GET | /majors/{majorID}/emphases/{emphasisID} | ACADEMIC.MAJORS | Get one emphas |
| PATCH | /majors/{majorID}/emphases/{emphasisID} | ACADEMIC.MAJORS | Update a emphas |
| POST | /majors/{majorID}/emphases/{emphasisID}/blocks | ACADEMIC.MAJORS | Add blocks to a emphas |
| DELETE | /majors/{majorID}/emphases/{emphasisID}/blocks/{emphasisBlockID} | ACADEMIC.MAJORS | Delete a block |
| DELETE | /majors/{majorID}/remove_block | ACADEMIC.MAJORS | Remove block for a major |
| POST | /majors/{majorID}/remove_campus | ACADEMIC.MAJORS | Remove campus for a major |
| DELETE | /majors/{majorID}/remove_degree | ACADEMIC.MAJORS | Remove degree for a major |
| DELETE | /majors/{majorID}/remove_degree_level | ACADEMIC.MAJORS | Remove degree level for a major |
| GET | /materials | ACADEMIC.COURSES | List materials |
| POST | /materials | ACADEMIC.COURSES | Create a material |
| DELETE | /materials/{materialID} | ACADEMIC.COURSES | Delete a material |
| GET | /materials/{materialID} | ACADEMIC.COURSES | Get one material |
| PATCH | /materials/{materialID} | ACADEMIC.COURSES | Update a material |
| GET | /minor-default-advisors | ACADEMIC.MINORS | List minor default advisors |
| POST | /minor-default-advisors | ACADEMIC.MINORS | Create a minor default advisor |
| GET | /minor-default-advisors/for_minor | ACADEMIC.MINORS | Get for minor |
| DELETE | /minor-default-advisors/{advisorID} | ACADEMIC.MINORS | Delete a minor default advisor |
| GET | /minor-default-advisors/{advisorID} | ACADEMIC.MINORS | Get one minor default advisor |
| PATCH | /minor-default-advisors/{advisorID} | ACADEMIC.MINORS | Update a minor default advisor |
| GET | /minors | ACADEMIC.MINORS | List minors |
| POST | /minors | ACADEMIC.MINORS | Create a minor |
| DELETE | /minors/{minorID} | ACADEMIC.MINORS | Delete a minor |
| GET | /minors/{minorID} | ACADEMIC.MINORS | Get one minor |
| PATCH | /minors/{minorID} | ACADEMIC.MINORS | Update a minor |
| POST | /minors/{minorID}/add_campus | ACADEMIC.MINORS | Add campus for a minor |
| GET | /minors/{minorID}/blocks | ACADEMIC.MINORS | List the minor's blocks |
| GET | /minors/{minorID}/campuses | ACADEMIC.MINORS | List the minor's campuses |
| POST | /minors/{minorID}/remove_campus | ACADEMIC.MINORS | Remove campus for a minor |
| GET | /registration-windows/fields | ACADEMIC.REGISTRATION_WINDOWS | Fields a window rule may test |
| POST | /registration-windows/rule-matches | ACADEMIC.REGISTRATION_WINDOWS | Count students an unsaved rule selects |
| GET | /requirement-blocks | ACADEMIC.REQUIREMENTS | List requirement blocks |
| POST | /requirement-blocks | ACADEMIC.REQUIREMENTS | Create a requirement block |
| DELETE | /requirement-blocks/{blockID} | ACADEMIC.REQUIREMENTS | Delete a requirement block |
| GET | /requirement-blocks/{blockID} | ACADEMIC.REQUIREMENTS | Get one requirement block |
| PATCH | /requirement-blocks/{blockID} | ACADEMIC.REQUIREMENTS | Update a requirement block |
| GET | /requirement-blocks/{blockID}/children | ACADEMIC.REQUIREMENTS | Get the requirement block's children |
| POST | /requirement-blocks/{blockID}/copy | ACADEMIC.REQUIREMENTS | Add copy to a requirement block |
| GET | /requirement-blocks/{blockID}/groups | ACADEMIC.REQUIREMENTS | List the requirement block's groups |
| GET | /requirement-blocks/{blockID}/items | ACADEMIC.REQUIREMENTS | List the requirement block's items |
| GET | /requirement-group-rules | ACADEMIC.REQUIREMENTS | List requirement group rules |
| POST | /requirement-group-rules | ACADEMIC.REQUIREMENTS | Create a requirement group rule |
| DELETE | /requirement-group-rules/{ruleID} | ACADEMIC.REQUIREMENTS | Delete a requirement group rule |
| GET | /requirement-group-rules/{ruleID} | ACADEMIC.REQUIREMENTS | Get one requirement group rule |
| PATCH | /requirement-group-rules/{ruleID} | ACADEMIC.REQUIREMENTS | Update a requirement group rule |
| GET | /requirement-groups | ACADEMIC.REQUIREMENTS | List requirement groups |
| POST | /requirement-groups | ACADEMIC.REQUIREMENTS | Create a requirement group |
| DELETE | /requirement-groups/{groupID} | ACADEMIC.REQUIREMENTS | Delete a requirement group |
| GET | /requirement-groups/{groupID} | ACADEMIC.REQUIREMENTS | Get one requirement group |
| PATCH | /requirement-groups/{groupID} | ACADEMIC.REQUIREMENTS | Update a requirement group |
| GET | /requirement-items | ACADEMIC.REQUIREMENTS | List requirement items |
| POST | /requirement-items | ACADEMIC.REQUIREMENTS | Create a requirement item |
| DELETE | /requirement-items/{itemID} | ACADEMIC.REQUIREMENTS | Delete a requirement item |
| GET | /requirement-items/{itemID} | ACADEMIC.REQUIREMENTS | Get one requirement item |
| PATCH | /requirement-items/{itemID} | ACADEMIC.REQUIREMENTS | Update a requirement item |
| GET | /schedule-templates | ACADEMIC.SCHEDULE_TEMPLATES | List schedule templates |
| POST | /schedule-templates | ACADEMIC.SCHEDULE_TEMPLATES | Create a schedule template |
| GET | /schedule-templates/dropdown | ACADEMIC.SCHEDULE_TEMPLATES | List options for a picker |
| DELETE | /schedule-templates/{templateID} | ACADEMIC.SCHEDULE_TEMPLATES | Delete a schedule template |
| GET | /schedule-templates/{templateID} | ACADEMIC.SCHEDULE_TEMPLATES | Get one schedule template |
| PATCH | /schedule-templates/{templateID} | ACADEMIC.SCHEDULE_TEMPLATES | Update a schedule template |
| GET | /section-instructors | REGISTRATION.SECTIONS | List section instructors |
| POST | /section-instructors | REGISTRATION.SECTIONS | Create a section instructor |
| POST | /section-instructors/set_grade_entry | REGISTRATION.SECTIONS | Set grade entry |
| DELETE | /section-instructors/{instructorID} | REGISTRATION.SECTIONS | Delete a section instructor |
| GET | /section-instructors/{instructorID} | REGISTRATION.SECTIONS | Get one section instructor |
| PATCH | /section-instructors/{instructorID} | REGISTRATION.SECTIONS | Update a section instructor |
| DELETE | /section-materials/{sectionMaterialID} | REGISTRATION.SECTIONS | Delete a section material |
| GET | /section-materials/{sectionMaterialID} | REGISTRATION.SECTIONS | Get one section material |
| PATCH | /section-materials/{sectionMaterialID} | REGISTRATION.SECTIONS | Update a section material |
| GET | /sections | REGISTRATION.SECTIONS | List sections |
| POST | /sections | REGISTRATION.SECTIONS | Create a section |
| GET | /sections/available | REGISTRATION.SECTIONS | Get available |
| GET | /sections/for_cohort_registration | REGISTRATION.COHORT_REGISTRATION | Sections offered to cohort registration |
| GET | /sections/for_registration | REGISTRATION.REGISTER | Sections offered to the registering student |
| DELETE | /sections/{sectionID} | REGISTRATION.SECTIONS | Delete a section |
| GET | /sections/{sectionID} | REGISTRATION.SECTIONS | Get one section |
| PATCH | /sections/{sectionID} | REGISTRATION.SECTIONS | Update a section |
| GET | /sections/{sectionID}/dependents | REGISTRATION.SECTIONS | What depends on the section, so why it cannot be deleted or moved |
| GET | /sections/{sectionID}/materials | REGISTRATION.SECTIONS | List the section's materials |
| POST | /sections/{sectionID}/materials | REGISTRATION.SECTIONS | Add materials to a section |
| GET | /sections/{sectionID}/roster | REGISTRATION.SECTIONS | Get the section's roster |
| DELETE | /sections/{sectionID}/scheduling | REGISTRATION.SECTIONS | Remove scheduling from a section |
| GET | /sections/{sectionID}/scheduling | REGISTRATION.SECTIONS | Get the section's scheduling |
| POST | /sections/{sectionID}/scheduling | REGISTRATION.SECTIONS | Add scheduling to a section |
| POST | /sections/{sectionID}/scheduling/link | REGISTRATION.SECTIONS | Link |
| POST | /sections/{sectionID}/scheduling/unlink | REGISTRATION.SECTIONS | Unlink |
| GET | /student-course-substitutions | ACADEMIC.COURSE_SUBSTITUTIONS | List student course substitutions |
| POST | /student-course-substitutions | ACADEMIC.COURSE_SUBSTITUTIONS | Create a student course substitution |
| GET | /student-course-substitutions/by_student | ADVISING.AUDIT | List one student's course substitutions |
| DELETE | /student-course-substitutions/{substitutionID} | ACADEMIC.COURSE_SUBSTITUTIONS | Delete a student course substitution |
| GET | /student-course-substitutions/{substitutionID} | ACADEMIC.COURSE_SUBSTITUTIONS | Get one student course substitution |
| PATCH | /student-course-substitutions/{substitutionID} | ACADEMIC.COURSE_SUBSTITUTIONS | Update a student course substitution |
| POST | /student-course-substitutions/{substitutionID}/advisor-approve | ACADEMIC.COURSE_SUBSTITUTIONS | Add advisor approve to a student course substitution |
| POST | /student-course-substitutions/{substitutionID}/deactivate | ACADEMIC.COURSE_SUBSTITUTIONS | Deactivate for a student course substitution |
| POST | /student-course-substitutions/{substitutionID}/registrar-approve | ACADEMIC.COURSE_SUBSTITUTIONS | Add registrar approve to a student course substitution |
| GET | /sub-terms | ACADEMIC.TERMS | List sub terms |
| POST | /sub-terms | ACADEMIC.TERMS | Create a sub term |
| DELETE | /sub-terms/{subTermID} | ACADEMIC.TERMS | Delete a sub term |
| GET | /sub-terms/{subTermID} | ACADEMIC.TERMS | Get one sub term |
| PATCH | /sub-terms/{subTermID} | ACADEMIC.TERMS | Update a sub term |
| GET | /term-campus-offerings | ACADEMIC.TERMS | List term campus offerings |
| POST | /term-campus-offerings | ACADEMIC.TERMS | Create a term campus offering |
| DELETE | /term-campus-offerings/{offeringID} | ACADEMIC.TERMS | Delete a term campus offering |
| GET | /term-campus-offerings/{offeringID} | ACADEMIC.TERMS | Get one term campus offering |
| PATCH | /term-campus-offerings/{offeringID} | ACADEMIC.TERMS | Update a term campus offering |
| GET | /term-slots | ACADEMIC.TERMS | List term slots |
| POST | /term-slots | ACADEMIC.TERMS | Create a term slot |
| DELETE | /term-slots/{slotID} | ACADEMIC.TERMS | Delete a term slot |
| GET | /term-slots/{slotID} | ACADEMIC.TERMS | Get one term slot |
| PUT | /term-slots/{slotID} | ACADEMIC.TERMS | Replace a term slot |
| GET | /terms | ACADEMIC.TERMS | List terms |
| POST | /terms | ACADEMIC.TERMS | Create a term |
| GET | /terms/available_for_registration | ACADEMIC.TERMS | Get available for registration |
| GET | /terms/current | ACADEMIC.TERMS | Get the current record |
| GET | /terms/for_cohort_registration | REGISTRATION.COHORT_REGISTRATION | Terms offered to cohort registration |
| GET | /terms/latest_active | ACADEMIC.TERMS | Get the latest active term |
| GET | /terms/open_for_registration | REGISTRATION.REGISTER | Terms open for registration |
| DELETE | /terms/{termID} | ACADEMIC.TERMS | Delete a term |
| GET | /terms/{termID} | ACADEMIC.TERMS | Get one term |
| PATCH | /terms/{termID} | ACADEMIC.TERMS | Update a term |
| GET | /terms/{termID}/sections | ACADEMIC.TERMS | List the term's sections |
| GET | /terms/{termID}/registration-windows | ACADEMIC.TERMS | List the term's registration windows |
| POST | /terms/{termID}/registration-windows | ACADEMIC.REGISTRATION_WINDOWS | Create a registration window |
| GET | /terms/{termID}/registration-windows/preview | ACADEMIC.TERMS | Preview who each window lets in |
| DELETE | /terms/{termID}/registration-windows/{windowID} | ACADEMIC.REGISTRATION_WINDOWS | Delete a registration window |
| PUT | /terms/{termID}/registration-windows/{windowID} | ACADEMIC.REGISTRATION_WINDOWS | Replace a registration window |