CU-REG Course Schedule API

The read-only JSON backend behind CU-REG Course Schedule, the Office of the Registrar's public course, curriculum and timetable browser. Two endpoints answer HTTP 200 to an unauthenticated request from outside the campus network — /course-studies, which returns the curriculum register with degree and major names in Thai and English, credit totals and offering windows, and /version. The Angular client declares thirteen further endpoints against the same base (/course, /course-detail, /faculty, /instructor, /exam-date and others); all thirteen returned 404 on probe, and they are recorded as observations in the OpenAPI rather than promoted to a contract that cannot be demonstrated. No key, no token, no published rate limit, no terms of use. A bare GET on the base /class/api issues a 301 to http://cas.reg.chula.ac.th:8080/class/api/, leaking the origin port and downgrading to plain HTTP.

Operations 2

GET /version Deployed build version of the course schedule service #
GET /course-studies List degree programs and fields of study #

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/course-schedule"
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

chulalongkorn-course-schedule-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: CU-REG Course Schedule API
  version: '2026.8.21-1644-1a51328'
  description: >-
    The read-only JSON API behind CU-REG Course Schedule, the public course, curriculum and
    class-timetable browser operated by the Office of the Registrar, Chulalongkorn
    University, at https://cas.reg.chula.ac.th/class/course-schedule. The browser is an
    Angular single-page application; this document describes the backend it calls, which is
    served from the same origin under /class/api and requires no credentials.

    THIS DOCUMENT WAS NOT PUBLISHED BY CHULALONGKORN UNIVERSITY. It is an API Evangelist
    reconstruction, and its scope is deliberately narrow: only operations that were fetched
    and returned HTTP 200 on 2026-09-01 are described as paths. The application's own bundle
    (main-STPCQOCS.js) declares a further thirteen endpoint names against the same base;
    every one of them returned HTTP 404 to an unauthenticated request from outside the
    campus network on that date, so they are recorded under x-client-declared-endpoints as
    observations rather than promoted to paths we cannot demonstrate.
  contact:
    name: Office of the Registrar, Chulalongkorn University
    url: https://www.reg.chula.ac.th/
  x-provenance:
    generated: '2026-09-01'
    method: probed
    source: https://cas.reg.chula.ac.th/class/api/
    authored_by: API Evangelist
    note: >-
      Endpoint names read from the application bundle at
      https://cas.reg.chula.ac.th/class/main-STPCQOCS.js (HTTP 200), then each one fetched.
      Schemas below are inferred from the 50-record response body actually returned by
      GET /class/api/course-studies (HTTP 200, 43,377 bytes), archived at
      examples/chulalongkorn-course-studies-example.json.
servers:
  - url: https://cas.reg.chula.ac.th/class/api
    description: Production CU-REG Course Schedule backend
tags:
  - name: Curriculum
    description: Degree programs and fields of study
  - name: Meta
    description: Service metadata
paths:
  /version:
    get:
      tags: [ Meta ]
      operationId: getVersion
      summary: Deployed build version of the course schedule service
      responses:
        '200':
          description: Build identifier.
          content:
            application/json:
              schema:
                type: object
                properties:
                  version:
                    type: string
                    description: Build stamp, formatted YYYY.M.D-HHMM-<commit>.
                required: [ version ]
              example:
                version: 2026.8.21-1644-1a51328
  /course-studies:
    get:
      tags: [ Curriculum ]
      operationId: listCourseStudies
      summary: List degree programs and fields of study
      description: >-
        Returns the registrar's curriculum register: each degree program with its degree
        and major names in Thai and English, credit total, nominal and maximum years of
        study, and the academic-year/semester window in which the program is offered.
        Verified live and unauthenticated; the response observed on 2026-09-01 carried 50
        records with no pagination envelope.
      parameters:
        - name: lang
          in: query
          required: false
          schema: { type: string, enum: [ en, th ] }
          description: >-
            Language hint sent by the client. Accepted; the observed response returns both
            the Thai and the English name fields regardless of its value.
      responses:
        '200':
          description: Curriculum register.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items: { $ref: '#/components/schemas/CourseStudy' }
                required: [ data ]
        '404':
          description: >-
            Returned by this service for an unmatched route, as an Express HTML error page
            rather than JSON. The client treats a 404 as an empty result set.
          content:
            text/html:
              schema: { type: string }
components:
  schemas:
    CourseStudy:
      type: object
      description: One degree program / field of study in the registrar's curriculum register.
      properties:
        id: { type: string, description: Program identifier. }
        programsystem: { type: string }
        studyprogramsystem: { type: string, description: Study program system code, e.g. S. }
        calendar: { type: string, description: Academic calendar code. }
        coursecodeno: { type: string }
        degree: { type: string, description: Degree code. }
        majorcode: { type: string, description: Major code. }
        noyearstudy: { type: string, description: Nominal years of study. }
        minperiodstudy: { type: integer }
        maxperiodstudy: { type: integer }
        credittotal: { type: integer, description: Total credits required. }
        plan1: { type: string, nullable: true, description: Plan designation, in Thai. }
        language1: { type: string, nullable: true }
        beginyear: { type: string, description: First academic year offered (Buddhist or Gregorian as stored). }
        beginsemester: { type: string }
        lastyear: { type: string }
        lastsemester: { type: string }
        stopyear: { type: string, description: Last academic year offered; 9999 where open-ended. }
        stopsemester: { type: string }
        international:
          type: object
          nullable: true
          description: >-
            International-program flag. Serialized by the backend as a raw Node.js Buffer
            rather than a boolean — {"type":"Buffer","data":[48]} for "0". Recorded as
            observed; this is a leak of the storage layer into the contract, not a designed
            representation.
          properties:
            type: { type: string, example: Buffer }
            data:
              type: array
              items: { type: integer }
        status: { type: string, nullable: true }
        conferanceno: { type: string, nullable: true }
        conferancedate: { type: string, nullable: true }
        effectivedate: { type: string, nullable: true }
        expiredate: { type: string, nullable: true }
        user_id: { type: string, nullable: true }
        updatedate: { type: string, nullable: true }
        created_date: { type: string, nullable: true }
        changestamp: { type: string, nullable: true }
        currid: { type: string, nullable: true }
        degree_thai: { type: string }
        degree_english: { type: string }
        major_thai: { type: string }
        major_english: { type: string }
      required: [ id, degree_thai, degree_english, major_thai, major_english ]
x-client-declared-endpoints:
  note: >-
    Declared by the Angular client against the same base URL and observed returning HTTP 404
    to an unauthenticated external request on 2026-09-01. Listed so the gap is recorded, not
    so it can be mistaken for a documented contract.
  probed: '2026-09-01'
  endpoints:
    - { path: /course, status: 404 }
    - { path: /course-detail, status: 404 }
    - { path: /course-header, status: 404 }
    - { path: /course-group, status: 404 }
    - { path: /course-group-detail, status: 404 }
    - { path: /course-description, status: 404 }
    - { path: /class-day, status: 404 }
    - { path: /class-time, status: 404 }
    - { path: /exam-date, status: 404 }
    - { path: /faculty, status: 404 }
    - { path: /general-education, status: 404 }
    - { path: /instructor, status: 404 }
    - { path: /year-semester, status: 404 }