University of Toronto Courses API

Course, section and meeting-time retrieval.

Operations 3

POST /getPageableCourses Search the timetable, one page at a time #
POST /getCourses Search the timetable without paging #
GET /getCoursesByCodeAndSectionCode/{code} Retrieve every offering of one course code #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/university-of-toronto-courses-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

university-of-toronto-courses-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: University of Toronto Timetable Builder Courses API
  version: '2026-08-19'
  x-operator: institution
  x-provenance:
    generated: '2026-08-19'
    method: derived
    source: Derived by API Evangelist from live, unauthenticated probes of https://api.easi.utoronto.ca/ttb on 2026-08-19 and from the operation constants declared in the official Timetable Builder client bundle at https://ttb.utoronto.ca/main.934e36b03104594f.js. The University of Toronto does not publish an OpenAPI description for this API; this document is a third-party observation, not a University of Toronto artifact.
  description: Unofficial, observation-derived description of the public JSON API behind the University of Toronto Timetable Builder (https://ttb.utoronto.ca), operated by Enterprise Applications and Solutions Integration (EASI) within U of T Information Technology Services.
  contact:
    name: University of Toronto — Enterprise Applications and Solutions Integration (EASI)
    url: https://easi.its.utoronto.ca/
  termsOfService: https://www.utoronto.ca/privacy
servers:
- url: https://api.easi.utoronto.ca/ttb
  description: Production Timetable Builder API (probed live 2026-08-19)
tags:
- name: Courses
  description: Course, section and meeting-time retrieval.
paths:
  /getPageableCourses:
    post:
      tags:
      - Courses
      operationId: getPageableCourses
      summary: Search the timetable, one page at a time
      description: 'The primary search operation. Accepts a faceted search body and returns a page of matching courses together with the divisional legends and enrolment-indicator glossaries needed to render them. Verified live 2026-08-19: HTTP 200 with course data for courseCode CSC108H1, session 20269, division ARTSC.

        A search that matches nothing returns HTTP 404 with a body-level status code 4404 and a null payload, not an empty collection — see the ApplicationStatus schema.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CourseSearch'
            examples:
              live:
                externalValue: ../examples/ttb-pageable-courses-request.json
      responses:
        '200':
          description: One page of matching courses.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PageableCourseEnvelope'
              examples:
                live:
                  externalValue: ../examples/ttb-pageable-courses-response.json
            application/xml:
              schema:
                type: string
                description: 'Returned when the client does not send Accept: application/json. The service content-negotiates and will emit a <TTBResponse> XML document instead.'
        '404':
          description: 'Either the gateway did not match the route, or the search matched no courses. The two are distinguishable by body: a gateway miss carries statusCode/message, a no-result search carries a null payload and status code 4404.'
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/GatewayError'
                - $ref: '#/components/schemas/ApplicationStatusEnvelope'
              examples:
                noResults:
                  externalValue: ../examples/ttb-no-results-response.json
                gatewayMiss:
                  externalValue: ../examples/ttb-gateway-404-response.json
  /getCourses:
    post:
      tags:
      - Courses
      operationId: getCourses
      summary: Search the timetable without paging
      description: 'Same search body as getPageableCourses minus the paging fields, returning every match in one response. Verified live 2026-08-19: HTTP 200 with a 12.9 MB body for a division-wide search. Callers should prefer getPageableCourses; there is no documented rate limit and no compression negotiated by default.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CourseSearch'
      responses:
        '200':
          description: Every matching course.
          content:
            application/json:
              schema:
                type: object
                properties:
                  payload:
                    type: array
                    items:
                      $ref: '#/components/schemas/Course'
                  status:
                    type: array
                    items:
                      $ref: '#/components/schemas/ApplicationStatus'
        '404':
          $ref: '#/components/responses/GatewayNotFound'
  /getCoursesByCodeAndSectionCode/{code}:
    get:
      tags:
      - Courses
      operationId: getCoursesByCodeAndSectionCode
      summary: Retrieve every offering of one course code
      description: 'Returns the pageable-course envelope for a single course code. Verified live 2026-08-19 with code CSC108H1: HTTP 200, ~295 KB. The client bundle also builds a two-segment form carrying a section code; that form returned HTTP 404 on 2026-08-19 and is therefore NOT described here.'
      parameters:
      - name: code
        in: path
        required: true
        description: Uppercase course code, for example CSC108H1.
        schema:
          type: string
          pattern: ^[A-Z]{3}[0-9]{3}[A-Z][0-9]$
        example: CSC108H1
      responses:
        '200':
          description: Offerings of the requested course.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PageableCourseEnvelope'
        '404':
          $ref: '#/components/responses/GatewayNotFound'
components:
  schemas:
    ApplicationStatus:
      type: object
      description: Business-level status returned inside the response body. Observed value 4404 = no results. The University publishes no catalogue of these codes; see errors/ for what has been observed.
      properties:
        code:
          type: integer
          example: 4404
        message:
          type: string
          example: No results found. Please try modifying your search criteria.
    ApplicationStatusEnvelope:
      type: object
      properties:
        payload:
          type: 'null'
        status:
          type: array
          items:
            $ref: '#/components/schemas/ApplicationStatus'
    Course:
      type: object
      properties:
        id:
          type: string
          description: Opaque identifier. Observed to change between timetable publications — not a stable key.
          example: 69dd3ea4830c3634bbb69786
        name:
          type: string
          example: Mathematics of Finance for Non-Actuaries
        ucName:
          type:
          - string
          - 'null'
        code:
          type: string
          example: ACT230H1
        sectionCode:
          type: string
          enum:
          - F
          - S
          - Y
        campus:
          type: string
          example: St. George
        sessions:
          type: array
          items:
            type: string
        sections:
          type: array
          items:
            $ref: '#/components/schemas/Section'
    PageableCourseEnvelope:
      type: object
      properties:
        payload:
          type: object
          properties:
            pageableCourse:
              type: object
              properties:
                courses:
                  type: array
                  items:
                    $ref: '#/components/schemas/Course'
                total:
                  type: integer
                page:
                  type: integer
                pageSize:
                  type: integer
                direction:
                  type: string
            divisionalLegends:
              type: object
              description: Division code to an HTML legend explaining that division's course coding.
              additionalProperties:
                type: string
            divisionalEnrolmentIndicators:
              type: object
              description: Division code to the list of enrolment-control indicator codes it uses.
              additionalProperties:
                type: array
                items:
                  type: object
                  properties:
                    code:
                      type: string
                    name:
                      type: string
        status:
          type: array
          items:
            $ref: '#/components/schemas/ApplicationStatus'
    MeetingTime:
      type: object
      properties:
        start:
          $ref: '#/components/schemas/DayTime'
        end:
          $ref: '#/components/schemas/DayTime'
        building:
          $ref: '#/components/schemas/Building'
        sessionCode:
          type: string
        repetition:
          type: string
          example: WEEKLY
        repetitionTime:
          type: string
          example: ONCE_A_WEEK
    DayTime:
      type: object
      description: Non-standard time encoding. `day` is an integer weekday index and `millisofday` is milliseconds since local midnight; there is no timezone, date or ISO-8601 field anywhere in the response.
      properties:
        day:
          type: integer
          minimum: 1
          maximum: 7
        millisofday:
          type: integer
          example: 43200000
    Section:
      type: object
      properties:
        name:
          type: string
          example: TUT0102
        type:
          type: string
          example: Tutorial
        teachMethod:
          type: string
          example: TUT
        sectionNumber:
          type: string
        meetingTimes:
          type: array
          items:
            $ref: '#/components/schemas/MeetingTime'
        instructors:
          type: array
          items:
            type: object
        currentEnrolment:
          type: integer
        maxEnrolment:
          type: integer
        currentWaitlist:
          type: integer
        subTitle:
          type: string
        cancelInd:
          type: string
          enum:
          - Y
          - N
        waitlistInd:
          type: string
          enum:
          - Y
          - N
        tbaInd:
          type: string
          enum:
          - Y
          - N
        openLimitInd:
          type: string
          enum:
          - Y
          - N
        deliveryModes:
          type: array
          items:
            type: object
            properties:
              session:
                type: string
              mode:
                type: string
                example: INPER
        notes:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              type:
                type: string
              content:
                type: string
        enrolmentControls:
          type: array
          items:
            type: object
    GatewayError:
      type: object
      description: Edge-level error emitted by the api.easi.utoronto.ca gateway before the TTB service is reached.
      properties:
        statusCode:
          type: integer
          example: 404
        message:
          type: string
          example: Resource not found
    Building:
      type: object
      properties:
        buildingCode:
          type: string
          example: SF
        buildingRoomNumber:
          type: string
        buildingRoomSuffix:
          type: string
        buildingUrl:
          type: string
          format: uri
          description: Deep link into the official U of T campus map at https://map.utoronto.ca.
          example: https://map.utoronto.ca/?id=1809#!m/494481
        buildingName:
          type:
          - string
          - 'null'
    CourseSearch:
      type: object
      description: Faceted timetable search. Empty arrays mean "do not filter on this facet".
      required:
      - courseCodeAndTitleProps
      - sessions
      - divisions
      properties:
        courseCodeAndTitleProps:
          type: object
          properties:
            courseCode:
              type: string
              example: CSC108H1
            courseTitle:
              type: string
            courseSectionCode:
              type: string
              description: F (fall), S (winter) or Y (full year).
            searchCourseDescription:
              type: boolean
        departmentProps:
          type: array
          items:
            type: object
        campuses:
          type: array
          items:
            type: string
            example: ST_GEORGE
        sessions:
          type: array
          description: Session codes, for example 20269 for Fall 2026.
          items:
            type: string
        requirementProps:
          type: array
          items:
            type: object
        instructor:
          type: string
        courseLevels:
          type: array
          items:
            type: string
        deliveryModes:
          type: array
          items:
            type: string
        dayPreferences:
          type: array
          items:
            type: object
        timePreferences:
          type: array
          items:
            type: object
        divisions:
          type: array
          description: Division codes, for example ARTSC, APSC, ERIN, SCAR.
          items:
            type: string
        creditWeights:
          type: array
          items:
            type: string
        page:
          type: integer
          minimum: 1
          description: getPageableCourses only.
        pageSize:
          type: integer
          description: getPageableCourses only.
        direction:
          type: string
          enum:
          - asc
          - desc
  responses:
    GatewayNotFound:
      description: The gateway did not match a route.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/GatewayError'
          examples:
            live:
              externalValue: ../examples/ttb-gateway-404-response.json