University of Waterloo Open Data API (v3)

Public REST API powered by the University of Waterloo Open Data Initiative, providing access to authoritative, approved datasets covering academic, campus, and student information (such as subjects and course-related data). Version 3 is the current release; access requires a free API key passed via an X-API-KEY request header. Version 2 was deprecated at the end of 2020.

Documentation

Specifications

Schemas & Data

Other Resources

OpenAPI Specification

university-of-waterloo-open-data-api.yaml Raw ↑
openapi: 3.0.4
info:
  title: Waterloo OpenData API
  version: v3
paths:
  /v3/AcademicOrganizations:
    get:
      tags:
      - AcademicOrganizations
      summary: Gets all Academic Organization data
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AcademicOrganization'
  /v3/AcademicOrganizations/{organizationCode}:
    get:
      tags:
      - AcademicOrganizations
      summary: Gets Academic Organization data for a specific entry by the Organization code
      parameters:
      - name: organizationCode
        in: path
        description: Unique Academic Organization code
        required: true
        schema:
          pattern: ^[A-Za-z]*$
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AcademicOrganization'
  /v3/Account/Register:
    post:
      tags:
      - Account
      summary: Use this method to request an API key and begin your registration process
      parameters:
      - name: email
        in: query
        description: A unique email that we can use to identify you and contact you. We will ask to confirm it.
        schema:
          type: string
      - name: project
        in: query
        description: A name and description of your project
        schema:
          type: string
      - name: uri
        in: query
        description: 'The web address of your project: it''s live location, app store entry, or similar'
        schema:
          type: string
      responses:
        '200':
          description: OK
  /v3/Account/{email}:
    get:
      tags:
      - Account
      summary: Use this method to see if an email has already been registered for an API key
      parameters:
      - name: email
        in: path
        description: Email address to check
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
  /v3/Account/{email}/notify:
    get:
      tags:
      - Account
      summary: Use this method to have us re-send the confirmation email to an account pending confirmation, if it exists.
        The activation code will be reset in the process.
      parameters:
      - name: email
        in: path
        description: Email address to re-send confirmation email to
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
  /v3/Account/{email}/{apiKey}/reset:
    get:
      tags:
      - Account
      summary: User this method to put your account in pending confirmation status and generate a new API key. Your old key
        will no longer grant access. The account will need to be confirmed again before the new key grants access.
      parameters:
      - name: email
        in: path
        description: Email address of associated account to reset
        required: true
        schema:
          type: string
      - name: apiKey
        in: path
        description: Current API account key
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
  /v3/Account/Confirm:
    post:
      tags:
      - Account
      summary: Use this method to confirm your email and activate your account
      parameters:
      - name: email
        in: query
        description: Email address you used to register
        schema:
          type: string
      - name: code
        in: query
        description: Activation code we sent you in the confirmation email
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: OK
  /v3/ClassSchedules/{termCode}:
    get:
      tags:
      - ClassSchedules
      summary: Get the Course IDs that have one or more active and associated schedules in the given Term
      parameters:
      - name: termCode
        in: path
        description: Waterloo Term code to filter on
        required: true
        schema:
          maxLength: 4
          minLength: 4
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
  /v3/ClassSchedules/{termCode}/{courseId}:
    get:
      tags:
      - ClassSchedules
      summary: Get Class data for a scheduled Course by Course ID, in a specific Term
      parameters:
      - name: termCode
        in: path
        description: Waterloo Term code to filter on
        required: true
        schema:
          maxLength: 4
          minLength: 4
          type: string
      - name: courseId
        in: path
        description: Course ID to filter on
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Class'
  /v3/ClassSchedules/{termCode}/{subject}/{catalogNumber}:
    get:
      tags:
      - ClassSchedules
      summary: Get Class data for a scheduled Course by Subject and catalog number, in a specific Term
      parameters:
      - name: termCode
        in: path
        description: Waterloo Term code to filter on
        required: true
        schema:
          maxLength: 4
          minLength: 4
          type: string
      - name: subject
        in: path
        description: Academic Subject code to filter ron
        required: true
        schema:
          pattern: ^[A-Za-z]*$
          type: string
      - name: catalogNumber
        in: path
        description: Catalog number to filter on
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Class'
  /v3/Courses/{termCode}:
    get:
      tags:
      - Courses
      summary: Get all Course data for a Term
      parameters:
      - name: termCode
        in: path
        required: true
        schema:
          maxLength: 4
          minLength: 4
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Course'
  /v3/Courses/{termCode}/{courseId}:
    get:
      tags:
      - Courses
      summary: Get Course catalog data filtered by Term and Course ID, multiple Courses are usually cross listed
      parameters:
      - name: termCode
        in: path
        description: Term code to filter on
        required: true
        schema:
          maxLength: 4
          minLength: 4
          type: string
      - name: courseId
        in: path
        description: Course ID to filter on
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Course'
  /v3/Courses/{termCode}/{courseId}/{offerNumber}:
    get:
      tags:
      - Courses
      summary: Get Course catalog data filtered by Term, Course ID, and offer number
      parameters:
      - name: termCode
        in: path
        description: Term code to filter on
        required: true
        schema:
          maxLength: 4
          minLength: 4
          type: string
      - name: courseId
        in: path
        description: Course ID to filter on
        required: true
        schema:
          type: integer
      - name: offerNumber
        in: path
        description: Offer number to filter on
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Course'
  /v3/Courses/{termCode}/{subject}:
    get:
      tags:
      - Courses
      summary: Get Course catalog data filtered by Term and Subject code
      parameters:
      - name: termCode
        in: path
        description: Term code to filter on
        required: true
        schema:
          maxLength: 4
          minLength: 4
          type: string
      - name: subject
        in: path
        description: Academic Subject code to filter on
        required: true
        schema:
          pattern: ^[A-Za-z]*$
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Course'
  /v3/Courses/{termCode}/{subject}/{catalogNumber}:
    get:
      tags:
      - Courses
      summary: Get Course catalog data filtered by Term, Subject, and catalog number
      parameters:
      - name: termCode
        in: path
        description: Term code to filter on
        required: true
        schema:
          maxLength: 4
          minLength: 4
          type: string
      - name: subject
        in: path
        description: Academic Subject code to filter on
        required: true
        schema:
          pattern: ^[A-Za-z]*$
          type: string
      - name: catalogNumber
        in: path
        description: 'Course catalog number to filter on, ie: 101, 111W, 239'
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Course'
  /v3/ExamSchedules:
    get:
      tags:
      - ExamSchedules
      summary: Returns Exam Schedule data for the current Term
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Exam'
  /v3/ExamSchedules/{code}:
    get:
      tags:
      - ExamSchedules
      summary: Returns Exam Schedule data for the requested Term
      parameters:
      - name: code
        in: path
        description: Waterloo Term code
        required: true
        schema:
          maxLength: 4
          minLength: 4
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Exam'
  /v3/FoodServices/outlets:
    get:
      tags:
      - FoodServices
      summary: Get all food service Outlet data
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FoodServicesOutlets'
  /v3/FoodServices/outlets/{id}:
    get:
      tags:
      - FoodServices
      summary: Get specific food services Outlet data by Id
      parameters:
      - name: id
        in: path
        description: WCMS object ID representing the Outlet
        required: true
        schema:
          minimum: 0
          type: integer
          format: int32
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FoodServicesOutlet'
  /v3/FoodServices/outlets/{name}:
    get:
      tags:
      - FoodServices
      summary: Get specific food services Outlet data by Outlet name
      parameters:
      - name: name
        in: path
        description: Name to filter Outlet by
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FoodServicesOutlet'
  /v3/FoodServices/franchises:
    get:
      tags:
      - FoodServices
      summary: Get all food service Franchise data
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FoodServicesFranchises'
  /v3/FoodServices/franchises/{id}:
    get:
      tags:
      - FoodServices
      summary: Get specific food sercices Franchise data by Id
      parameters:
      - name: id
        in: path
        description: WCMS object ID representing the Franchise
        required: true
        schema:
          minimum: 0
          type: integer
          format: int32
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FoodServicesFranchise'
  /v3/FoodServices/franchises/{name}:
    get:
      tags:
      - FoodServices
      summary: Get specific food services Franchise data by Franchise name
      parameters:
      - name: name
        in: path
        description: Name to filter Franchise by
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FoodServicesFranchise'
  /v3/HolidayDates/paidholidays:
    get:
      tags:
      - HolidayDates
      summary: Retrieves data for all paid holidays as published by Human Resources
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/PaidHoliday'
  /v3/HolidayDates/paidholidays/{year}:
    get:
      tags:
      - HolidayDates
      summary: Retrieves data for paid holidays associated to the given year as published by Human Resources
      parameters:
      - name: year
        in: path
        required: true
        schema:
          maximum: 2050
          minimum: 2000
          type: integer
          format: int32
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/PaidHoliday'
  /v3/HolidayDates/paidholidays/ics:
    get:
      tags:
      - HolidayDates
      summary: Retrieves data for all paid holidays as published by Human Resources, as an ICS format feed. Allows anonymous
        access.
      responses:
        '200':
          description: OK
  /v3/ImportantDates:
    get:
      tags:
      - ImportantDates
      summary: Returns all current data for Important Dates
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ImportantDate'
  /v3/ImportantDates/{year}:
    get:
      tags:
      - ImportantDates
      summary: Returns important date data related to academic year
      parameters:
      - name: year
        in: path
        description: Academic year to filter on
        required: true
        schema:
          maximum: 2050
          minimum: 2000
          type: integer
          format: int32
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ImportantDate'
  /v3/Locations:
    get:
      tags:
      - Locations
      summary: Get all building location data
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Location'
  /v3/Locations/geojson:
    get:
      tags:
      - Locations
      summary: Get all building location data as GEO JSON
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationGeo'
  /v3/Locations/{locationCode}:
    get:
      tags:
      - Locations
      summary: Gets building by matched building code, case insensitive
      parameters:
      - name: locationCode
        in: path
        description: Building code to match
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Location'
  /v3/Locations/{locationCode}/geojson:
    get:
      tags:
      - Locations
      summary: Gets building by matched building code, case insensitive, as GEO JSON
      parameters:
      - name: locationCode
        in: path
        description: Building code to match
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationGeo'
  /v3/Locations/search/{locationName}:
    get:
      tags:
      - Locations
      summary: Gets buildings by matched building name, contains, case insensitive
      parameters:
      - name: locationName
        in: path
        description: Text to match in building name
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Location'
  /v3/Locations/search/{locationName}/geojson:
    get:
      tags:
      - Locations
      summary: Gets buildings by matched building name, contains, case insensitive, as GEO JSON
      parameters:
      - name: locationName
        in: path
        description: Text to match in building name
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationGeo'
  /v3/Subjects:
    get:
      tags:
      - Subjects
      summary: Gets all Subject data
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Subject'
  /v3/Subjects/{code}:
    get:
      tags:
      - Subjects
      summary: Gets Subject data filtered by Subject code
      parameters:
      - name: code
        in: path
        description: Specific Subject code
        required: true
        schema:
          pattern: ^[A-Za-z]*$
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Subject'
  /v3/Subjects/associatedto/{organizationCode}:
    get:
      tags:
      - Subjects
      summary: Gets Subject data for Subjects associated to an Academic Organization by Organization code
      parameters:
      - name: organizationCode
        in: path
        description: Academic Organization Code that associates to the Subjects
        required: true
        schema:
          pattern: ^[A-Za-z]*$
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Subject'
  /v3/Terms:
    get:
      tags:
      - Terms
      summary: Gets all Term data that is effective at the current time
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Term'
  /v3/Terms/current:
    get:
      tags:
      - Terms
      summary: Gets the current Term data
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Term'
  /v3/Terms/{code}:
    get:
      tags:
      - Terms
      summary: Gets Term data for a specific Term filtered by code
      parameters:
      - name: code
        in: path
        description: Term 4 digit Code
        required: true
        schema:
          maxLength: 4
          minLength: 4
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Term'
  /v3/Wcms:
    get:
      tags:
      - Wcms
      summary: Retrieves information about all active and published WCMS sites
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Site'
  /v3/Wcms/{id}:
    get:
      tags:
      - Wcms
      summary: Retrieves information about a specific WCMS site by Site Id
      parameters:
      - name: id
        in: path
        description: Unique site Id
        required: true
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Site'
  /v3/Wcms/latestnews/{maxItems}:
    get:
      tags:
      - Wcms
      summary: Retrieves the latest news items across all WCMS sites, ordered by posted date
      parameters:
      - name: maxItems
        in: path
        description: Number of items to retrieve, default 15, maximum 25
        required: true
        schema:
          type: integer
          format: int32
          default: 15
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SiteNews'
  /v3/Wcms/latestevents/{maxItems}:
    get:
      tags:
      - Wcms
      summary: Retrieves the latest events items across all WCMS sites, ordered by event start date
      parameters:
      - name: maxItems
        in: path
        description: Number of items to retrieve, default 15, maximum 25
        required: true
        schema:
          type: integer
          format: int32
          default: 15
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SiteEvent'
  /v3/Wcms/latestposts/{maxItems}:
    get:
      tags:
      - Wcms
      summary: Retrieves the latest blog post items across all WCMS sites, ordered by posted date
      parameters:
      - name: maxItems
        in: path
        description: Number of items to retrieve, default 15, maximum 25
        required: true
        schema:
          type: integer
          format: int32
          default: 15
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SiteBlogPost'
  /v3/Wcms/{id}/news:
    get:
      tags:
      - Wcms
      summary: Retrieves all news items for a specific WCMS site by Site Id
      parameters:
      - name: id
        in: path
        description: Unique Id for the Site
        required: true
        schema:
          type: integer
          format: int32
      - name: maxItems
        in: query
        description: (Optional) Maximum amount of items to retrieve
        schema:
          type: integer
          format: int32
      - name: newestFirst
        in: query
        description: (Optional) Requires maxItems parameter, sorts items by created date, newest first
        schema:
          type: boolean
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SiteNews'
  /v3/Wcms/{id}/posts:
    get:
      tags:
      - Wcms
      summary: Retrieves all blog post items for a specific WCMS site by Site Id
      parameters:
      - name: id
        in: path
        description: Unique Id for the Site
        required: true
        schema:
          type: integer
          format: int32
      - name: maxItems
        in: query
        description: (Optional) Maximum amount of items to retrieve
        schema:
          type: integer
          format: int32
      - name: newestFirst
        in: query
        description: (Optional) Requires maxItems parameter, sorts items by created date, newest first
        schema:
          type: boolean
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SiteBlogPost'
  /v3/Wcms/{id}/events:
    get:
      tags:
      - Wcms
      summary: Retrieves all event items for a specific WCMS site by Site Id
      parameters:
      - name: id
        in: path
        description: Unique Id for the Site
        required: true
        schema:
          type: integer
          format: int32
      - name: maxItems
        in: query
        description: (Optional) Maximum amount of items to retrieve
        schema:
          type: integer
          format: int32
      - name: newestFirst
        in: query
        description: (Optional) Requires maxItems parameter, sorts items by created date, newest first
        schema:
          type: boolean
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SiteEvent'
components:
  schemas:
    AcademicOrganization:
      type: object
      properties:
        code:
          type: string
          description: Unique Code of this Academic Organization
          nullable: true
        name:
          type: string
          description: The Name for this Academic Organization, most often the display name
          nullable: true
        description:
          type: string
          description: The short description for this Academic Organization
          nullable: true
        descriptionFormal:
          type: string
          description: The formal description for this Academic Organization, most often used in official capacity
          nullable: true
        associatedCampusCode:
          type: string
          description: The Code for the Campus that this Academic Organization is assigned to
          nullable: true
      additionalProperties: false
      description: An Academic Organization at Waterloo is similar to a department
    Addon:
      type: object
      properties:
        name:
          type: string
          nullable: true
        photo:
          nullable: true
        price:
          type: string
          nullable: true
        calories:
          nullable: true
      additionalProperties: false
    Body:
      type: object
      properties:
        predicates:
          type: array
          items:
            type: string
          nullable: true
      additionalProperties: false
    Changed:
      type: object
      properties:
        predicates:
          type: array
          items:
            type: string
          nullable: true
        datatype:
          type: string
          nullable: true
        callback:
          type: string
          nullable: true
      additionalProperties: false
    Class:
      type: object
      properties:
        courseId:
          type: string
          description: Course identifier number, not unique
          nullable: true
        courseOfferNumber:
          type: integer
          description: Course offer number identifier for this class
          format: int32
        sessionCode:
          type: string
          description: Session code for this class
          nullable: true
        classSection:
          type: integer
          description: Number identifying the section of this class
          format: int32
        termCode:
          type: string
          description: Waterloo academic term code
          nullable: true
        classNumber:
          type: integer
          description: Class number identifier for this class
          format: int32
        courseComponent:
          type: string
          description: Course component code for this class
          nullable: true
        associatedClassCode:
          type: integer
          description: Associated class code for this class
          format: int32
        maxEnrollmentCapacity:
          type: integer
          description: Indicates the maximum number of students that can enroll in this class
          format: int32
        enrolledStudents:
          type: integer
          description: Indicates the current number of students enrolled in this class
          format: int32
        enrollConsentCode:
          type: string
          description: Code describing whether No, Instructor, or Department consent to enroll is required. Overrides Course
            level information if different.
          nullable: true
        enrollConsentDescription:
          type: string
          description: Description of the enroll requirement. Overrides Course level information if different.
          nullable: true
          readOnly: true
        dropConsentCode:
          type: string
          description: Code describing whether No, Instructor, or Department consent to drop is required. Overrides Course
            level information if different.
          nullable: true
        dropConsentDescription:
          type: string
          description: Description of the drop requirement. Overrides Course level information if different.
          nullable: true
          readOnly: true
        scheduleData:
          type: array
          items:
            $ref: '#/components/schemas/ClassSchedule'
          description: Schedule data for this class
          nullable: true
        instructorData:
          type: array
          items:
            $ref: '#/components/schemas/ClassInstructor'
          description: Instructor data for this class
          nullable: true
      additionalProperties: false
      description: Represents an Academic class, which is a scheduled instance of a Course
    ClassInstructor:
      type: object
      properties:
        courseId:
          type: string
          description: Course identifier number, not unique
          nullable: true
        courseOfferNumber:
          type: integer
          description: Course offer number identifier for this class
          format: int32
        sessionCode:
          type: string
          description: Session code number for this class
          nullable: true
        classSection:
          type: integer
          description: Number identifying the section of this class
          format: int32
        termCode:
          type: string
          description: Waterloo academic term code
          nullable: true
        instructorRoleCode:
          type: string
          description: REMOVED for privacy. The code designation for the instructor's role in this class
          nullable: true
        instructorFirstName:
          type: string
          description: REMOVED for privacy. The Instructors preferred first name
        

# --- truncated at 32 KB (77 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/university-of-waterloo/refs/heads/main/openapi/university-of-waterloo-open-data-api.yaml