Purdue.io Course Catalog API

A community-built, public OData/REST API exposing Purdue's course catalog data, including Campuses, Buildings, Rooms, Terms, Courses, Subjects, Sections and related entities. Started as a Purdue CS senior design project; queryable via standard OData query options. Confirmed live returning real catalog data.

Documentation

Specifications

Examples

Schemas & Data

Other Resources

OpenAPI Specification

purdue-catalog.yaml Raw ↑
openapi: 3.0.3
info:
  title: Purdue.io Course Catalog API
  description: >-
    A community-built, public OData v4 REST API exposing Purdue University's
    course catalog data, including Campuses, Buildings, Rooms, Terms, Courses,
    Classes, Sections, Meetings, Subjects and Instructors. This OpenAPI 3.0
    description was converted faithfully from the live OData v4 $metadata (EDMX
    4.0) document at https://api.purdue.io/odata/$metadata and verified against
    live responses. Entities are queryable via standard OData system query
    options. Note: the live service disables the $top option (limit 0); use
    $skip with server-driven paging instead.
  version: "4.0"
  contact:
    name: Purdue.io
    url: https://github.com/Purdue-io/PurdueApi
  license:
    name: MIT
    url: https://github.com/Purdue-io/PurdueApi/blob/master/LICENSE
servers:
  - url: https://api.purdue.io/odata
    description: Purdue.io OData production service
tags:
  - name: Campuses
  - name: Buildings
  - name: Rooms
  - name: Terms
  - name: Courses
  - name: Classes
  - name: Sections
  - name: Meetings
  - name: Subjects
  - name: Instructors
paths:
  /Campuses:
    get:
      tags: [Campuses]
      operationId: listCampuses
      summary: List campuses
      parameters:
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
        - $ref: '#/components/parameters/orderby'
        - $ref: '#/components/parameters/skip'
        - $ref: '#/components/parameters/count'
      responses:
        '200':
          description: A collection of campuses.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CampusCollection'
  /Campuses({Id}):
    get:
      tags: [Campuses]
      operationId: getCampus
      summary: Get a campus by Id
      parameters:
        - $ref: '#/components/parameters/keyId'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
      responses:
        '200':
          description: A single campus.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Campus'
        '404':
          $ref: '#/components/responses/NotFound'
  /Buildings:
    get:
      tags: [Buildings]
      operationId: listBuildings
      summary: List buildings
      parameters:
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
        - $ref: '#/components/parameters/orderby'
        - $ref: '#/components/parameters/skip'
        - $ref: '#/components/parameters/count'
      responses:
        '200':
          description: A collection of buildings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BuildingCollection'
  /Buildings({Id}):
    get:
      tags: [Buildings]
      operationId: getBuilding
      summary: Get a building by Id
      parameters:
        - $ref: '#/components/parameters/keyId'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
      responses:
        '200':
          description: A single building.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Building'
        '404':
          $ref: '#/components/responses/NotFound'
  /Rooms:
    get:
      tags: [Rooms]
      operationId: listRooms
      summary: List rooms
      parameters:
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
        - $ref: '#/components/parameters/orderby'
        - $ref: '#/components/parameters/skip'
        - $ref: '#/components/parameters/count'
      responses:
        '200':
          description: A collection of rooms.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RoomCollection'
  /Rooms({Id}):
    get:
      tags: [Rooms]
      operationId: getRoom
      summary: Get a room by Id
      parameters:
        - $ref: '#/components/parameters/keyId'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
      responses:
        '200':
          description: A single room.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Room'
        '404':
          $ref: '#/components/responses/NotFound'
  /Terms:
    get:
      tags: [Terms]
      operationId: listTerms
      summary: List terms
      parameters:
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
        - $ref: '#/components/parameters/orderby'
        - $ref: '#/components/parameters/skip'
        - $ref: '#/components/parameters/count'
      responses:
        '200':
          description: A collection of terms.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TermCollection'
  /Terms({Id}):
    get:
      tags: [Terms]
      operationId: getTerm
      summary: Get a term by Id
      parameters:
        - $ref: '#/components/parameters/keyId'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
      responses:
        '200':
          description: A single term.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Term'
        '404':
          $ref: '#/components/responses/NotFound'
  /Courses:
    get:
      tags: [Courses]
      operationId: listCourses
      summary: List courses
      parameters:
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
        - $ref: '#/components/parameters/orderby'
        - $ref: '#/components/parameters/skip'
        - $ref: '#/components/parameters/count'
      responses:
        '200':
          description: A collection of courses.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CourseCollection'
  /Courses({Id}):
    get:
      tags: [Courses]
      operationId: getCourse
      summary: Get a course by Id
      parameters:
        - $ref: '#/components/parameters/keyId'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
      responses:
        '200':
          description: A single course.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Course'
        '404':
          $ref: '#/components/responses/NotFound'
  /Classes:
    get:
      tags: [Classes]
      operationId: listClasses
      summary: List classes
      parameters:
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
        - $ref: '#/components/parameters/orderby'
        - $ref: '#/components/parameters/skip'
        - $ref: '#/components/parameters/count'
      responses:
        '200':
          description: A collection of classes.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClassCollection'
  /Classes({Id}):
    get:
      tags: [Classes]
      operationId: getClass
      summary: Get a class by Id
      parameters:
        - $ref: '#/components/parameters/keyId'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
      responses:
        '200':
          description: A single class.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Class'
        '404':
          $ref: '#/components/responses/NotFound'
  /Sections:
    get:
      tags: [Sections]
      operationId: listSections
      summary: List sections
      parameters:
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
        - $ref: '#/components/parameters/orderby'
        - $ref: '#/components/parameters/skip'
        - $ref: '#/components/parameters/count'
      responses:
        '200':
          description: A collection of sections.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SectionCollection'
  /Sections({Id}):
    get:
      tags: [Sections]
      operationId: getSection
      summary: Get a section by Id
      parameters:
        - $ref: '#/components/parameters/keyId'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
      responses:
        '200':
          description: A single section.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Section'
        '404':
          $ref: '#/components/responses/NotFound'
  /Meetings:
    get:
      tags: [Meetings]
      operationId: listMeetings
      summary: List meetings
      parameters:
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
        - $ref: '#/components/parameters/orderby'
        - $ref: '#/components/parameters/skip'
        - $ref: '#/components/parameters/count'
      responses:
        '200':
          description: A collection of meetings.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MeetingCollection'
  /Meetings({Id}):
    get:
      tags: [Meetings]
      operationId: getMeeting
      summary: Get a meeting by Id
      parameters:
        - $ref: '#/components/parameters/keyId'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
      responses:
        '200':
          description: A single meeting.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Meeting'
        '404':
          $ref: '#/components/responses/NotFound'
  /Subjects:
    get:
      tags: [Subjects]
      operationId: listSubjects
      summary: List subjects
      parameters:
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
        - $ref: '#/components/parameters/orderby'
        - $ref: '#/components/parameters/skip'
        - $ref: '#/components/parameters/count'
      responses:
        '200':
          description: A collection of subjects.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubjectCollection'
  /Subjects({Id}):
    get:
      tags: [Subjects]
      operationId: getSubject
      summary: Get a subject by Id
      parameters:
        - $ref: '#/components/parameters/keyId'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
      responses:
        '200':
          description: A single subject.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subject'
        '404':
          $ref: '#/components/responses/NotFound'
  /Instructors:
    get:
      tags: [Instructors]
      operationId: listInstructors
      summary: List instructors
      parameters:
        - $ref: '#/components/parameters/filter'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
        - $ref: '#/components/parameters/orderby'
        - $ref: '#/components/parameters/skip'
        - $ref: '#/components/parameters/count'
      responses:
        '200':
          description: A collection of instructors.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InstructorCollection'
  /Instructors({Id}):
    get:
      tags: [Instructors]
      operationId: getInstructor
      summary: Get an instructor by Id
      parameters:
        - $ref: '#/components/parameters/keyId'
        - $ref: '#/components/parameters/select'
        - $ref: '#/components/parameters/expand'
      responses:
        '200':
          description: A single instructor.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Instructor'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  parameters:
    keyId:
      name: Id
      in: path
      required: true
      description: The GUID key of the entity.
      schema:
        type: string
        format: uuid
    filter:
      name: $filter
      in: query
      required: false
      description: OData $filter expression for restricting the entities returned.
      schema:
        type: string
    select:
      name: $select
      in: query
      required: false
      description: OData $select comma-separated list of properties to return.
      schema:
        type: string
    expand:
      name: $expand
      in: query
      required: false
      description: OData $expand comma-separated list of related entities to include.
      schema:
        type: string
    orderby:
      name: $orderby
      in: query
      required: false
      description: OData $orderby expression for sorting the entities returned.
      schema:
        type: string
    skip:
      name: $skip
      in: query
      required: false
      description: OData $skip count for server-driven paging.
      schema:
        type: integer
        minimum: 0
    count:
      name: $count
      in: query
      required: false
      description: When true, requests the total count of matching entities.
      schema:
        type: boolean
  responses:
    NotFound:
      description: The requested entity was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ODataError'
  schemas:
    DaysOfWeek:
      description: >-
        Flags enumeration of meeting days (Edm enum, IsFlags=true, byte
        underlying type). Values may be combined as a comma-separated string.
      type: string
      enum:
        - None
        - Monday
        - Tuesday
        - Wednesday
        - Thursday
        - Friday
        - Saturday
        - Sunday
    Campus:
      type: object
      properties:
        Id:
          type: string
          format: uuid
        Code:
          type: string
          nullable: true
        Name:
          type: string
          nullable: true
        ZipCode:
          type: string
          nullable: true
        Buildings:
          type: array
          items:
            $ref: '#/components/schemas/Building'
        Classes:
          type: array
          items:
            $ref: '#/components/schemas/Class'
      required: [Id]
    Building:
      type: object
      properties:
        Id:
          type: string
          format: uuid
        CampusId:
          type: string
          format: uuid
          nullable: true
        Name:
          type: string
          nullable: true
        ShortCode:
          type: string
          nullable: true
        Campus:
          $ref: '#/components/schemas/Campus'
        Rooms:
          type: array
          items:
            $ref: '#/components/schemas/Room'
      required: [Id]
    Room:
      type: object
      properties:
        Id:
          type: string
          format: uuid
        Number:
          type: string
          nullable: true
        BuildingId:
          type: string
          format: uuid
          nullable: true
        Building:
          $ref: '#/components/schemas/Building'
      required: [Id]
    Term:
      type: object
      properties:
        Id:
          type: string
          format: uuid
        Code:
          type: string
          nullable: true
        Name:
          type: string
          nullable: true
        StartDate:
          type: string
          format: date
          nullable: true
        EndDate:
          type: string
          format: date
          nullable: true
        Classes:
          type: array
          items:
            $ref: '#/components/schemas/Class'
      required: [Id]
    Course:
      type: object
      properties:
        Id:
          type: string
          format: uuid
        Number:
          type: string
          nullable: true
        SubjectId:
          type: string
          format: uuid
          nullable: true
        Title:
          type: string
          nullable: true
        CreditHours:
          type: number
          format: double
        Description:
          type: string
          nullable: true
        Subject:
          $ref: '#/components/schemas/Subject'
        Classes:
          type: array
          items:
            $ref: '#/components/schemas/Class'
      required: [Id, CreditHours]
    Class:
      type: object
      properties:
        Id:
          type: string
          format: uuid
        CourseId:
          type: string
          format: uuid
          nullable: true
        TermId:
          type: string
          format: uuid
          nullable: true
        CampusId:
          type: string
          format: uuid
          nullable: true
        Course:
          $ref: '#/components/schemas/Course'
        Term:
          $ref: '#/components/schemas/Term'
        Campus:
          $ref: '#/components/schemas/Campus'
        Sections:
          type: array
          items:
            $ref: '#/components/schemas/Section'
      required: [Id]
    Section:
      type: object
      properties:
        Id:
          type: string
          format: uuid
        Crn:
          type: string
          nullable: true
        ClassId:
          type: string
          format: uuid
          nullable: true
        Type:
          type: string
          nullable: true
        StartDate:
          type: string
          format: date
          nullable: true
        EndDate:
          type: string
          format: date
          nullable: true
        Class:
          $ref: '#/components/schemas/Class'
        Meetings:
          type: array
          items:
            $ref: '#/components/schemas/Meeting'
      required: [Id]
    Meeting:
      type: object
      properties:
        Id:
          type: string
          format: uuid
        SectionId:
          type: string
          format: uuid
          nullable: true
        Type:
          type: string
          nullable: true
        StartDate:
          type: string
          format: date
          nullable: true
        EndDate:
          type: string
          format: date
          nullable: true
        DaysOfWeek:
          $ref: '#/components/schemas/DaysOfWeek'
        StartTime:
          type: string
          description: OData Edm.TimeOfDay value (HH:mm:ss.fffffff).
          nullable: true
        Duration:
          type: string
          description: OData Edm.Duration value (ISO 8601 duration).
        RoomId:
          type: string
          format: uuid
          nullable: true
        Section:
          $ref: '#/components/schemas/Section'
        Instructors:
          type: array
          items:
            $ref: '#/components/schemas/Instructor'
        Room:
          $ref: '#/components/schemas/Room'
      required: [Id, DaysOfWeek, Duration]
    Subject:
      type: object
      properties:
        Id:
          type: string
          format: uuid
        Name:
          type: string
          nullable: true
        Abbreviation:
          type: string
          nullable: true
        Courses:
          type: array
          items:
            $ref: '#/components/schemas/Course'
      required: [Id]
    Instructor:
      type: object
      properties:
        Id:
          type: string
          format: uuid
        Name:
          type: string
          nullable: true
        Email:
          type: string
          nullable: true
        Meetings:
          type: array
          items:
            $ref: '#/components/schemas/Meeting'
      required: [Id]
    ODataError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
    CampusCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.count':
          type: integer
        value:
          type: array
          items:
            $ref: '#/components/schemas/Campus'
    BuildingCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.count':
          type: integer
        value:
          type: array
          items:
            $ref: '#/components/schemas/Building'
    RoomCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.count':
          type: integer
        value:
          type: array
          items:
            $ref: '#/components/schemas/Room'
    TermCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.count':
          type: integer
        value:
          type: array
          items:
            $ref: '#/components/schemas/Term'
    CourseCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.count':
          type: integer
        value:
          type: array
          items:
            $ref: '#/components/schemas/Course'
    ClassCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.count':
          type: integer
        value:
          type: array
          items:
            $ref: '#/components/schemas/Class'
    SectionCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.count':
          type: integer
        value:
          type: array
          items:
            $ref: '#/components/schemas/Section'
    MeetingCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.count':
          type: integer
        value:
          type: array
          items:
            $ref: '#/components/schemas/Meeting'
    SubjectCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.count':
          type: integer
        value:
          type: array
          items:
            $ref: '#/components/schemas/Subject'
    InstructorCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.count':
          type: integer
        value:
          type: array
          items:
            $ref: '#/components/schemas/Instructor'