Skip to content

Course listings

Search a term’s course listings by department code, course name and instructor name. No login is needed, and all three conditions are optional, so with all of them empty you get the whole term. Find department and term codes on Department and term codes. Common rules are on Common rules.

Python uses snake_case; Node.js and Java use camelCase (for example department_code is departmentCode). In Java, pass an empty string ("") for the optional arguments you do not use.

Parameter Type Required Default Meaning
category_code string required - Organization category code (undergraduate 20, general graduate school 30, …). Get the values from the code tables and pass them in
year string required - Year
semester_code string required - Term code (10, 11, 20, 21)
department_code string optional "" Department code. Empty means no department limit
course_name string optional "" Course name search text (partial match). Empty means no limit
instructor_name string optional "" Instructor name search text. Empty means no limit
  • The three conditions are independent: combine only the ones you need. With all three empty you get the whole term.
  • Returns a list of Lecture.

School request

  • POST https://sjpt.sejong.ac.kr/sch/sch/ext/SueOpenTimeQ/doList.do, body {"dm_search": {...}}, response dataset dl_main.
  • The school answers _SUBMIT_ERROR_ if any filter key is missing, so the library sends every key you do not use as an empty value.
  • The school treats a single space as a search text, so values are trimmed before sending.

Example JSON. Field names are Python snake_case; Node.js and Java use camelCase. School data changes, so the values are examples.

[
{
"course_number": "011839",
"section": "001",
"name": "전공탐색",
"course_type_code": "1E",
"course_type_name": "공필",
"credits": "1.0",
"hours": "1.0 / 0 / 1",
"total_hours": "1",
"schedule": "목19:00-20:00",
"room": "센B104",
"instructor": "홍길동",
"grade_level": "1",
"department_code": "3517",
"department_name": "AI로봇학과",
"year": "2026",
"semester_code": "20",
"extra": { "PLAN_REG_YN": "Y", "YEAR_SMT_NM": "2026/2학기" }
}
]

All fields are strings, empty when missing. extra is a string map of the school fields not listed in the table below.

Field School key Meaning
course_number CURI_NO Course number
section CLASS Section
name CURI_NM Course name
course_type_code, course_type_name CURI_TYPE_CD, CURI_TYPE_CD_NM Course type code and name
domain_code, domain_name SLT_DOMAIN_CD, SLT_DOMAIN_CD_NM Selective domain code and name
credits CDT Credits (for example 3.0)
hours TM_NUM Hours, as the school writes them (for example 3.0 / 3 / 0)
total_hours TOT_TM_NUM Total hours
schedule LESN_TIME Class time (for example 화13:00-15:00)
room LESN_ROOM Classroom
instructor LESN_EMP Instructor name
grade_level STUDENT_YEAR Year level
language_code, language_name CURI_LANG_CD, CURI_LANG_NM Teaching language
department_code, department_name DEPT_CD, SCH_DEPT_ALIAS Offering department code and name
managing_department MANAGE_DEPT_NM Managing department
remark REMARK Remark
year, semester_code YEAR, SMT_CD Year and term code
extra other fields Original school fields
  • Cached for one day (86400 seconds by default) per combination of conditions, with one school request per call.
  • School-side failures (connection, timeout, bad response, _SUBMIT_ERROR_) return the last cached value or an empty list. With no cache, the same call returns an empty list without a request for failure_cache_seconds (default 60).
  • lectures never raises because of its filter values.
  • An empty list cannot tell “no course matches” from “a problem on the school side”.
  • Unofficial endpoint. Behavior such as the filter-key requirement changes if the school changes it.
  • The language filter is fixed to LANG_CHK="KOR".
  • An answer with all conditions empty is several MB, and one cache entry stays in memory for cache_ttl_seconds. If you do not need everything, query one department at a time.
  • The instructor syllabus is not provided. Its form carries the instructor’s name and contact lines, so it is left out of the default scope. The course overview is available as overview in Curriculum.
  • Contract source: spec/PUBLIC_DATA.md
// Lectures of one department (term code 20 = 2nd semester, course name and instructor left empty)
List<Department> departments = publicData.departments("20", "2026", "20");
List<Lecture> lectures = publicData.lectures("20", "2026", "20", departments.get(0).getCode(), "", "");
// Search by course name only
List<Lecture> byName = publicData.lectures("20", "2026", "20", "", "알고리즘", "");

With a lecture’s course_number and department_code you can look up the suggested year, term and course overview from that department’s curriculum (Curriculum).